From ecf80e8f91e3570978ded0be55f381a7d36109ef Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Wed, 13 Nov 2019 12:32:38 +0100 Subject: [PATCH 1/3] isotpsniffer: Use isprint() instead of manual check --- isotpsniffer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/isotpsniffer.c b/isotpsniffer.c index 8ea2f4b..cc9d196 100644 --- a/isotpsniffer.c +++ b/isotpsniffer.c @@ -44,6 +44,7 @@ #include #include +#include #include #include #include @@ -153,7 +154,7 @@ void printbuf(unsigned char *buffer, int nbytes, int color, int timestamp, if (format & FORMAT_ASCII) { printf("'"); for (i=0; i 0x1F) && (buffer[i] < 0x7F)) + if (isprint(buffer[i])) printf("%c", buffer[i]); else printf("."); From b04108c6150dda19b2174cf9b1ed88921c8de92e Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Thu, 14 Nov 2019 12:56:39 +0100 Subject: [PATCH 2/3] isotpsniffer: Fix error handling --- isotpsniffer.c | 61 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/isotpsniffer.c b/isotpsniffer.c index cc9d196..a55bdd5 100644 --- a/isotpsniffer.c +++ b/isotpsniffer.c @@ -176,10 +176,11 @@ void printbuf(unsigned char *buffer, int nbytes, int color, int timestamp, int main(int argc, char **argv) { fd_set rdfs; - int s, t; + int s = 0, t = 0; struct sockaddr_can addr; char if_name[IFNAMSIZ]; static struct can_isotp_options opts; + int r = 0; int opt, quit = 0; int color = 0; int head = 0; @@ -241,35 +242,37 @@ int main(int argc, char **argv) case '?': print_usage(basename(argv[0])); - exit(0); - break; + goto out; default: fprintf(stderr, "Unknown option %c\n", opt); print_usage(basename(argv[0])); - exit(1); - break; + goto out; } } if ((argc - optind) != 1 || src == NO_CAN_ID || dst == NO_CAN_ID) { print_usage(basename(argv[0])); - exit(1); + r = 1; + goto out; } if ((opts.flags & CAN_ISOTP_RX_EXT_ADDR) && (!(opts.flags & CAN_ISOTP_EXTEND_ADDR))) { print_usage(basename(argv[0])); - exit(1); + r = 1; + goto out; } if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) { perror("socket"); - exit(1); + r = 1; + goto out; } if ((t = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) { perror("socket"); - exit(1); + r = 1; + goto out; } opts.flags |= CAN_ISOTP_LISTEN_MODE; @@ -287,8 +290,8 @@ int main(int argc, char **argv) if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); - close(s); - exit(1); + r = 1; + goto out; } if (opts.flags & CAN_ISOTP_RX_EXT_ADDR) { @@ -300,15 +303,19 @@ int main(int argc, char **argv) opts.rx_ext_address = tmpext; } - setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)); + if ((setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts))) < 0) { + perror("setsockopt"); + r = 1; + goto out; + } addr.can_addr.tp.tx_id = dst; addr.can_addr.tp.rx_id = src; if (bind(t, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); - close(s); - exit(1); + r = 1; + goto out; } while (!quit) { @@ -333,10 +340,13 @@ int main(int argc, char **argv) nbytes = read(s, buffer, 4096); if (nbytes < 0) { perror("read socket s"); - return -1; + r = 1; + goto out; + } + if (nbytes > 4095) { + r = 1; + goto out; } - if (nbytes > 4095) - return -1; printbuf(buffer, nbytes, color?2:0, timestamp, format, &tv, &last_tv, dst, s, if_name, head); } @@ -345,16 +355,23 @@ int main(int argc, char **argv) nbytes = read(t, buffer, 4096); if (nbytes < 0) { perror("read socket t"); - return -1; + r = 1; + goto out; + } + if (nbytes > 4095) { + r = 1; + goto out; } - if (nbytes > 4095) - return -1; printbuf(buffer, nbytes, color?1:0, timestamp, format, &tv, &last_tv, src, t, if_name, head); } } - close(s); +out: + if (s) + close(s); + if (t) + close(t); - return 0; + return r; } From da33f96edfb97d8052b2a8b5f0d181149df075cc Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Thu, 14 Nov 2019 12:59:59 +0100 Subject: [PATCH 3/3] isotpsniffer: Add support for llopts --- isotpsniffer.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/isotpsniffer.c b/isotpsniffer.c index a55bdd5..153bfff 100644 --- a/isotpsniffer.c +++ b/isotpsniffer.c @@ -76,6 +76,7 @@ void print_usage(char *prg) fprintf(stderr, " -c (color mode)\n"); fprintf(stderr, " -t (timestamp: (a)bsolute/(d)elta/(z)ero/(A)bsolute w date)\n"); fprintf(stderr, " -f (1 = HEX, 2 = ASCII, 3 = HEX & ASCII - default: %d)\n", FORMAT_DEFAULT); + fprintf(stderr, " -L :: (link layer options for CAN FD)\n"); fprintf(stderr, " -h (head: print only first bytes)\n"); fprintf(stderr, "\nCAN IDs and addresses are given and expected in hexadecimal values.\n"); fprintf(stderr, "\n"); @@ -180,6 +181,7 @@ int main(int argc, char **argv) struct sockaddr_can addr; char if_name[IFNAMSIZ]; static struct can_isotp_options opts; + static struct can_isotp_ll_options llopts; int r = 0; int opt, quit = 0; int color = 0; @@ -194,7 +196,7 @@ int main(int argc, char **argv) unsigned char buffer[4096]; int nbytes; - while ((opt = getopt(argc, argv, "s:d:x:X:h:ct:f:?")) != -1) { + while ((opt = getopt(argc, argv, "s:d:x:X:h:ct:f:L:?")) != -1) { switch (opt) { case 's': src = strtoul(optarg, (char **)NULL, 16); @@ -222,6 +224,17 @@ int main(int argc, char **argv) format = (atoi(optarg) & (FORMAT_ASCII | FORMAT_HEX)); break; + case 'L': + if (sscanf(optarg, "%hhu:%hhu:%hhu", + &llopts.mtu, + &llopts.tx_dl, + &llopts.tx_flags) != 3) { + printf("unknown link layer options '%s'.\n", optarg); + print_usage(basename(argv[0])); + exit(1); + } + break; + case 'h': head = atoi(optarg); break; @@ -309,6 +322,17 @@ int main(int argc, char **argv) goto out; } + if ((setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_LL_OPTS, &llopts, sizeof(llopts))) < 0) { + perror("setsockopt"); + r = 1; + goto out; + } + if ((setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_LL_OPTS, &llopts, sizeof(llopts))) < 0) { + perror("setsockopt"); + r = 1; + goto out; + } + addr.can_addr.tp.tx_id = dst; addr.can_addr.tp.rx_id = src;