summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
523f3d8)
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>
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, "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");
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");
- 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);
+ }
case 'P':
if (optarg[0] == 'l')
case 'P':
if (optarg[0] == 'l')
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, "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");
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");
- 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);
+ }
case 'P':
if (optarg[0] == 'l')
case 'P':
if (optarg[0] == 'l')