latester: Support single interface operation
authorMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 9 Dec 2010 23:37:18 +0000 (00:37 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 9 Dec 2010 23:37:18 +0000 (00:37 +0100)
latester only generates traffic and does not measure anything. This is
planned to be used for CAN load generator.

latester/latester.c

index d5d7b4b..fb299aa 100644 (file)
@@ -163,12 +163,14 @@ void msg_info_print(FILE *f, struct msg_info *mi)
 #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),
@@ -177,6 +179,8 @@ void msg_info_print(FILE *f, struct msg_info *mi)
                        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++;
@@ -192,14 +196,18 @@ int msg_info_store(FILE *f, struct msg_info *mi)
 #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);
@@ -242,16 +250,22 @@ void dbg_print_timespec(char *msg, struct timespec *tv)
 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;
 }
 
@@ -388,7 +402,7 @@ int send_frame(int socket)
        ret = write(socket, &frame, sizeof(frame));
        trace_off(ret);
 
-       if (ret == -1)
+       if (ret == -1 || num_interfaces == 1)
                msg_info_free(mi);
        return ret;
 }
@@ -661,8 +675,8 @@ int parse_options(int argc, const char *argv[])
                      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");
@@ -696,7 +710,10 @@ int parse_options(int argc, const char *argv[])
 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);
        }
 }