Re: [PATCH net] net: bridge: locally receive all multicast packets if IFF_ALLMULTI is set

From: Felix Fietkau
Date: Mon Feb 17 2025 - 08:00:46 EST


On 17.02.25 12:54, Nikolay Aleksandrov wrote:
On 2/17/25 13:26, Felix Fietkau wrote:
If multicast snooping is enabled, multicast packets may not always end up on
the local bridge interface, if the host is not a member of the multicast
group. Similar to how IFF_PROMISC allows all packets to be received locally,
let IFF_ALLMULTI allow all multicast packets to be received.

Signed-off-by: Felix Fietkau <nbd@xxxxxxxx>
---
net/bridge/br_input.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index 232133a0fd21..7fa2da6985b5 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -155,6 +155,8 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
pkt_type = BR_PKT_MULTICAST;
if (br_multicast_rcv(&brmctx, &pmctx, vlan, skb, vid))
goto drop;
+ if (br->dev->flags & IFF_ALLMULTI)
+ local_rcv = true;
}
}

This doesn't look like a bug fix, IMO it should be for net-next.

Also you might miss a mcast stat increase, see the multicast code
below, the only case that this would cover is the missing "else"
branch of:
if ((mdst && mdst->host_joined) ||
br_multicast_is_router(brmctx, skb)) {
local_rcv = true;
DEV_STATS_INC(br->dev, multicast);
}

So I'd suggest to augment the condition and include this ALLMULTI check there,
maybe with a comment to mention that all other cases are covered by the current
code so people are not surprised.
Will do, thanks.

By the way what is the motivation for supporting this flag? I mean you can
make the bridge mcast router and it will receive all mcast anyway.

OpenWrt uses a user space daemon for DHCPv6/RA/NDP handling, and in relay mode it sets the ALLMULTI flag in order to receive all relevant queries on the network.
This works for normal network interfaces and non-snooping bridges, but not snooping bridges (unless, as you pointed out, multicast routing is enabled).

- Felix