Thread (4 messages) 4 messages, 3 authors, 2025-03-10

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

From: Shengyu Qu <hidden>
Date: 2025-03-10 14:13:24
Also in: bridge, lkml

Ping for next version.

在 2025/2/17 20:58, Felix Fietkau 写道:
On 17.02.25 12:54, Nikolay Aleksandrov wrote:
quoted
On 2/17/25 13:26, Felix Fietkau wrote:
quoted
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@nbd.name>
---
 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.
quoted
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
  

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help