46 #if defined(__linux__) || defined(__FreeBSD__) 48 #include <stdatomic.h> 55 #define ONEMBIT (1000000ULL) 62 "replay4ga_largefile_example [-h][-p <port no.>][-f <file name>]\n" 63 "Example: replay4ga_largefile_example -p 1 -f mycapture.cap\n",
70 #if defined(WIN32) || defined (WIN64) 91 #if defined(WIN32) || defined (WIN64) 108 main(
int argc,
const char **argv)
122 uint64_t firstPacketTS = 0;
123 uint64_t lastPacketTS = 0;
124 uint64_t adapterTS = 0;
125 uint64_t timeDelta = 0;
126 uint64_t timeDeltaAdjust = 0;
128 uint64_t tx_time_for_last_pkt;
129 uint64_t segment_length = 0;
130 uint64_t last_segment_length = 0;
133 uint64_t last_pkt_size = 0;
136 #if defined(WIN32) || defined (WIN64) 139 struct sigaction newaction;
140 memset(&newaction, 0,
sizeof(newaction));
142 if (sigaction(SIGINT, &newaction, NULL) < 0) {
143 fprintf(stderr,
"Failed to register SIGINT sigaction.\n");
152 if ((status =
NT_Init(NTAPI_VERSION)) != NT_SUCCESS) {
155 fprintf(stderr,
"NT_Init() failed: %s\n", errorBuffer);
160 if ((status =
NT_InfoOpen(&hInfo,
"replay")) != NT_SUCCESS) {
162 fprintf(stderr,
"NT_InfoOpen() failed: %s\n", errorBuffer);
169 if ((status =
NT_InfoRead(hInfo, &infoRead)) != NT_SUCCESS) {
171 fprintf(stderr,
"NT_InfoRead() failed: %s\n", errorBuffer);
205 fprintf(stderr,
"BUG: Unhandled port speed\n");
211 fprintf(stderr,
"Port %d has no link\n",
opt_port);
217 fprintf(stderr,
"Transmit is not possible on the selected port %d\n",
opt_port);
226 uint64_t totalSize = 0;
227 uint64_t totalSegments = 0;
233 fprintf(stderr,
"NT_NetFileOpen() failed: %s\n", errorBuffer);
238 if ((status =
NT_NetFileGet(hNetFile, &hNetBufFile)) != NT_SUCCESS) {
239 if (status == NT_STATUS_END_OF_FILE) {
240 fprintf(stderr,
"The file %s has no data\n",
opt_filename);
251 if (status != NT_STATUS_END_OF_FILE) {
253 last_pkt_size = (uint64_t)NT_NET_GET_PKT_WIRE_LENGTH(hNetBufFile) + 20;
258 while (status != NT_STATUS_END_OF_FILE);
264 if ((status =
NT_ConfigOpen(&hConfig,
"replay")) != NT_SUCCESS) {
266 fprintf(stderr,
"NT_ConfigOpen() failed: %s\n", errorBuffer);
275 fprintf(stderr,
"NT_NetFileOpen() failed: %s\n", errorBuffer);
279 uint64_t requiredHostbuffer = totalSize / (1024UL * 1024UL);
280 printf(
"Required host buffer: %lu MiB (Actual size: %lu MiB)\n", totalSegments, requiredHostbuffer);
286 fprintf(stderr,
"NT_NetTxOpen() failed: %s\n", errorBuffer);
293 if ((status =
NT_ConfigRead(hConfig, &configRead)) != NT_SUCCESS) {
295 fprintf(stderr,
"NT_ConfigRead() failed: %s\n", errorBuffer);
302 tx_time_for_last_pkt = (last_pkt_size * 8U * 100000000ULL) / speed;
303 timeDeltaAdjust = lastPacketTS - firstPacketTS + tx_time_for_last_pkt;
306 timeDelta = (adapterTS - firstPacketTS) + 10000000000UL;
307 printf(
"Transfer starts in 10 seconds from now\n");
316 if ((status =
NT_ConfigWrite(hConfig, &configWrite)) != NT_SUCCESS) {
318 fprintf(stderr,
"NT_ConfigWrite() failed: %s\n", errorBuffer);
323 printf(
"Capture file duration: %.01fs\n", (
double)timeDeltaAdjust / 1000000000);
324 printf(
"NOTICE: First repetition may be slower than capture rate!\n");
327 if (netBufs == NULL) {
328 fprintf(stderr,
"Could not allocate tx segment pointer array\n");
332 for (uint32_t i = 0; i < totalSegments; i++) {
333 if ((status =
NT_NetFileGet(hNetFile, &hNetBufFile)) != NT_SUCCESS) {
336 fprintf(stderr,
"NT_NetFileGet() failed: %s\n", errorBuffer);
343 fprintf(stderr,
"NT_NetTxGet() failed: %s\n", errorBuffer);
347 if (i == totalSegments - 1)
357 fprintf(stderr,
"NT_NetFileRelease() failed: %s\n", errorBuffer);
366 fprintf(stderr,
"NT_NetTxRelease() failed: %s\n", errorBuffer);
386 for (uint32_t i = 0; i < totalSegments; i++) {
390 uint64_t segmentLen = i + 1 == totalSegments ? last_segment_length : segment_length;
393 if ((status != NT_SUCCESS) && (status != NT_STATUS_TIMEOUT)) {
396 fprintf(stderr,
"NT_NetFileGet() failed: %s\n", errorBuffer);
399 }
while (status == NT_STATUS_TIMEOUT);
402 NT_NET_SET_PKT_TXSETCLOCK(hNetBufTx, 1);
409 fprintf(stderr,
"NT_NetTxRelease() failed: %s\n", errorBuffer);
424 if ((status =
NT_ConfigWrite(hConfig, &configWrite)) != NT_SUCCESS) {
426 fprintf(stderr,
"NT_ConfigWrite() failed: %s\n", errorBuffer);