]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: bridge: mcast: querier and query state affect only current context type
authorNikolay Aleksandrov <nikolay@nvidia.com>
Tue, 10 Aug 2021 15:29:29 +0000 (18:29 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Aug 2021 12:34:41 +0000 (13:34 +0100)
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>
net/bridge/br_multicast.c
net/bridge/br_private.h

index fe1482efd59c2fb66475d0e8ad40beb94171b662..f30c2e5d31427540d637523b0f7199825bc6bc32 100644 (file)
@@ -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();
index b85203e8eb26e285351eec46dedb129e62f5996c..a1529f0bafcc0e2e0f10f3cf15691e97782f05ed 100644 (file)
@@ -1196,6 +1196,17 @@ br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1,
 #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,