Commit cb486ce9 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller

net: bridge: mcast: querier and query state affect only current context type

It is a minor optimization and better behaviour to make sure querier and
query sending routines affect only the matching multicast context
depending if vlan snooping is enabled (vlan ctx vs bridge ctx).
It also avoids sending unnecessary extra query packets.
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4d5b4e84
...@@ -1628,7 +1628,8 @@ static void __br_multicast_send_query(struct net_bridge_mcast *brmctx, ...@@ -1628,7 +1628,8 @@ static void __br_multicast_send_query(struct net_bridge_mcast *brmctx,
struct sk_buff *skb; struct sk_buff *skb;
u8 igmp_type; 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; return;
again_under_lmqt: again_under_lmqt:
...@@ -3875,9 +3876,9 @@ void br_multicast_open(struct net_bridge *br) ...@@ -3875,9 +3876,9 @@ void br_multicast_open(struct net_bridge *br)
__br_multicast_open(&vlan->br_mcast_ctx); __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) static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
...@@ -4028,9 +4029,9 @@ void br_multicast_stop(struct net_bridge *br) ...@@ -4028,9 +4029,9 @@ void br_multicast_stop(struct net_bridge *br)
__br_multicast_stop(&vlan->br_mcast_ctx); __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) void br_multicast_dev_del(struct net_bridge *br)
...@@ -4175,6 +4176,9 @@ static void br_multicast_start_querier(struct net_bridge_mcast *brmctx, ...@@ -4175,6 +4176,9 @@ static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
{ {
struct net_bridge_port *port; struct net_bridge_port *port;
if (!br_multicast_ctx_matches_vlan_snooping(brmctx))
return;
__br_multicast_open_query(brmctx->br, query); __br_multicast_open_query(brmctx->br, query);
rcu_read_lock(); rcu_read_lock();
......
...@@ -1196,6 +1196,17 @@ br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1, ...@@ -1196,6 +1196,17 @@ br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1,
#endif #endif
true; 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 #else
static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx, static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,
struct net_bridge_mcast_port **pmctx, struct net_bridge_mcast_port **pmctx,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment