linux/net/bridge
Florian Westphal 739e4505a0 bridge: netfilter: don't call iptables on vlan packets if sysctl is off
When net.bridge.bridge-nf-filter-vlan-tagged is 0 (default), vlan packets
arriving should not be sent to ip(6)tables by bridge netfilter.

However, it turns out that we currently always send VLAN packets to
netfilter, if ..
a), CONFIG_VLAN_8021Q is enabled ; or
b), CONFIG_VLAN_8021Q is not set but rx vlan offload is enabled
   on the bridge port.

This is because bridge netfilter treats skb with
skb->protocol == ETH_P_IP{V6} as "non-vlan packet".

With rx vlan offload on or CONFIG_VLAN_8021Q=y, the vlan header has
already been removed here, and we cannot rely on skb->protocol alone.

Fix this by only using skb->protocol if the skb has no vlan tag,
or if a vlan tag is present and filter-vlan-tagged bridge netfilter
sysctl is enabled.

We cannot remove the skb->protocol == htons(ETH_P_8021Q) test
because the vlan tag is still around in the CONFIG_VLAN_8021Q=n &&
"ethtool -K $itf rxvlan off" case.

reproducer:
iptables -t raw -I PREROUTING -i br0
iptables -t raw -I PREROUTING -i br0.1

Then send packets to an ip address configured on br0.1 interface.
Even with net.bridge.bridge-nf-filter-vlan-tagged=0, the 1st rule
will match instead of the 2nd one.

With this patch applied, the 2nd rule will match instead.
In the non-local address case, netfilter won't be consulted after
this patch unless the sysctl is switched on.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-03-06 14:43:49 -05:00
..
netfilter netfilter: bridge: fix wrong pointer dereference 2012-03-06 14:43:49 -05:00
br_device.c bridge: add local MAC address to forwarding table (v2) 2011-12-08 19:40:28 -05:00
br_fdb.c bridge: BH already disabled in br_fdb_cleanup() 2012-01-17 10:17:32 -05:00
br_forward.c bridge: add local MAC address to forwarding table (v2) 2011-12-08 19:40:28 -05:00
br_if.c net: introduce and use netdev_features_t for device features sets 2011-11-16 17:43:10 -05:00
br_input.c net: Add export.h for EXPORT_SYMBOL/THIS_MODULE to non-modules 2011-10-31 19:30:30 -04:00
br_ioctl.c Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 2011-04-11 13:44:25 -07:00
br_multicast.c bridge: check return value of ipv6_dev_get_saddr() 2012-03-05 16:45:34 -05:00
br_netfilter.c bridge: netfilter: don't call iptables on vlan packets if sysctl is off 2012-03-06 14:43:49 -05:00
br_netlink.c bridge: master device stuck in no-carrier state forever when in user-stp mode 2011-12-01 14:05:17 -05:00
br_notify.c Bridge: Always send NETDEV_CHANGEADDR up on br MAC change. 2011-08-09 21:44:44 -07:00
br_private_stp.h bridge: minor cleanups 2011-07-22 17:01:13 -07:00
br_private.h net:bridge: use IS_ENABLED 2011-12-16 15:49:52 -05:00
br_stp_bpdu.c bridge: minor cleanups 2011-07-22 17:01:13 -07:00
br_stp_if.c net: fix implicit kmod.h usage in bridge/br_stp_if.c 2011-10-31 19:30:30 -04:00
br_stp_timer.c bridge: add notification over netlink when STP changes state 2011-07-22 17:01:12 -07:00
br_stp.c bridge: message age needs to increase, not decrease. 2012-03-04 21:57:40 -05:00
br_sysfs_br.c bridge: allow forwarding some link local frames 2011-10-06 15:27:56 -04:00
br_sysfs_if.c bridge: range check STP parameters 2011-04-04 17:22:29 -07:00
br.c net:bridge: use IS_ENABLED 2011-12-16 15:49:52 -05:00
Kconfig net: bridge builtin vs. ipv6 modular 2011-03-10 13:45:57 -08:00
Makefile bridge: Add core IGMP snooping support 2010-02-28 00:48:45 -08:00