Added option '-l' to disable local loopback for generated data.
authorOliver Hartkopp <socketcan@hartkopp.net>
Fri, 22 Jun 2007 08:04:48 +0000 (08:04 +0000)
committerOliver Hartkopp <socketcan@hartkopp.net>
Fri, 22 Jun 2007 08:04:48 +0000 (08:04 +0000)
cangen.c

index 999b0c2..0df4398 100644 (file)
--- a/cangen.c
+++ b/cangen.c
@@ -77,19 +77,21 @@ void print_usage(char *prg)
 {
     fprintf(stderr, "\n%s: generate random CAN frames\n\n", prg);
     fprintf(stderr, "Usage: %s [can-interface]\n", prg);
-    fprintf(stderr, "Options: -g <ms>       (gap in milli seconds)  "
+    fprintf(stderr, "Options: -g <ms>       (gap in milli seconds)   "
            "default: %d\n", DEFAULT_GAP);
-    fprintf(stderr, "         -e            (extended frame mode)   "
+    fprintf(stderr, "         -e            (extended frame mode)    "
            "default: standard frame format \n");
-    fprintf(stderr, "         -I            (fixed CAN ID)          "
+    fprintf(stderr, "         -I            (fixed CAN ID)           "
            "default: 0x123\n");
-    fprintf(stderr, "         -D            (fixed CAN Data)        "
+    fprintf(stderr, "         -D            (fixed CAN Data)         "
            "default: 01 23 45 67 89 AB CD EF\n");
-    fprintf(stderr, "         -L            (fixed CAN DLC)         "
+    fprintf(stderr, "         -L            (fixed CAN DLC)          "
            "default: 8\n");
-    fprintf(stderr, "         -f <canframe> (other fixed CAN frame) "
+    fprintf(stderr, "         -f <canframe> (other fixed CAN frame)  "
            "default: 123#0123456789ABCDEF\n");
-    fprintf(stderr, "         -v            (verbose)               "
+    fprintf(stderr, "         -l            (local loopback disable) "
+           "default: loopback\n");
+    fprintf(stderr, "         -v            (verbose)                "
            "default: don't print sent frames\n");
 }
 
@@ -106,6 +108,7 @@ int main(int argc, char **argv)
     unsigned char fix_data = 0;
     unsigned char fix_dlc = 0;
     unsigned char default_frame = 1;
+    unsigned char loopback_disable = 0;
     unsigned char verbose = 0;
 
     int opt;
@@ -122,7 +125,7 @@ int main(int argc, char **argv)
     signal(SIGHUP, sigterm);
     signal(SIGINT, sigterm);
 
-    while ((opt = getopt(argc, argv, "g:eIDLf:v")) != -1) {
+    while ((opt = getopt(argc, argv, "g:eIDLf:lv")) != -1) {
        switch (opt) {
        case 'g':
            gap = strtoul(optarg, NULL, 10);
@@ -156,6 +159,10 @@ int main(int argc, char **argv)
            verbose = 1;
            break;
 
+       case 'l':
+           loopback_disable = 1;
+           break;
+
        default:
            print_usage(basename(argv[0]));
            exit(1);
@@ -210,6 +217,13 @@ int main(int argc, char **argv)
     /* little (really a very little!) CPU usage.                          */
     setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
 
+    if (loopback_disable) {
+       int loopback = 0;
+
+       setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK,
+                  &loopback, sizeof(loopback));
+    }
+
     if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("bind");
        return 1;