summaryrefslogtreecommitdiff
path: root/net/bridge/br_multicast.c
diff options
context:
space:
mode:
authorNikolay Aleksandrov <nikolay@nvidia.com>2021-08-10 18:29:29 +0300
committerDavid S. Miller <davem@davemloft.net>2021-08-11 13:34:41 +0100
commitcb486ce99576741a84c75623daeffb2f7758cbf9 (patch)
tree5f5033aa49997896d79e0aa9a484685a817c3e9f /net/bridge/br_multicast.c
parent4d5b4e84c72451face4d7817697684196cbee50d (diff)
downloadlwn-cb486ce99576741a84c75623daeffb2f7758cbf9.tar.gz
lwn-cb486ce99576741a84c75623daeffb2f7758cbf9.zip
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: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_multicast.c')
-rw-r--r--net/bridge/br_multicast.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index fe1482efd59c..f30c2e5d3142 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1628,7 +1628,8 @@ static void __br_multicast_send_query(struct net_bridge_mcast *brmctx,
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:
@@ -3875,9 +3876,9 @@ void br_multicast_open(struct net_bridge *br)
__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)
@@ -4028,9 +4029,9 @@ void br_multicast_stop(struct net_bridge *br)
__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)
@@ -4175,6 +4176,9 @@ static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
{
struct net_bridge_port *port;
+ if (!br_multicast_ctx_matches_vlan_snooping(brmctx))
+ return;
+
__br_multicast_open_query(brmctx->br, query);
rcu_read_lock();