~ubuntu-branches/ubuntu/vivid/can-utils/vivid

« back to all changes in this revision

Viewing changes to isotpsniffer.c

  • Committer: Package Import Robot
  • Author(s): Alexander GQ Gerasiov
  • Date: 2014-12-07 01:46:30 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20141207014630-h6v4eevixrhik50n
Tags: 0.0+git20141123-1
Update to upstream git 20141123.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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];
190
191
        int nbytes;
191
192
 
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) {
193
194
                switch (opt) {
194
195
                case 's':
195
196
                        src = strtoul(optarg, (char **)NULL, 16);
208
209
                        opts.ext_address = strtoul(optarg, (char **)NULL, 16) & 0xFF;
209
210
                        break;
210
211
 
 
212
                case 'X':
 
213
                        opts.flags |= CAN_ISOTP_RX_EXT_ADDR;
 
214
                        opts.rx_ext_address = strtoul(optarg, (char **)NULL, 16) & 0xFF;
 
215
                        break;
 
216
 
211
217
                case 'f':
212
218
                        format = (atoi(optarg) & (FORMAT_ASCII | FORMAT_HEX));
213
219
                        break;
248
254
                exit(1);
249
255
        }
250
256
  
 
257
        if ((opts.flags & CAN_ISOTP_RX_EXT_ADDR) && (!(opts.flags & CAN_ISOTP_EXTEND_ADDR))) {
 
258
                print_usage(basename(argv[0]));
 
259
                exit(1);
 
260
        }
 
261
 
251
262
        if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
252
263
                perror("socket");
253
264
                exit(1);
260
271
 
261
272
        opts.flags |= CAN_ISOTP_LISTEN_MODE;
262
273
 
263
 
        setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
264
 
        setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
265
 
 
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;
270
278
 
 
279
        setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
 
280
 
 
281
        addr.can_addr.tp.tx_id = src;
 
282
        addr.can_addr.tp.rx_id = dst;
 
283
 
 
284
        if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
 
285
                perror("bind");
 
286
                close(s);
 
287
                exit(1);
 
288
        }
 
289
 
 
290
        if (opts.flags & CAN_ISOTP_RX_EXT_ADDR) {
 
291
                /* flip extended address info due to separate rx ext addr */
 
292
                __u8 tmpext;
 
293
 
 
294
                tmpext = opts.ext_address;
 
295
                opts.ext_address = opts.rx_ext_address;
 
296
                opts.rx_ext_address = tmpext;
 
297
        }
 
298
 
 
299
        setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
 
300
 
271
301
        addr.can_addr.tp.tx_id = dst;
272
302
        addr.can_addr.tp.rx_id = src;
273
303
 
274
 
        if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
275
 
                perror("bind");
276
 
                close(s);
277
 
                exit(1);
278
 
        }
279
 
 
280
 
        addr.can_addr.tp.tx_id = src;
281
 
        addr.can_addr.tp.rx_id = dst;
282
 
 
283
304
        if (bind(t, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
284
305
                perror("bind");
285
306
                close(s);
312
333
                        }
313
334
                        if (nbytes > 4095)
314
335
                                return -1;
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);
317
338
                }
318
339
 
319
340
                if (FD_ISSET(t, &rdfs)) {
324
345
                        }
325
346
                        if (nbytes > 4095)
326
347
                                return -1;
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);
329
350
                }
330
351
        }
331
352