isotpdump: option to capture functional addressing traffic
add option '-b' to capture functional broadcast data eg: -b 98DAFFF1 or -b 18DAFFF1pull/555/head
parent
8a156fee19
commit
367e0df4aa
23
isotpdump.c
23
isotpdump.c
|
|
@ -72,6 +72,7 @@ void print_usage(char *prg)
|
||||||
fprintf(stderr, "Options:\n");
|
fprintf(stderr, "Options:\n");
|
||||||
fprintf(stderr, " -s <can_id> (source can_id. Use 8 digits for extended IDs)\n");
|
fprintf(stderr, " -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, " -d <can_id> (destination can_id. Use 8 digits for extended IDs)\n");
|
||||||
|
fprintf(stderr, " -b <can_id> (broadcast can_id, Use 8 digits for extended IDs)\n");
|
||||||
fprintf(stderr, " -x <addr> (extended addressing mode. Use 'any' for all addresses)\n");
|
fprintf(stderr, " -x <addr> (extended addressing mode. Use 'any' for all addresses)\n");
|
||||||
fprintf(stderr, " -X <addr> (extended addressing mode (rx addr). Use 'any' for all)\n");
|
fprintf(stderr, " -X <addr> (extended addressing mode (rx addr). Use 'any' for all)\n");
|
||||||
fprintf(stderr, " -c (color mode)\n");
|
fprintf(stderr, " -c (color mode)\n");
|
||||||
|
|
@ -197,11 +198,12 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
struct sockaddr_can addr;
|
struct sockaddr_can addr;
|
||||||
struct can_filter rfilter[2];
|
struct can_filter rfilter[3];
|
||||||
struct canfd_frame frame;
|
struct canfd_frame frame;
|
||||||
int nbytes, i;
|
int nbytes, i;
|
||||||
canid_t src = NO_CAN_ID;
|
canid_t src = NO_CAN_ID;
|
||||||
canid_t dst = NO_CAN_ID;
|
canid_t dst = NO_CAN_ID;
|
||||||
|
canid_t bst = NO_CAN_ID;
|
||||||
int ext = 0;
|
int ext = 0;
|
||||||
int extaddr = 0;
|
int extaddr = 0;
|
||||||
int extany = 0;
|
int extany = 0;
|
||||||
|
|
@ -222,7 +224,7 @@ int main(int argc, char **argv)
|
||||||
last_tv.tv_sec = 0;
|
last_tv.tv_sec = 0;
|
||||||
last_tv.tv_usec = 0;
|
last_tv.tv_usec = 0;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "s:d:ax:X:ct:u?")) != -1) {
|
while ((opt = getopt(argc, argv, "s:d:b:ax:X:ct:u?")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 's':
|
case 's':
|
||||||
src = strtoul(optarg, NULL, 16);
|
src = strtoul(optarg, NULL, 16);
|
||||||
|
|
@ -236,6 +238,12 @@ int main(int argc, char **argv)
|
||||||
dst |= CAN_EFF_FLAG;
|
dst |= CAN_EFF_FLAG;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'b':
|
||||||
|
bst = strtoul(optarg, NULL, 16);
|
||||||
|
if (strlen(optarg) > 7)
|
||||||
|
bst |= CAN_EFF_FLAG;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
color = 1;
|
color = 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -321,7 +329,18 @@ int main(int argc, char **argv)
|
||||||
rfilter[1].can_mask = (CAN_SFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
|
rfilter[1].can_mask = (CAN_SFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bst & CAN_EFF_FLAG) {
|
||||||
|
rfilter[2].can_id = bst & (CAN_EFF_MASK | CAN_EFF_FLAG);
|
||||||
|
rfilter[2].can_mask = (CAN_EFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
|
||||||
|
} else {
|
||||||
|
rfilter[2].can_id = bst & CAN_SFF_MASK;
|
||||||
|
rfilter[2].can_mask = (CAN_SFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bst != NO_CAN_ID)
|
||||||
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
|
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
|
||||||
|
else
|
||||||
|
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter) - sizeof(rfilter[0]));
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(argv[optind]);
|
addr.can_ifindex = if_nametoindex(argv[optind]);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue