From: Ido Schimmel <idosch@nvidia.com>
To: "Linus Lüssing" <linus.luessing@c0d3.blue>
Cc: bridge@lists.linux.dev, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
Nikolay Aleksandrov <razor@blackwall.org>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Simon Horman <horms@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Jakub Kicinski <kuba@kernel.org>,
Eric Dumazet <edumazet@google.com>,
"David S . Miller" <davem@davemloft.net>,
Kuniyuki Iwashima <kuniyu@google.com>,
Stanislav Fomichev <sdf@fomichev.me>,
Xiao Liang <shaw.leon@gmail.com>,
shuah@kernel.org, petrm@nvidia.com
Subject: Re: [PATCH net-next v4 09/14] net: bridge: mcast: track active state, VLAN snooping
Date: Sun, 8 Mar 2026 22:12:50 +0200 [thread overview]
Message-ID: <20260308201250.GA1806274@shredder> (raw)
In-Reply-To: <20260307044548.5230-10-linus.luessing@c0d3.blue>
On Sat, Mar 07, 2026 at 05:45:43AM +0100, Linus Lüssing wrote:
> 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 <linus.luessing@c0d3.blue>
> ---
> net/bridge/br_multicast.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
> index cdc921b97243..1059984d8147 100644
> --- a/net/bridge/br_multicast.c
> +++ b/net/bridge/br_multicast.c
> @@ -1142,9 +1142,31 @@ static void br_multicast_update_active(struct net_bridge_mcast *brmctx)
>
> lockdep_assert_held_once(&brmctx->br->multicast_lock);
>
> - if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
> + if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) {
> force_inactive = true;
> + goto update;
> + }
>
> + 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
> + */
> + else 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;
> + }
> +
> +update:
> br_ip4_multicast_update_active(brmctx, force_inactive);
> br_ip6_multicast_update_active(brmctx, force_inactive);
>
> @@ -4505,6 +4527,7 @@ void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on)
>
> spin_lock_bh(&br->multicast_lock);
> vlan->priv_flags ^= BR_VLFLAG_MCAST_ENABLED;
> + br_multicast_update_active(&vlan->br_mcast_ctx);
>
> if (on)
> __br_multicast_open(&vlan->br_mcast_ctx);
I believe the active state is not disabled when snooping is disabled on
a specific VLAN. AFAICT that's because br_multicast_update_active() is
only called when the VLAN is actually used by the bridge (i.e.,
"brentry"). Can be reproduced with [1]. Please add it as a test case in
patch #2.
Will continue tomorrow.
[1]
#!/bin/bash
for ns in ns0 ns1; do
ip netns del $ns &> /dev/null
ip netns add $ns
ip -n $ns link set dev lo up
done
ip -n ns0 link add name veth0 type veth peer name veth1 netns ns1
ip -n ns0 link add name br0 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1
ip -n ns1 link add name br1 up type bridge vlan_filtering 1 mcast_snooping 1 mcast_vlan_snooping 1
ip -n ns0 link set dev veth0 up master br0
ip -n ns1 link set dev veth1 up master br1
bridge -n ns0 vlan add vid 10 dev veth0 master
bridge -n ns1 vlan add vid 10 dev veth1 master
sleep 1
bridge -n ns0 vlan global set vid 10 dev br0 mcast_snooping 1 mcast_query_response_interval 100 mcast_querier 1
bridge -n ns1 vlan global set vid 10 dev br1 mcast_snooping 1 mcast_query_response_interval 100 mcast_querier 0
sleep 1
bridge -n ns1 -j -p vlan global show dev br1 vid 10 | jq '.[]["vlans"][]["mcast_active_v4"]'
bridge -n ns1 vlan global set vid 10 dev br1 mcast_snooping 0
sleep 1
bridge -n ns1 -j -p vlan global show dev br1 vid 10 | jq '.[]["vlans"][]["mcast_active_v4"]'
next prev parent reply other threads:[~2026-03-08 20:13 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-07 4:45 [PATCH net-next v4 00/14] net: bridge: reduce multicast checks in fast path Linus Lüssing
2026-03-07 4:45 ` [PATCH net-next v4 01/14] net: bridge: mcast: export ip{4,6}_active state to netlink Linus Lüssing
2026-03-07 4:45 ` [PATCH net-next v4 02/14] net: bridge: mcast: track active state, adding tests Linus Lüssing
2026-03-07 4:45 ` [PATCH net-next v4 03/14] net: bridge: mcast: avoid sleeping on bridge-down Linus Lüssing
2026-03-09 12:31 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 04/14] net: bridge: mcast: track active state, IGMP/MLD querier appearance Linus Lüssing
2026-03-09 12:57 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 05/14] net: bridge: mcast: track active state, foreign IGMP/MLD querier disappearance Linus Lüssing
2026-03-07 4:45 ` [PATCH net-next v4 06/14] net: bridge: mcast: track active state, IPv6 address availability Linus Lüssing
2026-03-07 4:45 ` [PATCH net-next v4 07/14] net: bridge: mcast: track active state, own MLD querier disappearance Linus Lüssing
2026-03-09 13:18 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 08/14] net: bridge: mcast: track active state, if snooping is enabled Linus Lüssing
2026-03-09 13:44 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 09/14] net: bridge: mcast: track active state, VLAN snooping Linus Lüssing
2026-03-08 20:12 ` Ido Schimmel [this message]
2026-03-07 4:45 ` [PATCH net-next v4 10/14] net: bridge: mcast: track active state, bridge up/down Linus Lüssing
2026-03-09 15:58 ` Ido Schimmel
2026-03-09 17:49 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 11/14] net: bridge: mcast: track active state, prepare for outside lock reads Linus Lüssing
2026-03-09 16:17 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 12/14] net: bridge: mcast: use combined active state in netlink Linus Lüssing
2026-03-07 4:45 ` [PATCH net-next v4 13/14] net: bridge: mcast: use combined active state in fast/data path Linus Lüssing
2026-03-09 16:51 ` Ido Schimmel
2026-03-07 4:45 ` [PATCH net-next v4 14/14] net: bridge: mcast: add inactive state assertions Linus Lüssing
2026-03-09 17:48 ` Ido Schimmel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260308201250.GA1806274@shredder \
--to=idosch@nvidia.com \
--cc=andrew+netdev@lunn.ch \
--cc=bridge@lists.linux.dev \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=linus.luessing@c0d3.blue \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=petrm@nvidia.com \
--cc=razor@blackwall.org \
--cc=sdf@fomichev.me \
--cc=shaw.leon@gmail.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.