X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-utils.git/blobdiff_plain/c517af5a0ba8aef7f5c71e032794b5263ae3f723..4ffb7fe5c75a8f15109168bf81c3310ffff51b02:/isotpsniffer.c diff --git a/isotpsniffer.c b/isotpsniffer.c index 84d39a2..7618dca 100644 --- a/isotpsniffer.c +++ b/isotpsniffer.c @@ -68,7 +68,8 @@ void print_usage(char *prg) fprintf(stderr, "\nUsage: %s [options] \n", prg); fprintf(stderr, "Options: -s (source can_id. Use 8 digits for extended IDs)\n"); fprintf(stderr, " -d (destination can_id. Use 8 digits for extended IDs)\n"); - fprintf(stderr, " -x (extended addressing mode.)\n"); + fprintf(stderr, " -x (extended addressing mode)\n"); + fprintf(stderr, " -X (extended addressing mode - rx addr)\n"); 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); @@ -189,7 +190,7 @@ int main(int argc, char **argv) unsigned char buffer[4096]; int nbytes; - while ((opt = getopt(argc, argv, "s:d:x:h:ct:f:?")) != -1) { + while ((opt = getopt(argc, argv, "s:d:x:X:h:ct:f:?")) != -1) { switch (opt) { case 's': src = strtoul(optarg, (char **)NULL, 16); @@ -208,6 +209,11 @@ int main(int argc, char **argv) opts.ext_address = strtoul(optarg, (char **)NULL, 16) & 0xFF; break; + case 'X': + opts.flags |= CAN_ISOTP_RX_EXT_ADDR; + opts.rx_ext_address = strtoul(optarg, (char **)NULL, 16) & 0xFF; + break; + case 'f': format = (atoi(optarg) & (FORMAT_ASCII | FORMAT_HEX)); break; @@ -248,6 +254,11 @@ int main(int argc, char **argv) exit(1); } + if ((opts.flags & CAN_ISOTP_RX_EXT_ADDR) && (!(opts.flags & CAN_ISOTP_EXTEND_ADDR))) { + print_usage(basename(argv[0])); + exit(1); + } + if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) { perror("socket"); exit(1); @@ -260,16 +271,15 @@ int main(int argc, char **argv) opts.flags |= CAN_ISOTP_LISTEN_MODE; - setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)); - setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)); - addr.can_family = AF_CAN; strcpy(ifr.ifr_name, argv[optind]); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_ifindex = ifr.ifr_ifindex; - addr.can_addr.tp.tx_id = dst; - addr.can_addr.tp.rx_id = src; + setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)); + + addr.can_addr.tp.tx_id = src; + addr.can_addr.tp.rx_id = dst; if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); @@ -277,8 +287,19 @@ int main(int argc, char **argv) exit(1); } - addr.can_addr.tp.tx_id = src; - addr.can_addr.tp.rx_id = dst; + if (opts.flags & CAN_ISOTP_RX_EXT_ADDR) { + /* flip extended address info due to separate rx ext addr */ + __u8 tmpext; + + tmpext = opts.ext_address; + opts.ext_address = opts.rx_ext_address; + opts.rx_ext_address = tmpext; + } + + setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)); + + 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"); @@ -312,8 +333,8 @@ int main(int argc, char **argv) } if (nbytes > 4095) return -1; - printbuf(buffer, nbytes, color?1:0, timestamp, format, - &tv, &last_tv, src, s, ifr.ifr_name, head); + printbuf(buffer, nbytes, color?2:0, timestamp, format, + &tv, &last_tv, dst, s, ifr.ifr_name, head); } if (FD_ISSET(t, &rdfs)) { @@ -324,8 +345,8 @@ int main(int argc, char **argv) } if (nbytes > 4095) return -1; - printbuf(buffer, nbytes, color?2:0, timestamp, format, - &tv, &last_tv, dst, t, ifr.ifr_name, head); + printbuf(buffer, nbytes, color?1:0, timestamp, format, + &tv, &last_tv, src, t, ifr.ifr_name, head); } }