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 --- |