122 #if defined(WIN32) || defined(WIN64) 123 #define snprintf(dst, ...) _snprintf_s((dst), _countof(dst), __VA_ARGS__) 173 printf(
"Descriptor type is PCAP.\n");
177 printf(
"Descriptor type is NT.\n");
181 printf(
"Descriptor type is NT extended.\n");
185 printf(
"Descriptor type is Dynamic\n");
190 printf(
"Unknown descriptor type.\n");
210 streamId = (uint32_t) port;
211 printf(
"Created PacketReaderThread, port=%lu, stream=%u\n", rxPort, streamId);
224 printf(
"NT_NetRxOpen() failed: %s\n", errorBuffer);
229 printf(
"Receiving packets on stream %u\n", streamId);
235 printf(
"-------------------------------------------------\n");
236 printf(
"Packet received:\n");
242 printf(
"Error: RX descriptor expected to be NT_PACKET_DESCRIPTOR_TYPE_NT\n");
243 printf(
" Shutting down...\n");
249 if (captureLength < (16 + 80 + 2 + 8))
251 printf(
"Packet is too small. Can't extract time stamp\n");
256 uint64_t txTime = *((uint64_t*)(data + 80 + 2));
260 printf(
"No TX time stamp in packet.\n");
265 printf(
"txTime=%lu, rxTime=%lu, latency=%lu\n", txTime, rxTime, rxTime - txTime);
269 uint64_t
wireLength = NT_NET_GET_PKT_WIRE_LENGTH(hNetBuf);
272 if ((g % 16) == 0) printf(
"\n");
273 printf(
"%02X ", *(data + g));
278 else if ((status != NT_STATUS_TIMEOUT) && (status != NT_STATUS_TRYAGAIN))
281 printf(
"NT_NetRxGet() failed: %s\n", errorBuffer);
306 0x94, 0xC6, 0x91, 0x1C, 0x68, 0x1D, 0x94, 0xC6, 0x91, 0x1C, 0x68, 0xC3, 0x08, 0x00, 0x45, 0x00,
307 0x00, 0x78, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 0xB5, 0xCF, 0xC0, 0xA8, 0x00, 0x02, 0x01, 0x02,
308 0x03, 0x04, 0x00, 0x14, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
309 0x20, 0x00, 0x42, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
330 uint64_t transmittedPackets {0};
336 const unsigned char NO_TS_INJECT = 0;
337 const unsigned char TS_INJECT = 1;
340 const unsigned char FCS_GOOD = 0;
341 const unsigned char FCS_BAD = 1;
342 const unsigned char FCS_RESERVED = 2;
343 const unsigned char FCS_UNCHANGED = 3;
346 printf(
"Created PacketTransmitterThread port=%u\n", txPort);
363 uint32_t sleep_time = 1000000;
374 fprintf(stderr,
"NT_NetTxGet() failed: %s\n", errorBuffer);
386 packet_ptr->offset1 = 34;
387 overlay_ptr->frame_type = 0x4;
388 overlay_ptr->checksum_cmd = 0;
390 overlay_ptr->tsiCmd = tsi & 1;
391 overlay_ptr->fcsCmd = fcs & 3;
398 fprintf(stderr,
"NT_NetTxRelease() failed: %s\n", errorBuffer);
402 ++transmittedPackets;
415 printf(
"============================================\n");
416 printf(
"Transmitter configuration\n");
417 printf(
"============================================\n");
418 printf(
"TX port : %u\n", txPort);
419 printf(
"============================================\n");
432 if (status != NT_SUCCESS)
435 fprintf(stderr,
"NT_NetTxOpenAttrSetDescriptorPosFrameType failed: %s\n", errorBuffer);
440 if (status != NT_SUCCESS)
443 fprintf(stderr,
"NT_NetTxOpenAttrSetDescriptorPosChecksumCmd failed: %s\n", errorBuffer);
448 if (status != NT_SUCCESS)
451 fprintf(stderr,
"NT_NetTxOpenAttrSetTxtDescriptorPosTimestampInjectCmd failed: %s\n", errorBuffer);
456 if (status != NT_SUCCESS)
459 fprintf(stderr,
"NT_NetTxOpenAttrSetTxtDescriptorPosFcs failed: %s\n", errorBuffer);
465 if (status != NT_SUCCESS) {
467 fprintf(stderr,
"NT_NetTxOpen() failed: %s\n", errorBuffer);
472 while (
running && txLoops != 0)
474 if (txLoops > 0) --txLoops;
477 txPacket(hNetTx, NO_TS_INJECT, FCS_UNCHANGED);
478 txPacket(hNetTx, NO_TS_INJECT, FCS_GOOD);
479 txPacket(hNetTx, NO_TS_INJECT, FCS_BAD);
480 txPacket(hNetTx, TS_INJECT, FCS_UNCHANGED);
481 txPacket(hNetTx, TS_INJECT, FCS_GOOD);
482 txPacket(hNetTx, TS_INJECT, FCS_BAD);
485 printf(
"Packets transmitted %lu\n ", transmittedPackets);
486 printf(
"Shutting down TX\n");
491 fprintf(stderr,
"NT_NetTxClose() failed: %s\n", errorBuffer);
512 NT_ExplainError(status, errorBuffer, (uint32_t)(
sizeof(errorBuffer)-1));
515 fprintf(stderr, formatstr, errorBuffer);
525 snprintf(ntplStr, 400,
"assign[streamid=%lu] = Port==%lu", rxPort, rxPort);
528 if ((status =
NT_ConfigOpen(&hCfgStream,
"flowtest")) != NT_SUCCESS) {
529 printError(status,
"NT_ConfigOpen() failed: %s\n");
533 printf(
"\nDoing NTPL:\n");
535 printf(
"%s\n\n", ntplStr);
552 if ((status =
NT_InfoOpen(&hInfo,
"tsi")) != NT_SUCCESS) {
554 fprintf(stderr,
"NT_InfoOpen() failed: %s\n", errorBuffer);
561 if ((status =
NT_InfoRead(hInfo, &infoRead)) != NT_SUCCESS) {
563 fprintf(stderr,
"NT_InfoRead() failed: %s\n", errorBuffer);
584 static void usage(
const char *argv0)
586 fprintf(stderr,
"\n");
587 fprintf(stderr,
"Usage: %s [options]\n", argv0);
588 fprintf(stderr,
"\n");
589 fprintf(stderr,
"This program is an example of how to control TX time stamp inject\n");
590 fprintf(stderr,
"and FCS generation per packet using dynamic descriptor 3.\n");
591 fprintf(stderr,
"\n");
592 fprintf(stderr,
" Options:\n" 593 " -r <rx port> : RX port.\n" 594 " -t <tx port> : TX port.\n" 595 " -n <tx loops> : Number of TX loops\n" 596 " -h : Print help message\n");
597 fprintf(stderr,
"\n");
600 int main(
int argc,
char **argv)
603 int64_t txLoops = -1;
606 uint64_t txActive =
false;
607 uint64_t rxActive =
false;
613 while ((opt = getopt(argc, argv,
"n:t:r:")) != -1) {
616 rxPort = strtoul(optarg, &endptr, 10);
618 if (*optarg ==
'\0' || *endptr !=
'\0') {
619 fprintf(stderr,
"Could not parse RX port, i.e. -r option\n");
624 txPort = strtoul(optarg, &endptr, 10);
626 if (*optarg ==
'\0' || *endptr !=
'\0') {
627 fprintf(stderr,
"Could not parse TX port, i.e. -t option\n");
632 txLoops = strtol(optarg, &endptr, 10);
633 if (*optarg ==
'\0' || *endptr !=
'\0') {
634 fprintf(stderr,
"Could not parse number of TX loops, , i.e. -n option\n");
654 printf(
"\nRequired Test&Measurement features not supported on port %lu\n", txPort);
668 if (rxThread ==
nullptr && txThread ==
nullptr)
670 printf(
"\nUse at least one of the options -t, -r\n");
674 if (rxThread !=
nullptr)
681 if (txThread !=
nullptr)
686 printf(
"Threads started. Press CTRL-C to terminate program.\n");
692 if (txThread !=
nullptr)
697 if (rxThread !=
nullptr &&
running)
699 printf(
"TX thread stopped. Use CTRL-C to terminate RX thread\n");
703 if (rxThread !=
nullptr)