68
68
fprintf(stderr, "\nUsage: %s [options] <CAN interface>\n", prg);
69
69
fprintf(stderr, "Options: -s <can_id> (source can_id. Use 8 digits for extended IDs)\n");
70
70
fprintf(stderr, " -d <can_id> (destination can_id. Use 8 digits for extended IDs)\n");
71
fprintf(stderr, " -x <addr> (extended addressing mode.)\n");
71
fprintf(stderr, " -x <addr> (extended addressing mode)\n");
72
fprintf(stderr, " -X <addr> (extended addressing mode - rx addr)\n");
72
73
fprintf(stderr, " -c (color mode)\n");
73
74
fprintf(stderr, " -t <type> (timestamp: (a)bsolute/(d)elta/(z)ero/(A)bsolute w date)\n");
74
75
fprintf(stderr, " -f <format> (1 = HEX, 2 = ASCII, 3 = HEX & ASCII - default: %d)\n", FORMAT_DEFAULT);
189
190
unsigned char buffer[4096];
192
while ((opt = getopt(argc, argv, "s:d:x:h:ct:f:?")) != -1) {
193
while ((opt = getopt(argc, argv, "s:d:x:X:h:ct:f:?")) != -1) {
195
196
src = strtoul(optarg, (char **)NULL, 16);
208
209
opts.ext_address = strtoul(optarg, (char **)NULL, 16) & 0xFF;
213
opts.flags |= CAN_ISOTP_RX_EXT_ADDR;
214
opts.rx_ext_address = strtoul(optarg, (char **)NULL, 16) & 0xFF;
212
218
format = (atoi(optarg) & (FORMAT_ASCII | FORMAT_HEX));
261
272
opts.flags |= CAN_ISOTP_LISTEN_MODE;
263
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
264
setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
266
274
addr.can_family = AF_CAN;
267
275
strcpy(ifr.ifr_name, argv[optind]);
268
276
ioctl(s, SIOCGIFINDEX, &ifr);
269
277
addr.can_ifindex = ifr.ifr_ifindex;
279
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
281
addr.can_addr.tp.tx_id = src;
282
addr.can_addr.tp.rx_id = dst;
284
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
290
if (opts.flags & CAN_ISOTP_RX_EXT_ADDR) {
291
/* flip extended address info due to separate rx ext addr */
294
tmpext = opts.ext_address;
295
opts.ext_address = opts.rx_ext_address;
296
opts.rx_ext_address = tmpext;
299
setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
271
301
addr.can_addr.tp.tx_id = dst;
272
302
addr.can_addr.tp.rx_id = src;
274
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
280
addr.can_addr.tp.tx_id = src;
281
addr.can_addr.tp.rx_id = dst;
283
304
if (bind(t, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
313
334
if (nbytes > 4095)
315
printbuf(buffer, nbytes, color?1:0, timestamp, format,
316
&tv, &last_tv, src, s, ifr.ifr_name, head);
336
printbuf(buffer, nbytes, color?2:0, timestamp, format,
337
&tv, &last_tv, dst, s, ifr.ifr_name, head);
319
340
if (FD_ISSET(t, &rdfs)) {
325
346
if (nbytes > 4095)
327
printbuf(buffer, nbytes, color?2:0, timestamp, format,
328
&tv, &last_tv, dst, t, ifr.ifr_name, head);
348
printbuf(buffer, nbytes, color?1:0, timestamp, format,
349
&tv, &last_tv, src, t, ifr.ifr_name, head);