179 #if defined(__linux__) || defined(__FreeBSD__) 182 #elif defined(WIN32) || defined(WIN64) 184 #include <winsock2.h> 185 #define strtoll _strtoi64 192 #define MIN_PACKET_SIZE 64 // Minimum packet size to transmit 193 #define MAX_PACKET_SIZE 8192 // Maximum packet size to transmit 194 #define SEGMENT_LENGTH (1024*1024) // Segment size to transmit 197 #define RANDOM(_min_, _max_) ((uint32_t)_min_ + (uint32_t)((_max_-_min_+1) * (rand() /(RAND_MAX + 1.0)))) 206 "transmit_multifunction [-h][-p <port no.>][-r <tx rate>][-s <size>|r|i|d]\n" 222 "<rate> = <rate> Mbps\n" 223 "<rate>K = <rate> Kbps\n" 224 "<rate>M = <rate> Mbps\n" 225 "<rate>G = <rate> Gbps", NULL, 0, 0,
"value"),
226 OPT_STRING(
's',
"size", &
opt_size,
"Packet size - <value> = packet size (Size is aligned to 4 byte boundary\n" 228 "i = increasing size from 64 bytes to 8192 bytes.\n" 229 "d = decreasing size from 8192 bytes to 64 bytes.", NULL, 0, 0,
"value"),
236 #if defined(WIN32) || defined (WIN64) 258 (void)memset(&infoRead, 0,
sizeof(
NtInfo_t));
283 uint64_t oldRateLimit = 0;
289 fprintf(stderr,
"NT_ConfigOpen failed: %s\n", errorBuffer);
294 (void)memset(&configRead, 0,
sizeof(configRead));
306 if (status == NT_SUCCESS) {
316 fprintf(stderr,
"NT_ConfigRead/Write failed: %s\n", errorBuffer);
321 if (status == NT_SUCCESS && pOld != NULL)
322 *pOld = oldRateLimit;
337 if (status == NT_SUCCESS) {
344 if (nHbSizeAvail == nHbSizeTotal && nHbSizeRel == 0 && nHbSizeDeq == 0) {
350 fprintf(stderr,
"NT_NetTxRead failed: %s\n", errorBuffer);
354 #if defined(__linux__) || defined(__FreeBSD__) 356 #elif defined(WIN32) || defined(WIN64) 368 int main(
int argc,
const char *argv[])
378 uint32_t payload = 0;
380 uint32_t txPacketSize;
381 uint32_t segmentsSent = 0;
382 uint64_t packetsSent = 0;
394 int timestamp64BitSupport;
395 uint32_t maxPacketsInSegment;
396 uint32_t maxPacketsInAdapter;
399 void *seg_hdr_ptr[
NUM_MB];
400 uint32_t packetsInSegment[
NUM_MB];
401 const int min_hb_size_in_mb =
NUM_MB;
404 printf(
"\nNapatech example: Segment based transmit\n");
405 printf(
"----------------------------------------\n\n");
407 (void)memset(seg_hdr_ptr, 0,
sizeof(seg_hdr_ptr));
408 (void)memset(packetsInSegment, 0,
sizeof(packetsInSegment));
411 #if defined(WIN32) || defined (WIN64) 414 struct sigaction newaction;
415 memset(&newaction, 0,
sizeof(newaction));
417 if (sigaction(SIGINT, &newaction, NULL) < 0) {
418 fprintf(stderr,
"Failed to register SIGINT sigaction.\n");
432 txRate=strtoll(
opt_rate, &endptr, 0);
433 len = (int)strlen(endptr);
436 fprintf(stderr,
"\"-r %s\" is not valid.\n",
opt_rate);
458 fprintf(stderr,
"\"-r %s\" is not valid.\n",
opt_rate);
469 fprintf(stderr,
">>> Error: Illegal packet size: %d\n", txSize);
491 if (txRate < 10000000 && txRate != 0) {
500 maxPacketsInSegment = (uint32_t)(txRate / 1000);
501 maxPacketsInAdapter = 3 * maxPacketsInSegment;
506 maxPacketsInSegment = 0xFFFFFFFF;
507 maxPacketsInAdapter = 0xFFFFFFFF;
511 printf(
"Transmit port: %d\n", txPort);
513 printf(
"Transmit Rate: Line rate\n");
516 printf(
"Transmit Rate: %llu bits/second\n", (
unsigned long long int)txRate);
520 printf(
"Transmit size: %d bytes\n\n", txSize);
521 printf(
"The program will pre-fill/reuse %d TX segments to save CPU.\n",
NUM_MB);
541 fprintf(stderr,
"NT_Init() failed: %s\n", errorBuffer);
549 fprintf(stderr,
"NT_InfoOpen failed: %s\n", errorBuffer);
556 if ((status =
NT_InfoRead(hInfo, &infoRead)) != 0) {
559 fprintf(stderr,
"NT_InfoRead failed: %s\n", errorBuffer);
569 fprintf(stderr,
"Transmit is not possible on the selected port %d\n", txPort);
583 fprintf(stderr,
"Port %d is down.\n", txPort);
592 if (timestamp64BitSupport == 0 && txRate < 1000000) {
593 fprintf(stderr,
"The adapter does not support %lld bits/second\n", (
long long int)txRate);
598 if ((status =
NT_StatOpen(&hStatStream,
"ExampleStat")) != NT_SUCCESS) {
601 fprintf(stderr,
"NT_StatOpen() failed: %s\n", errorBuffer);
609 if ((status =
NT_StatRead(hStatStream, &hStat)) != NT_SUCCESS) {
612 fprintf(stderr,
"NT_StatRead() failed: %s\n", errorBuffer);
623 if (status != NT_SUCCESS) {
626 fprintf(stderr,
"NT_NetTxOpen() failed: %s\n", errorBuffer);
635 int bTxPortRateLimitSet = 0;
636 if (is4GATxSupported && txRate > 0) {
638 bTxPortRateLimitSet = status == NT_SUCCESS;
640 const size_t ntDescrLength =
644 while (status == NT_SUCCESS &&
appRunning==1) {
648 if (status == NT_STATUS_TIMEOUT) {
652 if (status != NT_SUCCESS) {
655 fprintf(stderr,
"NT_NetTxGet() failed: %s\n", errorBuffer);
659 reuse_idx = segmentsSent %
NUM_MB;
663 seg_hdr_ptr[reuse_idx] == NULL ) {
669 packetsInSegment[reuse_idx] = 0;
672 if (is4GATxSupported) {
673 NT_NET_SET_PKT_CLEAR_DESCR_NT((&pktNetBuf));
674 NT_NET_SET_PKT_DESCR_TYPE_NT((&pktNetBuf));
680 NT_NET_SET_PKT_RECALC_L2_CRC((&pktNetBuf), 1);
681 NT_NET_SET_PKT_TXPORT((&pktNetBuf), txPort);
687 if (packetsInSegment[reuse_idx] < maxPacketsInSegment) {
690 if (is4GATxSupported) {
693 NT_NET_SET_PKT_CAP_LENGTH((&pktNetBuf), (uint16_t)currentPacketSize);
695 NT_NET_SET_PKT_WIRE_LENGTH((&pktNetBuf), (uint16_t)currentPacketSize);
696 if (bTxPortRateLimitSet || txRate == 0) {
698 NT_NET_SET_PKT_TXNOW((&pktNetBuf), 1);
705 ts += (((uint64_t)NT_NET_GET_PKT_WIRE_LENGTH((&pktNetBuf))+20ULL)*8ULL*1000000000ULL)/txRate;
707 tsR+=((((((uint64_t)NT_NET_GET_PKT_WIRE_LENGTH((&pktNetBuf))+20ULL)*8ULL*1000000000ULL)/txRate)+9)/10)*10;
715 ts += (((uint64_t)NT_NET_GET_PKT_WIRE_LENGTH((&pktNetBuf))+20ULL)*8ULL*1000000000ULL)/txRate;
717 tsR+=((((((uint64_t)NT_NET_GET_PKT_WIRE_LENGTH((&pktNetBuf))+20ULL)*8ULL*1000000000ULL)/txRate)+9)/10)*10;
724 if (firstPacket == 0) {
730 NT_NET_SET_PKT_TXNOW((&pktNetBuf), 0);
731 NT_NET_SET_PKT_TXSETCLOCK((&pktNetBuf), 1);
736 NT_NET_SET_PKT_TXNOW((&pktNetBuf), 1);
744 for (i = 0; i < currentPacketSize/4; i++) {
749 packetsInSegment[reuse_idx]++;
756 currentPacketSize = txSize;
760 currentPacketSize += (uint32_t)
sizeof(uint32_t);
767 currentPacketSize -= (uint32_t)
sizeof(uint32_t);
777 txPacketSize = currentPacketSize;
784 if (is4GATxSupported) {
787 NT_NET_SET_PKT_CAP_LENGTH((&pktNetBuf), (uint16_t)128);
789 NT_NET_SET_PKT_WIRE_LENGTH((&pktNetBuf), (uint16_t)128);
790 NT_NET_SET_PKT_TXIGNORE((&pktNetBuf), 1);
798 if (spaceLeftInSegment == txPacketSize + ntDescrLength) {
806 if (spaceLeftInSegment < (txPacketSize + ntDescrLength) + (64 + ntDescrLength)) {
807 if (spaceLeftInSegment > 0) {
811 if (is4GATxSupported) {
812 NT_NET_SET_PKT_CLEAR_DESCR_NT((&pktNetBuf));
813 NT_NET_SET_PKT_DESCR_TYPE_NT((&pktNetBuf));
819 spaceLeftInSegment -= ntDescrLength;
822 if (is4GATxSupported) {
825 NT_NET_SET_PKT_CAP_LENGTH((&pktNetBuf), (uint16_t)spaceLeftInSegment);
827 NT_NET_SET_PKT_WIRE_LENGTH((&pktNetBuf), (uint16_t)spaceLeftInSegment);
831 NT_NET_SET_PKT_TXIGNORE((&pktNetBuf), 1);
842 if (seg_hdr_ptr[reuse_idx] == NULL) {
844 seg_hdr_ptr[reuse_idx] = (
void *)hNetBufTx->hHdr;
847 assert(seg_hdr_ptr[reuse_idx] == hNetBufTx->hHdr);
855 fprintf(stderr,
"NT_NetTxRelease() failed: %s\n", errorBuffer);
861 packetsSent += packetsInSegment[reuse_idx];
863 if (((segmentsSent & 0xF) == 0) || (txRate < 10000000)) {
864 printf(
"Sent: %8d segments\r", segmentsSent);
868 if (maxPacketsInSegment != 0xFFFFFFFF) {
880 if ((status =
NT_StatRead(hStatStream, &hStat)) != NT_SUCCESS) {
883 fprintf(stderr,
"NT_StatRead() failed: %s\n", errorBuffer);
892 if (status == NT_SUCCESS) {
901 printf(
"\n\nSent: %d segments and %llu packets\n\n", segmentsSent, (
long long int)packetsSent);
912 if (bTxPortRateLimitSet) {