46 #if defined(__linux__) || defined(__FreeBSD__) || (__MINGW32__) 48 #include <stdatomic.h> 59 #define ONEMBIT (1000000ULL) 66 "replay4ga_loop_example [-h][-p <port no.>][-f <file name>][-n <number of iterations> [-s <replay speed in % of capture>]\n" 67 "Example: replay4ga_loop_example -p 1 -f mycapture.cap -n 10 -s 200\n",
76 #if defined(WIN32) || defined (WIN64) 90 OPT_INTEGER(
's',
"scale", &
opt_scale,
"Replay speed in % of captured speed\n", NULL, 0, 0,
"value"),
98 #if defined(WIN32) || defined (WIN64) 124 switch (data->tsType) {
132 return data->nativeUnixTs * 10;
137 main(
int argc,
const char **argv)
154 uint64_t firstPacketTS = 0;
155 uint64_t lastPacketTS = 0;
156 uint64_t adapterTS = 0;
157 uint64_t adapterEndTS = 0;
158 uint64_t timeDelta = 0;
159 uint64_t timeDeltaAdjust = 0;
161 uint64_t tx_time_for_last_pkt;
165 int set_tx_clock = 1;
166 unsigned last_pkt_size = 0;
169 #if defined(WIN32) || defined (WIN64) 172 struct sigaction newaction;
173 memset(&newaction, 0,
sizeof(newaction));
175 if (sigaction(SIGINT, &newaction, NULL) < 0) {
176 fprintf(stderr,
"Failed to register SIGINT sigaction.\n");
192 if ((status =
NT_Init(NTAPI_VERSION)) != NT_SUCCESS) {
195 fprintf(stderr,
"NT_Init() failed: %s\n", errorBuffer);
200 if ((status =
NT_InfoOpen(&hInfo,
"replay")) != NT_SUCCESS) {
202 fprintf(stderr,
"NT_InfoOpen() failed: %s\n", errorBuffer);
209 if ((status =
NT_InfoRead(hInfo, &infoRead)) != NT_SUCCESS) {
211 fprintf(stderr,
"NT_InfoRead() failed: %s\n", errorBuffer);
242 fprintf(stderr,
"BUG: Unhandled port speed\n");
248 fprintf(stderr,
"Port %d has no link\n",
opt_port);
254 fprintf(stderr,
"Transmit is not possible on the selected port %d\n",
opt_port);
273 fprintf(stderr,
"NT_NetFileOpen() failed: %s\n", errorBuffer);
278 if ((status =
NT_NetFileGet(hNetFile, &hNetBufFile)) != NT_SUCCESS) {
279 if (status == NT_STATUS_END_OF_FILE) {
280 fprintf(stderr,
"The file %s has no data\n",
opt_filename);
289 if (status != NT_STATUS_END_OF_FILE) {
291 last_pkt_size = (unsigned)NT_NET_GET_PKT_WIRE_LENGTH(hNetBufFile) + 20;
294 while (status != NT_STATUS_END_OF_FILE);
302 firstPacketTS = (firstPacketTS / (unsigned)
opt_scale) * 100;
303 lastPacketTS = (lastPacketTS / (unsigned)
opt_scale) * 100;
310 if ((status =
NT_ConfigOpen(&hConfig,
"replay")) != NT_SUCCESS) {
312 fprintf(stderr,
"NT_ConfigOpen() failed: %s\n", errorBuffer);
320 if ((status =
NT_ConfigRead(hConfig, &configRead)) != NT_SUCCESS) {
322 fprintf(stderr,
"NT_ConfigRead() failed: %s\n", errorBuffer);
336 tx_time_for_last_pkt = (last_pkt_size * 8U * 100000000ULL) / speed;
337 timeDeltaAdjust = lastPacketTS - firstPacketTS + tx_time_for_last_pkt;
340 timeDelta = (adapterTS - firstPacketTS) + 1000000000 - timeDeltaAdjust;
343 adapterEndTS = adapterTS + 2000000000 + (lastPacketTS - firstPacketTS) * (uint64_t)
opt_num_repetitions;
352 if ((status =
NT_ConfigWrite(hConfig, &configWrite)) != NT_SUCCESS) {
354 fprintf(stderr,
"NT_ConfigWrite() failed: %s\n", errorBuffer);
363 fprintf(stderr,
"NT_NetFileOpen() failed: %s\n", errorBuffer);
371 fprintf(stderr,
"NT_NetTxOpen() failed: %s\n", errorBuffer);
380 if ((status =
NT_NetFileGet(hNetFile, &hNetBufFile)) != NT_SUCCESS) {
381 if (status == NT_STATUS_END_OF_FILE) {
390 fprintf(stderr,
"NT_NetFileGet() failed: %s\n", errorBuffer);
397 if ((status != NT_SUCCESS) && (status != NT_STATUS_TIMEOUT)) {
400 fprintf(stderr,
"NT_NetFileGet() failed: %s\n", errorBuffer);
403 }
while (status == NT_STATUS_TIMEOUT);
412 NT_NET_SET_PKT_TXSETCLOCK(hNetBufTx, 1);
423 numBytes += NT_NET_GET_PKT_WIRE_LENGTH((&pktNetBuf));
441 fprintf(stderr,
"NT_NetTxRelease() failed: %s\n", errorBuffer);
448 fprintf(stderr,
"NT_NetFileRelease() failed: %s\n", errorBuffer);
454 printf(
"Done scheduling packets - Waiting for completion...\n");
461 if ((status =
NT_ConfigRead(hConfig, &configRead)) != NT_SUCCESS) {
463 fprintf(stderr,
"NT_ConfigRead() failed: %s\n", errorBuffer);
471 if (adapterTS > adapterEndTS) {
492 if ((status =
NT_ConfigWrite(hConfig, &configWrite)) != NT_SUCCESS) {
494 fprintf(stderr,
"NT_ConfigWrite() failed: %s\n", errorBuffer);
503 printf(
"Done: %d packets %d bytes replayed\n", numPackets, numBytes);