]> rtime.felk.cvut.cz Git - can-utils.git/commitdiff
isotp[send|recv]: change command line option for padding bytes
authorOliver Hartkopp <socketcan@hartkopp.net>
Thu, 20 Nov 2014 22:13:37 +0000 (23:13 +0100)
committerOliver Hartkopp <socketcan@hartkopp.net>
Thu, 20 Nov 2014 22:13:37 +0000 (23:13 +0100)
Allow to specify the TX and RX padding content separately.
Due to the optional values it is possible to provide either TX or RX values
which enables and set the given values.

-p 55:AA => TX padding 0x55, RX padding 0xAA
-p 55    => TX padding 0x55
-p 55:   => TX padding 0x55
-p :AA   => RX padding 0xAA

Additionally the comment for the -P <mode> option was updated to point out the
checking mode of the padding in the received PDUs (rx padding).

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
isotprecv.c
isotpsend.c

index 2e0e81b5d8d2ca5d5e43f4ef105c793f951e7688..5c4f2a5f11ceca33805b0fdca805e1af75c12578 100644 (file)
@@ -64,8 +64,8 @@ void print_usage(char *prg)
        fprintf(stderr, "Options: -s <can_id>  (source can_id. Use 8 digits for extended IDs)\n");
        fprintf(stderr, "         -d <can_id>  (destination can_id. Use 8 digits for extended IDs)\n");
        fprintf(stderr, "         -x <addr>[:<rxaddr>] (extended addressing / opt. separate rxaddr)\n");
-       fprintf(stderr, "         -p <byte>    (set and enable padding byte)\n");
-       fprintf(stderr, "         -P <mode>    (check padding in SF/CF. (l)ength (c)ontent (a)ll)\n");
+       fprintf(stderr, "         -p [tx]:[rx] (set and enable tx/rx padding bytes)\n");
+       fprintf(stderr, "         -P <mode>    (check rx padding for (l)ength (c)ontent (a)ll)\n");
        fprintf(stderr, "         -b <bs>      (blocksize. 0 = off)\n");
        fprintf(stderr, "         -m <val>     (STmin in ms/ns. See spec.)\n");
        fprintf(stderr, "         -f <time ns> (force rx stmin value in nanosecs)\n");
@@ -128,9 +128,24 @@ int main(int argc, char **argv)
            }
 
            case 'p':
-                   opts.flags |= CAN_ISOTP_RX_PADDING;
-                   opts.rxpad_content = strtoul(optarg, (char **)NULL, 16) & 0xFF;
+           {
+                   int elements = sscanf(optarg, "%hhx:%hhx",
+                                         &opts.txpad_content,
+                                         &opts.rxpad_content);
+
+                   if (elements == 1)
+                           opts.flags |= CAN_ISOTP_TX_PADDING;
+                   else if (elements == 2)
+                           opts.flags |= (CAN_ISOTP_TX_PADDING | CAN_ISOTP_RX_PADDING);
+                   else if (sscanf(optarg, ":%hhx", &opts.rxpad_content) == 1)
+                           opts.flags |= CAN_ISOTP_RX_PADDING;
+                   else {
+                           printf("incorrect padding values '%s'.\n", optarg);
+                           print_usage(basename(argv[0]));
+                           exit(0);
+                   }
                    break;
+           }
 
            case 'P':
                    if (optarg[0] == 'l')
index eb8de69ee0a9a1703ba2add6c11838b7e5ecf6ff..e0256cb9083ecd025ed53a84b31d5d68cb52c70d 100644 (file)
@@ -64,8 +64,8 @@ void print_usage(char *prg)
        fprintf(stderr, "Options: -s <can_id>  (source can_id. Use 8 digits for extended IDs)\n");
        fprintf(stderr, "         -d <can_id>  (destination can_id. Use 8 digits for extended IDs)\n");
        fprintf(stderr, "         -x <addr>[:<rxaddr>] (extended addressing / opt. separate rxaddr)\n");
-       fprintf(stderr, "         -p <byte>    (set and enable padding byte)\n");
-       fprintf(stderr, "         -P <mode>    (check padding in FC. (l)ength (c)ontent (a)ll)\n");
+       fprintf(stderr, "         -p [tx]:[rx] (set and enable tx/rx padding bytes)\n");
+       fprintf(stderr, "         -P <mode>    (check rx padding for (l)ength (c)ontent (a)ll)\n");
        fprintf(stderr, "         -t <time ns> (frame transmit time (N_As) in nanosecs)\n");
        fprintf(stderr, "         -f <time ns> (ignore FC and force local tx stmin value in nanosecs)\n");
        fprintf(stderr, "         -D <len>     (send a fixed PDU with len bytes - no STDIN data)\n");
@@ -125,9 +125,24 @@ int main(int argc, char **argv)
            }
 
            case 'p':
-                   opts.flags |= CAN_ISOTP_TX_PADDING;
-                   opts.txpad_content = strtoul(optarg, (char **)NULL, 16) & 0xFF;
+           {
+                   int elements = sscanf(optarg, "%hhx:%hhx",
+                                         &opts.txpad_content,
+                                         &opts.rxpad_content);
+
+                   if (elements == 1)
+                           opts.flags |= CAN_ISOTP_TX_PADDING;
+                   else if (elements == 2)
+                           opts.flags |= (CAN_ISOTP_TX_PADDING | CAN_ISOTP_RX_PADDING);
+                   else if (sscanf(optarg, ":%hhx", &opts.rxpad_content) == 1)
+                           opts.flags |= CAN_ISOTP_RX_PADDING;
+                   else {
+                           printf("incorrect padding values '%s'.\n", optarg);
+                           print_usage(basename(argv[0]));
+                           exit(0);
+                   }
                    break;
+           }
 
            case 'P':
                    if (optarg[0] == 'l')