unsigned enobufs;
unsigned overrun;
unsigned lost;
+ struct timespec tic, tac;
} stats;
int num_interfaces = 0;
#define S(ts) tstamp_str(local, &ts)
#define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff))
- if (num_interfaces == 2)
+ switch (num_interfaces) {
+ case 2:
fprintf(f, "%ld: %s %s -> %s (%s) %s = %s (%s)\n",
num, S(mi->ts_sent), sent, S(mi->ts_rx_final_kern), S(mi->ts_rx_final), received,
DIFF(mi->ts_sent, mi->ts_rx_final_kern),
DIFF(mi->ts_sent, mi->ts_rx_final));
- else
+ break;
+ case 3:
fprintf(f, "%ld: %s %s -> %s (%s) -> %s (%s) %s = %s (%s), %s (%s)\n",
num, S(mi->ts_sent), sent,
S(mi->ts_rx_onwire_kern), S(mi->ts_rx_onwire),
DIFF(mi->ts_sent, mi->ts_rx_onwire),
DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern),
DIFF(mi->ts_rx_onwire, mi->ts_rx_final));
+ break;
+ }
#undef S
#undef DIFF
num++;
#define S(ts) tstamp_str(local, &ts)
#define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff))
- if (num_interfaces == 2)
+ switch (num_interfaces) {
+ case 2:
fprintf(f, "%ld %d %d %s\n",
num, mi->id, mi->length,
DIFF(mi->ts_sent, mi->ts_rx_final_kern));
- else
+ break;
+ case 3:
fprintf(f, "%ld %d %d %s\n",
num, mi->id, mi->length,
DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern));
+ break;
+ }
#undef S
#undef DIFF
talloc_free (local);
static inline unsigned get_msg_latency_us(struct msg_info *mi)
{
struct timespec diff;
- if (num_interfaces == 3)
+ switch (num_interfaces) {
+ case 2:
if (opt.userhist)
timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_rx_onwire);
else
timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_rx_onwire_kern);
- else
+ break;
+ case 3:
if (opt.userhist)
timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_sent);
else
timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_sent);
+ break;
+ default:
+ return 0;
+ }
return diff.tv_sec * 1000000 + diff.tv_nsec/1000;
}
ret = write(socket, &frame, sizeof(frame));
trace_off(ret);
- if (ret == -1)
+ if (ret == -1 || num_interfaces == 1)
msg_info_free(mi);
return ret;
}
if (opt.oneattime)
SEND();
+ get_tstamp(&stats.tic);
+
while (!finish_flag &&
(opt.count == 0 || count < opt.count || msg_in_progress != 0)) {
}
}
+ get_tstamp(&stats.tac);
+
for (i=0; i<num_interfaces; i++)
close(pfd[i].fd);
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
poptStrerror(c));
- if (num_interfaces < 2 || num_interfaces > 3)
- error(1, 0, "-d option must be given exactly 2 or 3 times");
+ if (num_interfaces < 1 || num_interfaces > 3)
+ error(1, 0, "-d option must only be given one, two or three times");
if (opt.oneattime && opt.period_us)
error(1, 0, "oneattime and period cannot be specified at the same time");
void print_progress()
{
if (! opt.quiet) {
- printf("\rSent %5d, in progress %5d", count, msg_in_progress);
+ if (num_interfaces > 1)
+ printf("\rSent %5d, in progress %5d", count, msg_in_progress);
+ else
+ printf("\rSent %5d", count);
fflush(stdout);
}
}
fclose(opt.f_hist);
fclose(opt.f_msgs);
+
+ fprintf(opt.f_stat, "cmdline='");
+ for (i=0; i<argc; i++)
+ fprintf(opt.f_stat, "%s%s", argv[i], i < argc-1 ? " " : "");
+ fprintf(opt.f_stat, "'\n");
+
+ timespec_subtract(&diff, &stats.tac, &stats.tic);
+ fprintf(opt.f_stat, "duration=%s # seconds\n", tstamp_str(NULL, &diff));
fprintf(opt.f_stat, "sent=%d\n", count);
fprintf(opt.f_stat, "overrun=%d\n", stats.overrun);