]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Cleaned up filter assignment due to a hint from Jan Kizka. See at
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Sat, 17 Feb 2007 20:05:03 +0000 (20:05 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Sat, 17 Feb 2007 20:05:03 +0000 (20:05 +0000)
https://lists.berlios.de/pipermail/socketcan-core/2007-February/000415.html

It's now possible to filter for EFF/RTR frames AND to filter not for them
explicitely (when CAN_EFF_FLAG or CAN_RTR_FLAG is set in the can_mask and
cleared in the can_id). This is indeed more straight and is what i intended
to have ...

git-svn-id: svn://svn.berlios.de//socketcan/trunk@152 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.4/can/af_can.c
kernel/2.6/net/can/af_can.c

index 577ec2ad08d009f0a90d0d2536742c5bd2c89659..5e5e6d21fc5d00c1102a474181b7d85c15396fba 100644 (file)
@@ -749,31 +749,25 @@ static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
 static struct receiver **find_rcv_list(canid_t *can_id, canid_t *mask,
                                       struct dev_rcv_lists *d)
 {
-       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 inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
 
-       /* 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)
-               *mask &= (CAN_EFF_MASK | eff | rtr);
+       /* ensure valid values in can_mask */
+       if (*mask & CAN_EFF_FLAG)
+               *mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG);
        else
-               *mask &= (CAN_SFF_MASK | rtr);
+               *mask &= (CAN_SFF_MASK | CAN_RTR_FLAG);
 
-       *can_id &= *mask;
+       *can_id &= *mask; /* reduce condition testing at receive time */
 
-       if (inv) /* inverse can_id/can_mask filter and RTR */
+       if (inv) /* inverse can_id/can_mask filter */
                return &d->rx_inv;
 
-       if (*can_id & CAN_RTR_FLAG) /* positive filter RTR */
-               return &d->rx_fil;
-
-       if (!(*mask)) /* mask == 0 => no filter */
+       if (!(*mask)) /* mask == 0 => no condition testing at receive time */
                return &d->rx_all;
 
        if (*can_id & CAN_EFF_FLAG) {
@@ -784,7 +778,7 @@ static struct receiver **find_rcv_list(canid_t *can_id, canid_t *mask,
                        return &d->rx_sff[*can_id];
        }
 
-       return &d->rx_fil;  /* filter via can_id/can_mask */
+       return &d->rx_fil;  /* default: filter via can_id/can_mask */
 }
 
 /**************************************************/
index 8dcd9f049f7e45bee9699ec40a24799b3c2a9f8a..a3d46577b1451a0916ececfcd8fee43880927c22 100644 (file)
@@ -817,31 +817,25 @@ static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
 static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
                                        struct dev_rcv_lists *d)
 {
-       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 inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
 
-       /* 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)
-               *mask &= (CAN_EFF_MASK | eff | rtr);
+       /* ensure valid values in can_mask */
+       if (*mask & CAN_EFF_FLAG)
+               *mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG);
        else
-               *mask &= (CAN_SFF_MASK | rtr);
+               *mask &= (CAN_SFF_MASK | CAN_RTR_FLAG);
 
-       *can_id &= *mask;
+       *can_id &= *mask; /* reduce condition testing at receive time */
 
-       if (inv) /* inverse can_id/can_mask filter and RTR */
+       if (inv) /* inverse can_id/can_mask filter */
                return &d->rx_inv;
 
-       if (*can_id & CAN_RTR_FLAG) /* positive filter RTR */
-               return &d->rx_fil;
-
-       if (!(*mask)) /* mask == 0 => no filter */
+       if (!(*mask)) /* mask == 0 => no condition testing at receive time */
                return &d->rx_all;
 
        if (*can_id & CAN_EFF_FLAG) {
@@ -852,7 +846,7 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
                        return &d->rx_sff[*can_id];
        }
 
-       return &d->rx_fil;  /* filter via can_id/can_mask */
+       return &d->rx_fil;  /* default: filter via can_id/can_mask */
 }
 
 /**************************************************/