struct sk_buff *skb;
u8 igmp_type;
- if (!br_multicast_ctx_should_use(brmctx, pmctx))
+ if (!br_multicast_ctx_should_use(brmctx, pmctx) ||
+ !br_multicast_ctx_matches_vlan_snooping(brmctx))
return;
again_under_lmqt:
__br_multicast_open(&vlan->br_mcast_ctx);
}
}
+ } else {
+ __br_multicast_open(&br->multicast_ctx);
}
-
- __br_multicast_open(&br->multicast_ctx);
}
static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
__br_multicast_stop(&vlan->br_mcast_ctx);
}
}
+ } else {
+ __br_multicast_stop(&br->multicast_ctx);
}
-
- __br_multicast_stop(&br->multicast_ctx);
}
void br_multicast_dev_del(struct net_bridge *br)
{
struct net_bridge_port *port;
+ if (!br_multicast_ctx_matches_vlan_snooping(brmctx))
+ return;
+
__br_multicast_open_query(brmctx->br, query);
rcu_read_lock();
#endif
true;
}
+
+static inline bool
+br_multicast_ctx_matches_vlan_snooping(const struct net_bridge_mcast *brmctx)
+{
+ bool vlan_snooping_enabled;
+
+ vlan_snooping_enabled = !!br_opt_get(brmctx->br,
+ BROPT_MCAST_VLAN_SNOOPING_ENABLED);
+
+ return !!(vlan_snooping_enabled == br_multicast_ctx_is_vlan(brmctx));
+}
#else
static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,
struct net_bridge_mcast_port **pmctx,