]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Added can_id depended filter mask generation for can_rx_register() to
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Fri, 9 Mar 2007 07:36:49 +0000 (07:36 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Fri, 9 Mar 2007 07:36:49 +0000 (07:36 +0000)
get the best masking value for a given single can_id.

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

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

index 6e8a6bf64882c9ac97538acf4ae1b4d289c92d45..b47bac740a3e79ea267f1dbd893faf30b2272f6a 100644 (file)
@@ -75,7 +75,10 @@ static int debug = 0;
 #define RX_RECV    0x40 /* received data for this element */
 #define RX_THR     0x80 /* element not been sent due to throttle feature */
 #define BCM_CAN_DLC_MASK 0x0F /* clean private flags in can_dlc by masking */
-#define BCM_RX_REGMASK (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)
+
+/* get best masking value for can_rx_register() for a given single can_id */
+#define REGMASK(id) ((id & CAN_RTR_FLAG) | ((id & CAN_EFF_FLAG) ? \
+                       (CAN_EFF_MASK | CAN_EFF_FLAG) : CAN_SFF_MASK))
 
 #define IDENT "bcm"
 static __initdata const char banner[] = KERN_INFO
@@ -302,12 +305,13 @@ static int bcm_release(struct socket *sock)
                        struct net_device *dev = dev_get_by_index(op->ifindex);
                        if (dev) {
                                can_rx_unregister(dev, op->can_id,
-                                                 BCM_RX_REGMASK,
+                                                 REGMASK(op->can_id),
                                                  bcm_rx_handler, op);
                                dev_put(dev);
                        }
                } else
-                       can_rx_unregister(NULL, op->can_id, BCM_RX_REGMASK,
+                       can_rx_unregister(NULL, op->can_id,
+                                         REGMASK(op->can_id),
                                          bcm_rx_handler, op);
 
                bcm_remove_op(op);
@@ -913,12 +917,12 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
 
                        if (dev) {
                                can_rx_register(dev, op->can_id,
-                                               BCM_RX_REGMASK,
+                                               REGMASK(op->can_id),
                                                bcm_rx_handler, op, IDENT);
                                dev_put(dev);
                        }
                } else 
-                       can_rx_register(NULL, op->can_id, BCM_RX_REGMASK,
+                       can_rx_register(NULL, op->can_id, REGMASK(op->can_id),
                                        bcm_rx_handler, op, IDENT);
        }
 
@@ -1539,13 +1543,13 @@ static int bcm_delete_rx_op(struct bcm_op **ops, canid_t can_id, int ifindex)
                                        dev_get_by_index(op->ifindex);
                                if (dev) {
                                        can_rx_unregister(dev, op->can_id,
-                                                         BCM_RX_REGMASK,
+                                                         REGMASK(op->can_id),
                                                          bcm_rx_handler, op);
                                        dev_put(dev);
                                }
                        } else
                                can_rx_unregister(NULL, op->can_id,
-                                                 BCM_RX_REGMASK,
+                                                 REGMASK(op->can_id),
                                                  bcm_rx_handler, op);
 
                        *n = op->next;
index 39ba8e26b8240356261bc35dcb7534fc55286150..6b3e79c85adfd8a105b5a7f83187c3d80d2b0742 100644 (file)
@@ -76,7 +76,10 @@ module_param(debug, int, S_IRUGO);
 #define RX_RECV    0x40 /* received data for this element */
 #define RX_THR     0x80 /* element not been sent due to throttle feature */
 #define BCM_CAN_DLC_MASK 0x0F /* clean private flags in can_dlc by masking */
-#define BCM_RX_REGMASK (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)
+
+/* get best masking value for can_rx_register() for a given single can_id */
+#define REGMASK(id) ((id & CAN_RTR_FLAG) | ((id & CAN_EFF_FLAG) ? \
+                       (CAN_EFF_MASK | CAN_EFF_FLAG) : CAN_SFF_MASK))
 
 #define IDENT "bcm"
 static __initdata const char banner[] = KERN_INFO
@@ -325,12 +328,13 @@ static int bcm_release(struct socket *sock)
                        struct net_device *dev = dev_get_by_index(op->ifindex);
                        if (dev) {
                                can_rx_unregister(dev, op->can_id,
-                                                 BCM_RX_REGMASK,
+                                                 REGMASK(op->can_id),
                                                  bcm_rx_handler, op);
                                dev_put(dev);
                        }
                } else
-                       can_rx_unregister(NULL, op->can_id, BCM_RX_REGMASK,
+                       can_rx_unregister(NULL, op->can_id,
+                                         REGMASK(op->can_id),
                                          bcm_rx_handler, op);
 
                bcm_remove_op(op);
@@ -936,12 +940,12 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
 
                        if (dev) {
                                can_rx_register(dev, op->can_id,
-                                               BCM_RX_REGMASK,
+                                               REGMASK(op->can_id),
                                                bcm_rx_handler, op, IDENT);
                                dev_put(dev);
                        }
                } else 
-                       can_rx_register(NULL, op->can_id, BCM_RX_REGMASK,
+                       can_rx_register(NULL, op->can_id, REGMASK(op->can_id),
                                        bcm_rx_handler, op, IDENT);
        }
 
@@ -1558,13 +1562,13 @@ static int bcm_delete_rx_op(struct list_head *ops, canid_t can_id, int ifindex)
                                        dev_get_by_index(op->ifindex);
                                if (dev) {
                                        can_rx_unregister(dev, op->can_id,
-                                                         BCM_RX_REGMASK,
+                                                         REGMASK(op->can_id),
                                                          bcm_rx_handler, op);
                                        dev_put(dev);
                                }
                        } else
                                can_rx_unregister(NULL, op->can_id,
-                                                 BCM_RX_REGMASK,
+                                                 REGMASK(op->can_id),
                                                  bcm_rx_handler, op);
 
                        list_del(&op->list);