fprintf(stderr, "%s -c -c -ta can0,123:7FF,400:700,#000000FF can2,400~7F0 can3 can8\n", prg);
fprintf(stderr, "%s -l any,0~0,#FFFFFFFF (log only error frames but no(!) data frames)\n", prg);
fprintf(stderr, "%s -l any,0:0,#FFFFFFFF (log error frames and also all data frames)\n", prg);
- fprintf(stderr, "%s vcan2,92345678:9FFFFFFF (match only for extended CAN ID 12345678)\n", prg);
- fprintf(stderr, "%s vcan2,12345678:1FFFFFFF (analog to above due to 8 digit value length)\n", prg);
+ fprintf(stderr, "%s vcan2,92345678:DFFFFFFF (match only for extended CAN ID 12345678)\n", prg);
+ fprintf(stderr, "%s vcan2,123:7FF (matches CAN ID 123 - including EFF and RTR frames)\n", prg);
+ fprintf(stderr, "%s vcan2,123:C00007FF (matches CAN ID 123 - only SFF and non-RTR frames)\n", prg);
fprintf(stderr, "\n");
}
return i;
}
-canid_t checkeff(char *ptr, char *nptr)
-{
- int len;
-
- if (nptr)
- len = nptr - ptr;
- else
- len = strlen(ptr);
-
- if (len == 17 && (ptr[8] == ':' || ptr[8] == '~'))
- return CAN_EFF_FLAG;
- else
- return 0;
-}
-
int main(int argc, char **argv)
{
fd_set rdfs;
int opt, ret;
int currmax, numfilter;
char *ptr, *nptr;
- canid_t eff;
struct sockaddr_can addr;
struct can_filter rfilter[MAXFILTER];
can_err_mask_t err_mask;
&rfilter[numfilter].can_id,
(long unsigned int *)
&rfilter[numfilter].can_mask) == 2) {
- eff = checkeff(ptr, nptr);
- rfilter[numfilter].can_id |= eff;
- rfilter[numfilter].can_mask |= eff;
rfilter[numfilter].can_mask &= ~CAN_ERR_FLAG;
numfilter++;
} else if (sscanf(ptr, "%lx~%lx",
(long unsigned int *)
&rfilter[numfilter].can_mask) == 2) {
rfilter[numfilter].can_id |= CAN_INV_FILTER;
- eff = checkeff(ptr, nptr);
- rfilter[numfilter].can_id |= eff;
- rfilter[numfilter].can_mask |= eff;
rfilter[numfilter].can_mask &= ~CAN_ERR_FLAG;
numfilter++;
} else if (sscanf(ptr, "#%lx",
return 1;
}
- rfilter[0].can_id = src;
- if (src & CAN_EFF_FLAG)
- rfilter[0].can_mask = CAN_EFF_MASK | CAN_EFF_FLAG;
- else
- rfilter[0].can_mask = CAN_SFF_MASK;
-
- rfilter[1].can_id = dst;
- if (dst & CAN_EFF_FLAG)
- rfilter[1].can_mask = CAN_EFF_MASK | CAN_EFF_FLAG;
- else
- rfilter[1].can_mask = CAN_SFF_MASK;
+
+ if (src & CAN_EFF_FLAG) {
+ rfilter[0].can_id = src & (CAN_EFF_MASK | CAN_EFF_FLAG);
+ rfilter[0].can_mask = (CAN_EFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
+ } else {
+ rfilter[0].can_id = src & CAN_SFF_MASK;
+ rfilter[0].can_mask = (CAN_SFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
+ }
+
+ if (dst & CAN_EFF_FLAG) {
+ rfilter[1].can_id = dst & (CAN_EFF_MASK | CAN_EFF_FLAG);
+ rfilter[1].can_mask = (CAN_EFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
+ } else {
+ rfilter[1].can_id = dst & CAN_SFF_MASK;
+ rfilter[1].can_mask = (CAN_SFF_MASK|CAN_EFF_FLAG|CAN_RTR_FLAG);
+ }
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));