Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: bridge: mcast: when forwarding handle filter mode and blocked flag

We need to avoid forwarding to ports in MCAST_INCLUDE filter mode when the
mdst entry is a *,G or when the port has the blocked flag.

Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Nikolay Aleksandrov and committed by
David S. Miller
36cfec73 094b82fd

+14 -1
+14 -1
net/bridge/br_forward.c
··· 274 274 struct net_bridge *br = netdev_priv(dev); 275 275 struct net_bridge_port *prev = NULL; 276 276 struct net_bridge_port_group *p; 277 + bool allow_mode_include = true; 277 278 struct hlist_node *rp; 278 279 279 280 rp = rcu_dereference(hlist_first_rcu(&br->router_list)); 280 - p = mdst ? rcu_dereference(mdst->ports) : NULL; 281 + if (mdst) { 282 + p = rcu_dereference(mdst->ports); 283 + if (br_multicast_should_handle_mode(br, mdst->addr.proto) && 284 + br_multicast_is_star_g(&mdst->addr)) 285 + allow_mode_include = false; 286 + } else { 287 + p = NULL; 288 + } 289 + 281 290 while (p || rp) { 282 291 struct net_bridge_port *port, *lport, *rport; 283 292 ··· 301 292 local_orig); 302 293 goto delivered; 303 294 } 295 + if ((!allow_mode_include && 296 + p->filter_mode == MCAST_INCLUDE) || 297 + (p->flags & MDB_PG_FLAGS_BLOCKED)) 298 + goto delivered; 304 299 } else { 305 300 port = rport; 306 301 }