linux/net/bridge
Nikolay Aleksandrov 91dd2474f3 bridge: multicast: restore perm router ports on multicast enable
commit 7cb3f9214d upstream.

Satish reported a problem with the perm multicast router ports not getting
reenabled after some series of events, in particular if it happens that the
multicast snooping has been disabled and the port goes to disabled state
then it will be deleted from the router port list, but if it moves into
non-disabled state it will not be re-added because the mcast snooping is
still disabled, and enabling snooping later does nothing.

Here are the steps to reproduce, setup br0 with snooping enabled and eth1
added as a perm router (multicast_router = 2):
1. $ echo 0 > /sys/class/net/br0/bridge/multicast_snooping
2. $ ip l set eth1 down
^ This step deletes the interface from the router list
3. $ ip l set eth1 up
^ This step does not add it again because mcast snooping is disabled
4. $ echo 1 > /sys/class/net/br0/bridge/multicast_snooping
5. $ bridge -d -s mdb show
<empty>

At this point we have mcast enabled and eth1 as a perm router (value = 2)
but it is not in the router list which is incorrect.

After this change:
1. $ echo 0 > /sys/class/net/br0/bridge/multicast_snooping
2. $ ip l set eth1 down
^ This step deletes the interface from the router list
3. $ ip l set eth1 up
^ This step does not add it again because mcast snooping is disabled
4. $ echo 1 > /sys/class/net/br0/bridge/multicast_snooping
5. $ bridge -d -s mdb show
router ports on br0: eth1

Note: we can directly do br_multicast_enable_port for all because the
querier timer already has checks for the port state and will simply
expire if it's in blocking/disabled. See the comment added by
commit 9aa6638216 ("bridge: multicast: add a comment to
br_port_state_selection about blocking state")

Fixes: 561f1103a2 ("bridge: Add multicast_snooping sysfs toggle")
Reported-by: Satish Ashok <sashok@cumulusnetworks.com>
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2017-02-23 03:54:17 +00:00
..
netfilter Revert "netfilter: ensure number of counters is >0 in do_replace()" 2016-08-22 22:38:31 +01:00
br.c bridge: make br_device_notifier static 2014-05-22 15:33:47 -04:00
br_device.c bridge: fix lockdep addr_list_lock false positive splat 2016-02-02 23:47:24 +00:00
br_fdb.c bridge: disable softirqs around br_fdb_update to avoid lockup 2015-06-12 13:40:05 +01:00
br_forward.c bridge: use is_skb_forwardable in forward path 2014-03-31 16:04:04 -04:00
br_if.c bridge: Fix incorrect judgment of promisc 2014-06-05 15:20:31 -07:00
br_input.c bridge: Prepare for forwarding another bridge group addresses 2014-06-11 15:22:53 -07:00
br_ioctl.c bridge: fix br_stp_set_bridge_priority race conditions 2015-07-06 10:24:35 +01:00
br_mdb.c bridge: mdb: fix delmdb state in the notification 2015-08-25 10:13:53 +01:00
br_multicast.c bridge: multicast: restore perm router ports on multicast enable 2017-02-23 03:54:17 +00:00
br_netfilter.c vlan: rename __vlan_find_dev_deep() to __vlan_find_dev_deep_rcu() 2014-05-12 14:39:13 -04:00
br_netlink.c bridge: Keep track of ports capable of automatic discovery. 2014-05-16 17:06:33 -04:00
br_private.h Bridge: Fix ipv6 mc snooping if bridge has no ipv6 address 2016-08-22 22:38:23 +01:00
br_private_stp.h net: 8021q/bluetooth/bridge/can/ceph: Remove extern from function prototypes 2013-10-19 19:12:11 -04:00
br_stp.c bridge: Clamp forward_delay when enabling STP 2013-09-12 23:32:14 -04:00
br_stp_bpdu.c br: fix use of ->rx_handler_data in code executed on non-rx_handler path 2013-12-06 15:41:40 -05:00
br_stp_if.c bridge: Only call /sbin/bridge-stp for the initial network namespace 2016-01-28 10:27:12 +00:00
br_stp_timer.c bridge: add space before '(/{', after ',', etc. 2013-12-19 19:27:26 -05:00
br_sysfs_br.c bridge: Support 802.1ad vlan filtering 2014-06-11 15:22:53 -07:00
br_sysfs_if.c bridge: Keep track of ports capable of automatic discovery. 2014-05-16 17:06:33 -04:00
br_vlan.c bridge: Fix br_should_learn to check vlan_enabled 2014-10-15 12:05:28 +02:00
Kconfig bridge: Add vlan filtering infrastructure 2013-02-13 19:41:46 -05:00
Makefile netfilter: bridge: fix Kconfig unmet dependencies 2014-05-26 00:42:30 -04:00