br_multicast.c (74edfd483de8010596d556a2339f9fb8a4ab6688) br_multicast.c (eb1593a0b4c49443acbe2ebaa7a9947fa5471c01)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Bridge multicast support.
4 *
5 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
6 */
7
8#include <linux/err.h>

--- 295 unchanged lines hidden (view full) ---

304 struct br_ip sg_ip;
305
306 if (WARN_ON(!br_multicast_is_star_g(&pg->key.addr)))
307 return;
308
309 mp = br_mdb_ip_get(br, &pg->key.addr);
310 if (!mp)
311 return;
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Bridge multicast support.
4 *
5 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
6 */
7
8#include <linux/err.h>

--- 295 unchanged lines hidden (view full) ---

304 struct br_ip sg_ip;
305
306 if (WARN_ON(!br_multicast_is_star_g(&pg->key.addr)))
307 return;
308
309 mp = br_mdb_ip_get(br, &pg->key.addr);
310 if (!mp)
311 return;
312 pmctx = &pg->key.port->multicast_ctx;
312 pmctx = br_multicast_pg_to_port_ctx(pg);
313 if (!pmctx)
314 return;
313
314 memset(&sg_ip, 0, sizeof(sg_ip));
315 sg_ip = pg->key.addr;
316
317 for (pg_lst = mlock_dereference(mp->ports, br);
318 pg_lst;
319 pg_lst = mlock_dereference(pg_lst->next, br)) {
320 struct net_bridge_group_src *src_ent;

--- 109 unchanged lines hidden (view full) ---

430 if (WARN_ON(br_multicast_is_star_g(&sg->key.addr)))
431 return;
432 if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
433 return;
434
435 br_multicast_sg_host_state(star_mp, sg);
436 memset(&sg_key, 0, sizeof(sg_key));
437 sg_key.addr = sg->key.addr;
315
316 memset(&sg_ip, 0, sizeof(sg_ip));
317 sg_ip = pg->key.addr;
318
319 for (pg_lst = mlock_dereference(mp->ports, br);
320 pg_lst;
321 pg_lst = mlock_dereference(pg_lst->next, br)) {
322 struct net_bridge_group_src *src_ent;

--- 109 unchanged lines hidden (view full) ---

432 if (WARN_ON(br_multicast_is_star_g(&sg->key.addr)))
433 return;
434 if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
435 return;
436
437 br_multicast_sg_host_state(star_mp, sg);
438 memset(&sg_key, 0, sizeof(sg_key));
439 sg_key.addr = sg->key.addr;
438 brmctx = &br->multicast_ctx;
439 /* we need to add all exclude ports to the S,G */
440 for (pg = mlock_dereference(star_mp->ports, br);
441 pg;
442 pg = mlock_dereference(pg->next, br)) {
443 struct net_bridge_port_group *src_pg;
444
445 if (pg == sg || pg->filter_mode == MCAST_INCLUDE)
446 continue;
447
448 sg_key.port = pg->key.port;
449 if (br_sg_port_find(br, &sg_key))
450 continue;
451
440 /* we need to add all exclude ports to the S,G */
441 for (pg = mlock_dereference(star_mp->ports, br);
442 pg;
443 pg = mlock_dereference(pg->next, br)) {
444 struct net_bridge_port_group *src_pg;
445
446 if (pg == sg || pg->filter_mode == MCAST_INCLUDE)
447 continue;
448
449 sg_key.port = pg->key.port;
450 if (br_sg_port_find(br, &sg_key))
451 continue;
452
452 pmctx = &pg->key.port->multicast_ctx;
453 pmctx = br_multicast_pg_to_port_ctx(pg);
454 if (!pmctx)
455 continue;
456 brmctx = br_multicast_port_ctx_get_global(pmctx);
457
453 src_pg = __br_multicast_add_group(brmctx, pmctx,
454 &sg->key.addr,
455 sg->eth_addr,
456 MCAST_INCLUDE, false, false);
457 if (IS_ERR_OR_NULL(src_pg) ||
458 src_pg->rt_protocol != RTPROT_KERNEL)
459 continue;
460 src_pg->flags |= MDB_PG_FLAGS_STAR_EXCL;

--- 7 unchanged lines hidden (view full) ---

468 struct net_bridge_port_group *sg;
469 struct net_bridge_mcast *brmctx;
470 struct br_ip sg_ip;
471
472 if (src->flags & BR_SGRP_F_INSTALLED)
473 return;
474
475 memset(&sg_ip, 0, sizeof(sg_ip));
458 src_pg = __br_multicast_add_group(brmctx, pmctx,
459 &sg->key.addr,
460 sg->eth_addr,
461 MCAST_INCLUDE, false, false);
462 if (IS_ERR_OR_NULL(src_pg) ||
463 src_pg->rt_protocol != RTPROT_KERNEL)
464 continue;
465 src_pg->flags |= MDB_PG_FLAGS_STAR_EXCL;

--- 7 unchanged lines hidden (view full) ---

473 struct net_bridge_port_group *sg;
474 struct net_bridge_mcast *brmctx;
475 struct br_ip sg_ip;
476
477 if (src->flags & BR_SGRP_F_INSTALLED)
478 return;
479
480 memset(&sg_ip, 0, sizeof(sg_ip));
476 pmctx = &src->pg->key.port->multicast_ctx;
481 pmctx = br_multicast_pg_to_port_ctx(src->pg);
482 if (!pmctx)
483 return;
477 brmctx = br_multicast_port_ctx_get_global(pmctx);
478 sg_ip = src->pg->key.addr;
479 sg_ip.src = src->addr.src;
480
481 sg = __br_multicast_add_group(brmctx, pmctx, &sg_ip,
482 src->pg->eth_addr, MCAST_INCLUDE, false,
483 !timer_pending(&src->timer));
484 if (IS_ERR_OR_NULL(sg))

--- 1206 unchanged lines hidden (view full) ---

1691 bool need_rexmit = false;
1692
1693 spin_lock(&br->multicast_lock);
1694 if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
1695 !br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
1696 !br_opt_get(br, BROPT_MULTICAST_QUERIER))
1697 goto out;
1698
484 brmctx = br_multicast_port_ctx_get_global(pmctx);
485 sg_ip = src->pg->key.addr;
486 sg_ip.src = src->addr.src;
487
488 sg = __br_multicast_add_group(brmctx, pmctx, &sg_ip,
489 src->pg->eth_addr, MCAST_INCLUDE, false,
490 !timer_pending(&src->timer));
491 if (IS_ERR_OR_NULL(sg))

--- 1206 unchanged lines hidden (view full) ---

1698 bool need_rexmit = false;
1699
1700 spin_lock(&br->multicast_lock);
1701 if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
1702 !br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
1703 !br_opt_get(br, BROPT_MULTICAST_QUERIER))
1704 goto out;
1705
1699 brmctx = &br->multicast_ctx;
1700 pmctx = &pg->key.port->multicast_ctx;
1706 pmctx = br_multicast_pg_to_port_ctx(pg);
1707 if (!pmctx)
1708 goto out;
1709 brmctx = br_multicast_port_ctx_get_global(pmctx);
1701 if (pg->key.addr.proto == htons(ETH_P_IP))
1702 other_query = &brmctx->ip4_other_query;
1703#if IS_ENABLED(CONFIG_IPV6)
1704 else
1705 other_query = &brmctx->ip6_other_query;
1706#endif
1707
1708 if (!other_query || timer_pending(&other_query->timer))

--- 2932 unchanged lines hidden ---
1710 if (pg->key.addr.proto == htons(ETH_P_IP))
1711 other_query = &brmctx->ip4_other_query;
1712#if IS_ENABLED(CONFIG_IPV6)
1713 else
1714 other_query = &brmctx->ip6_other_query;
1715#endif
1716
1717 if (!other_query || timer_pending(&other_query->timer))

--- 2932 unchanged lines hidden ---