canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking values */
canid_t eff = *can_id & *mask & CAN_EFF_FLAG; /* correct EFF check? */
canid_t rtr = *can_id & *mask & CAN_RTR_FLAG; /* correct RTR check? */
- canid_t err = *mask & CAN_ERR_FLAG; /* mask for error frames only */
+
+ /* do not modify the error mask due to the can_id which is 0 */
+ if (*mask & CAN_ERR_FLAG) { /* filter error frames */
+ *mask &= CAN_ERR_MASK; /* clear CAN_ERR_FLAG in list entry */
+ return &d->rx_err;
+ }
/* make some paranoic operations */
if (*can_id & CAN_EFF_FLAG)
*can_id &= *mask;
- if (err) /* error frames */
- return &d->rx_err;
-
if (inv) /* inverse can_id/can_mask filter and RTR */
return &d->rx_inv;
/* valid bits in CAN ID for frame formats */
#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
+#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
typedef __u32 canid_t;
#define CAN_ERR_BUSERROR 0x00000080U /* bus error (may flood!) */
#define CAN_ERR_RESTARTED 0x00000100U /* controller restarted */
-#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
-
/* arbitration lost in bit ... / data[0] */
#define CAN_ERR_LOSTARB_UNSPEC 0x00 /* unspecified */
/* else bit number in bitstream */
/* valid bits in CAN ID for frame formats */
#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
+#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
typedef __u32 canid_t;
#define CAN_ERR_BUSERROR 0x00000080U /* bus error (may flood!) */
#define CAN_ERR_RESTARTED 0x00000100U /* controller restarted */
-#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
-
/* arbitration lost in bit ... / data[0] */
#define CAN_ERR_LOSTARB_UNSPEC 0x00 /* unspecified */
/* else bit number in bitstream */
canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking values */
canid_t eff = *can_id & *mask & CAN_EFF_FLAG; /* correct EFF check? */
canid_t rtr = *can_id & *mask & CAN_RTR_FLAG; /* correct RTR check? */
- canid_t err = *mask & CAN_ERR_FLAG; /* mask for error frames only */
+
+ /* do not modify the error mask due to the can_id which is 0 */
+ if (*mask & CAN_ERR_FLAG) { /* filter error frames */
+ *mask &= CAN_ERR_MASK; /* clear CAN_ERR_FLAG in list entry */
+ return &d->rx_err;
+ }
/* make some paranoic operations */
if (*can_id & CAN_EFF_FLAG)
*can_id &= *mask;
- if (err) /* error frames */
- return &d->rx_err;
-
if (inv) /* inverse can_id/can_mask filter and RTR */
return &d->rx_inv;