If VLAN aware multicast snooping is enabled then we need to perform a
few extra checks to figure out if multicast snooping is actually enabled
for a specific VLAN, as there is then an additional per VLAN multicast
snooping toggle.

Signed-off-by: Linus Lüssing <[email protected]>
---
 net/bridge/br_multicast.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 4bdc3838c3dc..2a2f54009e0f 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1143,6 +1143,26 @@ static void br_multicast_update_active(struct 
net_bridge_mcast *brmctx)
        if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
                force_inactive = true;
 
+       if (br_opt_get(brmctx->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) {
+               /* with per-vlan snooping enabled there is an extra per-vlan
+                * toggle to enable/disable snooping which we must check
+                */
+               if (br_multicast_ctx_vlan_global_disabled(brmctx))
+                       force_inactive = true;
+
+               /* with per-vlan snooping enabled the non-vlan multicast
+                * snooping context is inactive
+                */
+               if (!br_multicast_ctx_is_vlan(brmctx))
+                       force_inactive = true;
+       } else {
+               /* with per-vlan snooping disabled a vlan multicast
+                * snooping context is inactive
+                */
+               if (br_multicast_ctx_is_vlan(brmctx))
+                       force_inactive = true;
+       }
+
        br_ip4_multicast_update_active(brmctx, force_inactive);
        br_ip6_multicast_update_active(brmctx, force_inactive);
 
-- 
2.51.0


Reply via email to