can: fix multiple delivery of a single CAN frame for overlapping CAN filters
authorOliver Hartkopp <socketcan@hartkopp.net>
Wed, 1 Apr 2015 05:50:28 +0000 (07:50 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 1 Apr 2015 09:27:41 +0000 (11:27 +0200)
commit514ac99c64b22d83b52dfee3b8becaa69a92bc4a
treedc44e61b13c9c7279ad7b5be1195f5cebeb422c2
parenta0bc163a7cf2ceb413a76cfd7149c6591db829ea
can: fix multiple delivery of a single CAN frame for overlapping CAN filters

The CAN_RAW socket can set multiple CAN identifier specific filters that lead
to multiple filters in the af_can.c filter processing. These filters are
indenpendent from each other which leads to logical OR'ed filters when applied.

This patch makes sure that every CAN frame which is filtered for a specific
socket is only delivered once to the user space. This is independent from the
number of matching CAN filters of this socket.

As the raw_rcv() function is executed from NET_RX softirq the introduced
variables are implemented as per-CPU variables to avoid extensive locking at
CAN frame reception time.

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
net/can/raw.c