Lines Matching +full:3 +full:br

51 static void br_multicast_start_querier(struct net_bridge *br,
53 static void br_multicast_add_router(struct net_bridge *br,
55 static void br_ip4_multicast_leave_group(struct net_bridge *br,
64 static void br_ip6_multicast_leave_group(struct net_bridge *br,
70 __br_multicast_add_group(struct net_bridge *br,
77 static void br_multicast_find_del_pg(struct net_bridge *br,
81 br_sg_port_find(struct net_bridge *br, in br_sg_port_find() argument
84 lockdep_assert_held_once(&br->multicast_lock); in br_sg_port_find()
86 return rhashtable_lookup_fast(&br->sg_port_tbl, sg_p, in br_sg_port_find()
90 static struct net_bridge_mdb_entry *br_mdb_ip_get_rcu(struct net_bridge *br, in br_mdb_ip_get_rcu() argument
93 return rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params); in br_mdb_ip_get_rcu()
96 struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge *br, in br_mdb_ip_get() argument
101 lockdep_assert_held_once(&br->multicast_lock); in br_mdb_ip_get()
104 ent = rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params); in br_mdb_ip_get()
110 static struct net_bridge_mdb_entry *br_mdb_ip4_get(struct net_bridge *br, in br_mdb_ip4_get() argument
120 return br_mdb_ip_get(br, &br_dst); in br_mdb_ip4_get()
124 static struct net_bridge_mdb_entry *br_mdb_ip6_get(struct net_bridge *br, in br_mdb_ip6_get() argument
135 return br_mdb_ip_get(br, &br_dst); in br_mdb_ip6_get()
139 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, in br_mdb_get() argument
144 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_mdb_get()
157 if (br->multicast_igmp_version == 3) { in br_mdb_get()
161 mdb = br_mdb_ip_get_rcu(br, &ip); in br_mdb_get()
170 if (br->multicast_mld_version == 2) { in br_mdb_get()
174 mdb = br_mdb_ip_get_rcu(br, &ip); in br_mdb_get()
185 return br_mdb_ip_get_rcu(br, &ip); in br_mdb_get()
205 struct net_bridge *br = pg->key.port->br; in __fwd_add_star_excl() local
211 if (br_sg_port_find(br, &sg_key)) in __fwd_add_star_excl()
214 src_pg = __br_multicast_add_group(br, pg->key.port, sg_ip, pg->eth_addr, in __fwd_add_star_excl()
227 struct net_bridge *br = pg->key.port->br; in __fwd_del_star_excl() local
233 src_pg = br_sg_port_find(br, &sg_key); in __fwd_del_star_excl()
238 br_multicast_find_del_pg(br, src_pg); in __fwd_del_star_excl()
252 struct net_bridge *br = pg->key.port->br; in br_multicast_star_g_handle_mode() local
260 mp = br_mdb_ip_get(br, &pg->key.addr); in br_multicast_star_g_handle_mode()
266 for (pg_lst = mlock_dereference(mp->ports, br); in br_multicast_star_g_handle_mode()
268 pg_lst = mlock_dereference(pg_lst->next, br)) { in br_multicast_star_g_handle_mode()
300 sg_mp = br_mdb_ip_get(star_mp->br, &sg->key.addr); in br_multicast_sg_host_state()
309 struct net_bridge *br = star_mp->br; in br_multicast_star_g_host_state() local
319 for (pg = mlock_dereference(star_mp->ports, br); in br_multicast_star_g_host_state()
321 pg = mlock_dereference(pg->next, br)) { in br_multicast_star_g_host_state()
328 sg_mp = br_mdb_ip_get(br, &sg_ip); in br_multicast_star_g_host_state()
349 (p = mlock_dereference(*pp, sgmp->br)) != NULL; in br_multicast_sg_del_exclude_ports()
362 (p = mlock_dereference(*pp, sgmp->br)) != NULL;) { in br_multicast_sg_del_exclude_ports()
374 struct net_bridge *br = star_mp->br; in br_multicast_sg_add_exclude_ports() local
386 for (pg = mlock_dereference(star_mp->ports, br); in br_multicast_sg_add_exclude_ports()
388 pg = mlock_dereference(pg->next, br)) { in br_multicast_sg_add_exclude_ports()
395 if (br_sg_port_find(br, &sg_key)) in br_multicast_sg_add_exclude_ports()
398 src_pg = __br_multicast_add_group(br, pg->key.port, in br_multicast_sg_add_exclude_ports()
421 sg = __br_multicast_add_group(src->br, src->pg->key.port, &sg_ip, in br_multicast_fwd_src_add()
436 star_mp = br_mdb_ip_get(src->br, &src->pg->key.addr); in br_multicast_fwd_src_add()
454 mp = br_mdb_ip_get(src->br, &sg_ip); in br_multicast_fwd_src_remove()
459 (p = mlock_dereference(*pp, src->br)) != NULL; in br_multicast_fwd_src_remove()
488 sg = br_sg_port_find(src->br, &sg_key); in br_multicast_fwd_src_handle()
501 sg_mp = br_mdb_ip_get(src->br, &sg_key.addr); in br_multicast_fwd_src_handle()
504 br_mdb_notify(src->br->dev, sg_mp, sg, RTM_NEWMDB); in br_multicast_fwd_src_handle()
522 struct net_bridge *br = mp->br; in br_multicast_del_mdb_entry() local
524 rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode, in br_multicast_del_mdb_entry()
527 hlist_add_head(&mp->mcast_gc.gc_node, &br->mcast_gc_list); in br_multicast_del_mdb_entry()
528 queue_work(system_long_wq, &br->mcast_gc_work); in br_multicast_del_mdb_entry()
534 struct net_bridge *br = mp->br; in br_multicast_group_expired() local
536 spin_lock(&br->multicast_lock); in br_multicast_group_expired()
537 if (hlist_unhashed(&mp->mdb_node) || !netif_running(br->dev) || in br_multicast_group_expired()
547 spin_unlock(&br->multicast_lock); in br_multicast_group_expired()
563 struct net_bridge *br = src->pg->key.port->br; in br_multicast_del_group_src() local
568 hlist_add_head(&src->mcast_gc.gc_node, &br->mcast_gc_list); in br_multicast_del_group_src()
569 queue_work(system_long_wq, &br->mcast_gc_work); in br_multicast_del_group_src()
589 struct net_bridge *br = pg->key.port->br; in br_multicast_del_pg() local
597 br_mdb_notify(br->dev, mp, pg, RTM_DELMDB); in br_multicast_del_pg()
599 rhashtable_remove_fast(&br->sg_port_tbl, &pg->rhnode, in br_multicast_del_pg()
605 hlist_add_head(&pg->mcast_gc.gc_node, &br->mcast_gc_list); in br_multicast_del_pg()
606 queue_work(system_long_wq, &br->mcast_gc_work); in br_multicast_del_pg()
608 if (!mp->ports && !mp->host_joined && netif_running(br->dev)) in br_multicast_del_pg()
612 static void br_multicast_find_del_pg(struct net_bridge *br, in br_multicast_find_del_pg() argument
619 mp = br_mdb_ip_get(br, &pg->key.addr); in br_multicast_find_del_pg()
624 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_find_del_pg()
640 struct net_bridge *br = pg->key.port->br; in br_multicast_port_group_expired() local
644 spin_lock(&br->multicast_lock); in br_multicast_port_group_expired()
645 if (!netif_running(br->dev) || timer_pending(&pg->timer) || in br_multicast_port_group_expired()
659 br_multicast_find_del_pg(br, pg); in br_multicast_port_group_expired()
661 struct net_bridge_mdb_entry *mp = br_mdb_ip_get(br, &pg->key.addr); in br_multicast_port_group_expired()
668 br_mdb_notify(br->dev, mp, pg, RTM_NEWMDB); in br_multicast_port_group_expired()
671 spin_unlock(&br->multicast_lock); in br_multicast_port_group_expired()
685 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br, in br_ip4_multicast_alloc_query() argument
707 if (br->multicast_igmp_version == 3) { in br_ip4_multicast_alloc_query()
710 lmqt = now + (br->multicast_last_member_interval * in br_ip4_multicast_alloc_query()
711 br->multicast_last_member_count); in br_ip4_multicast_alloc_query()
727 pkt_size > br->dev->mtu) in br_ip4_multicast_alloc_query()
730 skb = netdev_alloc_skb_ip_align(br->dev, pkt_size); in br_ip4_multicast_alloc_query()
739 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip4_multicast_alloc_query()
755 iph->saddr = br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR) ? in br_ip4_multicast_alloc_query()
756 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0; in br_ip4_multicast_alloc_query()
761 ((u8 *)&iph[1])[3] = 0; in br_ip4_multicast_alloc_query()
768 switch (br->multicast_igmp_version) { in br_ip4_multicast_alloc_query()
772 ih->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
773 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
780 case 3: in br_ip4_multicast_alloc_query()
783 ihv3->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
784 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
787 ihv3->qqic = br->multicast_query_interval / HZ; in br_ip4_multicast_alloc_query()
830 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, in br_ip6_multicast_alloc_query() argument
855 if (br->multicast_mld_version == 2) { in br_ip6_multicast_alloc_query()
858 llqt = now + (br->multicast_last_member_interval * in br_ip6_multicast_alloc_query()
859 br->multicast_last_member_count); in br_ip6_multicast_alloc_query()
875 pkt_size > br->dev->mtu) in br_ip6_multicast_alloc_query()
878 skb = netdev_alloc_skb_ip_align(br->dev, pkt_size); in br_ip6_multicast_alloc_query()
888 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip6_multicast_alloc_query()
901 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, in br_ip6_multicast_alloc_query()
904 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, false); in br_ip6_multicast_alloc_query()
908 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true); in br_ip6_multicast_alloc_query()
915 hopopt[3] = 2; /* Length of RA Option */ in br_ip6_multicast_alloc_query()
926 br->multicast_query_response_interval : in br_ip6_multicast_alloc_query()
927 br->multicast_last_member_interval; in br_ip6_multicast_alloc_query()
929 switch (br->multicast_mld_version) { in br_ip6_multicast_alloc_query()
952 mld2q->mld2q_qqic = br->multicast_query_interval / HZ; in br_ip6_multicast_alloc_query()
993 static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br, in br_multicast_alloc_query() argument
1006 return br_ip4_multicast_alloc_query(br, pg, in br_multicast_alloc_query()
1021 return br_ip6_multicast_alloc_query(br, pg, in br_multicast_alloc_query()
1032 struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br, in br_multicast_new_group() argument
1038 mp = br_mdb_ip_get(br, group); in br_multicast_new_group()
1042 if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) { in br_multicast_new_group()
1043 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false); in br_multicast_new_group()
1051 mp->br = br; in br_multicast_new_group()
1055 err = rhashtable_lookup_insert_fast(&br->mdb_hash_tbl, &mp->rhnode, in br_multicast_new_group()
1061 hlist_add_head_rcu(&mp->mdb_node, &br->mdb_list); in br_multicast_new_group()
1071 struct net_bridge *br = src->br; in br_multicast_group_src_expired() local
1073 spin_lock(&br->multicast_lock); in br_multicast_group_src_expired()
1074 if (hlist_unhashed(&src->node) || !netif_running(br->dev) || in br_multicast_group_src_expired()
1083 br_multicast_find_del_pg(br, pg); in br_multicast_group_src_expired()
1089 spin_unlock(&br->multicast_lock); in br_multicast_group_src_expired()
1143 grp_src->br = pg->key.port->br; in br_multicast_new_group_src()
1178 rhashtable_lookup_insert_fast(&port->br->sg_port_tbl, &p->rhnode, in br_multicast_new_port_group()
1204 br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB); in br_multicast_host_join()
1206 mod_timer(&mp->timer, jiffies + mp->br->multicast_membership_interval); in br_multicast_host_join()
1218 br_mdb_notify(mp->br->dev, mp, NULL, RTM_DELMDB); in br_multicast_host_leave()
1222 __br_multicast_add_group(struct net_bridge *br, in __br_multicast_add_group() argument
1235 if (!netif_running(br->dev) || in __br_multicast_add_group()
1239 mp = br_multicast_new_group(br, group); in __br_multicast_add_group()
1249 (p = mlock_dereference(*pp, br)) != NULL; in __br_multicast_add_group()
1266 br_mdb_notify(br->dev, mp, p, RTM_NEWMDB); in __br_multicast_add_group()
1270 mod_timer(&p->timer, now + br->multicast_membership_interval); in __br_multicast_add_group()
1276 static int br_multicast_add_group(struct net_bridge *br, in br_multicast_add_group() argument
1286 spin_lock(&br->multicast_lock); in br_multicast_add_group()
1287 pg = __br_multicast_add_group(br, port, group, src, filter_mode, in br_multicast_add_group()
1291 spin_unlock(&br->multicast_lock); in br_multicast_add_group()
1296 static int br_ip4_multicast_add_group(struct net_bridge *br, in br_ip4_multicast_add_group() argument
1315 return br_multicast_add_group(br, port, &br_group, src, filter_mode, in br_ip4_multicast_add_group()
1320 static int br_ip6_multicast_add_group(struct net_bridge *br, in br_ip6_multicast_add_group() argument
1339 return br_multicast_add_group(br, port, &br_group, src, filter_mode, in br_ip6_multicast_add_group()
1348 struct net_bridge *br = port->br; in br_multicast_router_expired() local
1350 spin_lock(&br->multicast_lock); in br_multicast_router_expired()
1358 spin_unlock(&br->multicast_lock); in br_multicast_router_expired()
1376 struct net_bridge *br = from_timer(br, t, multicast_router_timer); in br_multicast_local_router_expired() local
1378 spin_lock(&br->multicast_lock); in br_multicast_local_router_expired()
1379 if (br->multicast_router == MDB_RTR_TYPE_DISABLED || in br_multicast_local_router_expired()
1380 br->multicast_router == MDB_RTR_TYPE_PERM || in br_multicast_local_router_expired()
1381 timer_pending(&br->multicast_router_timer)) in br_multicast_local_router_expired()
1384 br_mc_router_state_change(br, false); in br_multicast_local_router_expired()
1386 spin_unlock(&br->multicast_lock); in br_multicast_local_router_expired()
1389 static void br_multicast_querier_expired(struct net_bridge *br, in br_multicast_querier_expired() argument
1392 spin_lock(&br->multicast_lock); in br_multicast_querier_expired()
1393 if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_querier_expired()
1396 br_multicast_start_querier(br, query); in br_multicast_querier_expired()
1399 spin_unlock(&br->multicast_lock); in br_multicast_querier_expired()
1404 struct net_bridge *br = from_timer(br, t, ip4_other_query.timer); in br_ip4_multicast_querier_expired() local
1406 br_multicast_querier_expired(br, &br->ip4_own_query); in br_ip4_multicast_querier_expired()
1412 struct net_bridge *br = from_timer(br, t, ip6_other_query.timer); in br_ip6_multicast_querier_expired() local
1414 br_multicast_querier_expired(br, &br->ip6_own_query); in br_ip6_multicast_querier_expired()
1418 static void br_multicast_select_own_querier(struct net_bridge *br, in br_multicast_select_own_querier() argument
1423 br->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr; in br_multicast_select_own_querier()
1426 br->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr; in br_multicast_select_own_querier()
1430 static void __br_multicast_send_query(struct net_bridge *br, in __br_multicast_send_query() argument
1444 skb = br_multicast_alloc_query(br, pg, ip_dst, group, with_srcs, in __br_multicast_send_query()
1452 br_multicast_count(br, port, skb, igmp_type, in __br_multicast_send_query()
1463 br_multicast_select_own_querier(br, group, skb); in __br_multicast_send_query()
1464 br_multicast_count(br, port, skb, igmp_type, in __br_multicast_send_query()
1470 static void br_multicast_send_query(struct net_bridge *br, in br_multicast_send_query() argument
1478 if (!netif_running(br->dev) || in br_multicast_send_query()
1479 !br_opt_get(br, BROPT_MULTICAST_ENABLED) || in br_multicast_send_query()
1480 !br_opt_get(br, BROPT_MULTICAST_QUERIER)) in br_multicast_send_query()
1486 (own_query == &br->ip4_own_query)) { in br_multicast_send_query()
1487 other_query = &br->ip4_other_query; in br_multicast_send_query()
1491 other_query = &br->ip6_other_query; in br_multicast_send_query()
1499 __br_multicast_send_query(br, port, NULL, NULL, &br_group, false, 0, in br_multicast_send_query()
1503 time += own_query->startup_sent < br->multicast_startup_query_count ? in br_multicast_send_query()
1504 br->multicast_startup_query_interval : in br_multicast_send_query()
1505 br->multicast_query_interval; in br_multicast_send_query()
1513 struct net_bridge *br = port->br; in br_multicast_port_query_expired() local
1515 spin_lock(&br->multicast_lock); in br_multicast_port_query_expired()
1520 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_port_query_expired()
1523 br_multicast_send_query(port->br, port, query); in br_multicast_port_query_expired()
1526 spin_unlock(&br->multicast_lock); in br_multicast_port_query_expired()
1549 struct net_bridge *br = pg->key.port->br; in br_multicast_port_group_rexmit() local
1552 spin_lock(&br->multicast_lock); in br_multicast_port_group_rexmit()
1553 if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) || in br_multicast_port_group_rexmit()
1554 !br_opt_get(br, BROPT_MULTICAST_ENABLED) || in br_multicast_port_group_rexmit()
1555 !br_opt_get(br, BROPT_MULTICAST_QUERIER)) in br_multicast_port_group_rexmit()
1559 other_query = &br->ip4_other_query; in br_multicast_port_group_rexmit()
1562 other_query = &br->ip6_other_query; in br_multicast_port_group_rexmit()
1570 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, in br_multicast_port_group_rexmit()
1573 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, in br_multicast_port_group_rexmit()
1578 br->multicast_last_member_interval); in br_multicast_port_group_rexmit()
1580 spin_unlock(&br->multicast_lock); in br_multicast_port_group_rexmit()
1608 br_opt_get(port->br, BROPT_MULTICAST_ENABLED)); in br_multicast_add_port()
1619 struct net_bridge *br = port->br; in br_multicast_del_port() local
1625 spin_lock_bh(&br->multicast_lock); in br_multicast_del_port()
1627 br_multicast_find_del_pg(br, pg); in br_multicast_del_port()
1628 hlist_move_list(&br->mcast_gc_list, &deleted_head); in br_multicast_del_port()
1629 spin_unlock_bh(&br->multicast_lock); in br_multicast_del_port()
1646 struct net_bridge *br = port->br; in __br_multicast_enable_port() local
1648 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) || !netif_running(br->dev)) in __br_multicast_enable_port()
1657 br_multicast_add_router(br, port); in __br_multicast_enable_port()
1662 struct net_bridge *br = port->br; in br_multicast_enable_port() local
1664 spin_lock(&br->multicast_lock); in br_multicast_enable_port()
1666 spin_unlock(&br->multicast_lock); in br_multicast_enable_port()
1671 struct net_bridge *br = port->br; in br_multicast_disable_port() local
1675 spin_lock(&br->multicast_lock); in br_multicast_disable_port()
1678 br_multicast_find_del_pg(br, pg); in br_multicast_disable_port()
1687 spin_unlock(&br->multicast_lock); in br_multicast_disable_port()
1715 struct net_bridge *br = pg->key.port->br; in __grp_src_query_marked_and_rexmit() local
1716 u32 lmqc = br->multicast_last_member_count; in __grp_src_query_marked_and_rexmit()
1720 if (!netif_running(br->dev) || in __grp_src_query_marked_and_rexmit()
1721 !br_opt_get(br, BROPT_MULTICAST_ENABLED)) in __grp_src_query_marked_and_rexmit()
1725 other_query = &br->ip4_other_query; in __grp_src_query_marked_and_rexmit()
1728 other_query = &br->ip6_other_query; in __grp_src_query_marked_and_rexmit()
1731 lmqt = now + br_multicast_lmqt(br); in __grp_src_query_marked_and_rexmit()
1736 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) && in __grp_src_query_marked_and_rexmit()
1745 if (!br_opt_get(br, BROPT_MULTICAST_QUERIER) || in __grp_src_query_marked_and_rexmit()
1749 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, in __grp_src_query_marked_and_rexmit()
1752 lmi = now + br->multicast_last_member_interval; in __grp_src_query_marked_and_rexmit()
1761 struct net_bridge *br = pg->key.port->br; in __grp_send_query_and_rexmit() local
1764 if (!netif_running(br->dev) || in __grp_send_query_and_rexmit()
1765 !br_opt_get(br, BROPT_MULTICAST_ENABLED)) in __grp_send_query_and_rexmit()
1769 other_query = &br->ip4_other_query; in __grp_send_query_and_rexmit()
1772 other_query = &br->ip6_other_query; in __grp_send_query_and_rexmit()
1775 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) && in __grp_send_query_and_rexmit()
1777 lmi = now + br->multicast_last_member_interval; in __grp_send_query_and_rexmit()
1778 pg->grp_query_rexmit_cnt = br->multicast_last_member_count - 1; in __grp_send_query_and_rexmit()
1779 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, in __grp_send_query_and_rexmit()
1788 time_after(pg->timer.expires, now + br_multicast_lmqt(br)))) in __grp_send_query_and_rexmit()
1789 mod_timer(&pg->timer, now + br_multicast_lmqt(br)); in __grp_send_query_and_rexmit()
1800 struct net_bridge *br = pg->key.port->br; in br_multicast_isinc_allow() local
1819 __grp_src_mod_timer(ent, now + br_multicast_gmi(br)); in br_multicast_isinc_allow()
1867 struct net_bridge *br = pg->key.port->br; in __grp_src_isexc_excl() local
1888 now + br_multicast_gmi(br)); in __grp_src_isexc_excl()
1904 struct net_bridge *br = pg->key.port->br; in br_multicast_isexc() local
1919 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br)); in br_multicast_isexc()
1931 struct net_bridge *br = pg->key.port->br; in __grp_src_toin_incl() local
1955 __grp_src_mod_timer(ent, now + br_multicast_gmi(br)); in __grp_src_toin_incl()
1973 struct net_bridge *br = pg->key.port->br; in __grp_src_toin_excl() local
2000 __grp_src_mod_timer(ent, now + br_multicast_gmi(br)); in __grp_src_toin_excl()
2117 struct net_bridge *br = pg->key.port->br; in br_multicast_toex() local
2132 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br)); in br_multicast_toex()
2166 br_multicast_find_del_pg(pg->key.port->br, pg); in __grp_src_block_incl()
2231 struct net_bridge *br __maybe_unused = mp->br; in br_multicast_find_port()
2234 for (pg = mlock_dereference(mp->ports, br); in br_multicast_find_port()
2236 pg = mlock_dereference(pg->next, br)) in br_multicast_find_port()
2243 static int br_ip4_multicast_igmp3_report(struct net_bridge *br, in br_ip4_multicast_igmp3_report() argument
2248 bool igmpv2 = br->multicast_igmp_version == 2; in br_ip4_multicast_igmp3_report()
2296 br_ip4_multicast_leave_group(br, port, group, vid, src); in br_ip4_multicast_igmp3_report()
2300 err = br_ip4_multicast_add_group(br, port, group, vid, in br_ip4_multicast_igmp3_report()
2309 spin_lock_bh(&br->multicast_lock); in br_ip4_multicast_igmp3_report()
2310 mdst = br_mdb_ip4_get(br, group, vid); in br_ip4_multicast_igmp3_report()
2345 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB); in br_ip4_multicast_igmp3_report()
2347 spin_unlock_bh(&br->multicast_lock); in br_ip4_multicast_igmp3_report()
2354 static int br_ip6_multicast_mld2_report(struct net_bridge *br, in br_ip6_multicast_mld2_report() argument
2359 bool mldv1 = br->multicast_mld_version == 1; in br_ip6_multicast_mld2_report()
2420 br_ip6_multicast_leave_group(br, port, in br_ip6_multicast_mld2_report()
2426 err = br_ip6_multicast_add_group(br, port, in br_ip6_multicast_mld2_report()
2436 spin_lock_bh(&br->multicast_lock); in br_ip6_multicast_mld2_report()
2437 mdst = br_mdb_ip6_get(br, &grec->grec_mca, vid); in br_ip6_multicast_mld2_report()
2471 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB); in br_ip6_multicast_mld2_report()
2473 spin_unlock_bh(&br->multicast_lock); in br_ip6_multicast_mld2_report()
2480 static bool br_ip4_multicast_select_querier(struct net_bridge *br, in br_ip4_multicast_select_querier() argument
2484 if (!timer_pending(&br->ip4_own_query.timer) && in br_ip4_multicast_select_querier()
2485 !timer_pending(&br->ip4_other_query.timer)) in br_ip4_multicast_select_querier()
2488 if (!br->ip4_querier.addr.src.ip4) in br_ip4_multicast_select_querier()
2491 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.src.ip4)) in br_ip4_multicast_select_querier()
2497 br->ip4_querier.addr.src.ip4 = saddr; in br_ip4_multicast_select_querier()
2500 rcu_assign_pointer(br->ip4_querier.port, port); in br_ip4_multicast_select_querier()
2506 static bool br_ip6_multicast_select_querier(struct net_bridge *br, in br_ip6_multicast_select_querier() argument
2510 if (!timer_pending(&br->ip6_own_query.timer) && in br_ip6_multicast_select_querier()
2511 !timer_pending(&br->ip6_other_query.timer)) in br_ip6_multicast_select_querier()
2514 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.src.ip6) <= 0) in br_ip6_multicast_select_querier()
2520 br->ip6_querier.addr.src.ip6 = *saddr; in br_ip6_multicast_select_querier()
2523 rcu_assign_pointer(br->ip6_querier.port, port); in br_ip6_multicast_select_querier()
2529 static bool br_multicast_select_querier(struct net_bridge *br, in br_multicast_select_querier() argument
2535 return br_ip4_multicast_select_querier(br, port, saddr->src.ip4); in br_multicast_select_querier()
2538 return br_ip6_multicast_select_querier(br, port, &saddr->src.ip6); in br_multicast_select_querier()
2546 br_multicast_update_query_timer(struct net_bridge *br, in br_multicast_update_query_timer() argument
2553 mod_timer(&query->timer, jiffies + br->multicast_querier_interval); in br_multicast_update_query_timer()
2572 * and locked by br->multicast_lock and RCU
2574 static void br_multicast_add_router(struct net_bridge *br, in br_multicast_add_router() argument
2583 hlist_for_each_entry(p, &br->router_list, rlist) { in br_multicast_add_router()
2592 hlist_add_head_rcu(&port->rlist, &br->router_list); in br_multicast_add_router()
2593 br_rtr_notify(br->dev, port, RTM_NEWMDB); in br_multicast_add_router()
2597 static void br_multicast_mark_router(struct net_bridge *br, in br_multicast_mark_router() argument
2603 if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { in br_multicast_mark_router()
2604 if (!timer_pending(&br->multicast_router_timer)) in br_multicast_mark_router()
2605 br_mc_router_state_change(br, true); in br_multicast_mark_router()
2606 mod_timer(&br->multicast_router_timer, in br_multicast_mark_router()
2607 now + br->multicast_querier_interval); in br_multicast_mark_router()
2616 br_multicast_add_router(br, port); in br_multicast_mark_router()
2619 now + br->multicast_querier_interval); in br_multicast_mark_router()
2622 static void br_multicast_query_received(struct net_bridge *br, in br_multicast_query_received() argument
2628 if (!br_multicast_select_querier(br, port, saddr)) in br_multicast_query_received()
2631 br_multicast_update_query_timer(br, query, max_delay); in br_multicast_query_received()
2632 br_multicast_mark_router(br, port); in br_multicast_query_received()
2635 static void br_ip4_multicast_query(struct net_bridge *br, in br_ip4_multicast_query() argument
2652 spin_lock(&br->multicast_lock); in br_ip4_multicast_query()
2653 if (!netif_running(br->dev) || in br_ip4_multicast_query()
2669 (br->multicast_igmp_version == 3 && group && ih3->suppress)) in br_ip4_multicast_query()
2682 br_multicast_query_received(br, port, &br->ip4_other_query, in br_ip4_multicast_query()
2687 mp = br_mdb_ip4_get(br, group, vid); in br_ip4_multicast_query()
2691 max_delay *= br->multicast_last_member_count; in br_ip4_multicast_query()
2700 (p = mlock_dereference(*pp, br)) != NULL; in br_ip4_multicast_query()
2705 (br->multicast_igmp_version == 2 || in br_ip4_multicast_query()
2711 spin_unlock(&br->multicast_lock); in br_ip4_multicast_query()
2715 static int br_ip6_multicast_query(struct net_bridge *br, in br_ip6_multicast_query() argument
2734 spin_lock(&br->multicast_lock); in br_ip6_multicast_query()
2735 if (!netif_running(br->dev) || in br_ip6_multicast_query()
2756 if (br->multicast_mld_version == 2 && in br_ip6_multicast_query()
2770 br_multicast_query_received(br, port, &br->ip6_other_query, in br_ip6_multicast_query()
2777 mp = br_mdb_ip6_get(br, group, vid); in br_ip6_multicast_query()
2781 max_delay *= br->multicast_last_member_count; in br_ip6_multicast_query()
2789 (p = mlock_dereference(*pp, br)) != NULL; in br_ip6_multicast_query()
2794 (br->multicast_mld_version == 1 || in br_ip6_multicast_query()
2800 spin_unlock(&br->multicast_lock); in br_ip6_multicast_query()
2806 br_multicast_leave_group(struct net_bridge *br, in br_multicast_leave_group() argument
2818 spin_lock(&br->multicast_lock); in br_multicast_leave_group()
2819 if (!netif_running(br->dev) || in br_multicast_leave_group()
2823 mp = br_mdb_ip_get(br, group); in br_multicast_leave_group()
2831 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_leave_group()
2848 if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) { in br_multicast_leave_group()
2849 __br_multicast_send_query(br, port, NULL, NULL, &mp->addr, in br_multicast_leave_group()
2852 time = jiffies + br->multicast_last_member_count * in br_multicast_leave_group()
2853 br->multicast_last_member_interval; in br_multicast_leave_group()
2857 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
2859 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
2875 time = now + br->multicast_last_member_count * in br_multicast_leave_group()
2876 br->multicast_last_member_interval; in br_multicast_leave_group()
2889 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
2891 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
2905 spin_unlock(&br->multicast_lock); in br_multicast_leave_group()
2908 static void br_ip4_multicast_leave_group(struct net_bridge *br, in br_ip4_multicast_leave_group() argument
2920 own_query = port ? &port->ip4_own_query : &br->ip4_own_query; in br_ip4_multicast_leave_group()
2927 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query, in br_ip4_multicast_leave_group()
2932 static void br_ip6_multicast_leave_group(struct net_bridge *br, in br_ip6_multicast_leave_group() argument
2944 own_query = port ? &port->ip6_own_query : &br->ip6_own_query; in br_ip6_multicast_leave_group()
2951 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, in br_ip6_multicast_leave_group()
2956 static void br_multicast_err_count(const struct net_bridge *br, in br_multicast_err_count() argument
2963 if (!br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED)) in br_multicast_err_count()
2969 stats = br->mcast_stats; in br_multicast_err_count()
2989 static void br_multicast_pim(struct net_bridge *br, in br_multicast_pim() argument
3001 br_multicast_mark_router(br, port); in br_multicast_pim()
3004 static int br_ip4_multicast_mrd_rcv(struct net_bridge *br, in br_ip4_multicast_mrd_rcv() argument
3012 br_multicast_mark_router(br, port); in br_ip4_multicast_mrd_rcv()
3017 static int br_multicast_ipv4_rcv(struct net_bridge *br, in br_multicast_ipv4_rcv() argument
3033 br_multicast_pim(br, port, skb); in br_multicast_ipv4_rcv()
3035 br_ip4_multicast_mrd_rcv(br, port, skb); in br_multicast_ipv4_rcv()
3040 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv4_rcv()
3052 err = br_ip4_multicast_add_group(br, port, ih->group, vid, src, in br_multicast_ipv4_rcv()
3056 err = br_ip4_multicast_igmp3_report(br, port, skb, vid); in br_multicast_ipv4_rcv()
3059 br_ip4_multicast_query(br, port, skb, vid); in br_multicast_ipv4_rcv()
3062 br_ip4_multicast_leave_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
3066 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv4_rcv()
3073 static int br_ip6_multicast_mrd_rcv(struct net_bridge *br, in br_ip6_multicast_mrd_rcv() argument
3089 br_multicast_mark_router(br, port); in br_ip6_multicast_mrd_rcv()
3094 static int br_multicast_ipv6_rcv(struct net_bridge *br, in br_multicast_ipv6_rcv() argument
3110 err = br_ip6_multicast_mrd_rcv(br, port, skb); in br_multicast_ipv6_rcv()
3113 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv6_rcv()
3120 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv6_rcv()
3131 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, in br_multicast_ipv6_rcv()
3135 err = br_ip6_multicast_mld2_report(br, port, skb, vid); in br_multicast_ipv6_rcv()
3138 err = br_ip6_multicast_query(br, port, skb, vid); in br_multicast_ipv6_rcv()
3142 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src); in br_multicast_ipv6_rcv()
3146 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv6_rcv()
3153 int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, in br_multicast_rcv() argument
3161 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_rcv()
3166 ret = br_multicast_ipv4_rcv(br, port, skb, vid); in br_multicast_rcv()
3170 ret = br_multicast_ipv6_rcv(br, port, skb, vid); in br_multicast_rcv()
3178 static void br_multicast_query_expired(struct net_bridge *br, in br_multicast_query_expired() argument
3182 spin_lock(&br->multicast_lock); in br_multicast_query_expired()
3183 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_query_expired()
3187 br_multicast_send_query(br, NULL, query); in br_multicast_query_expired()
3188 spin_unlock(&br->multicast_lock); in br_multicast_query_expired()
3193 struct net_bridge *br = from_timer(br, t, ip4_own_query.timer); in br_ip4_multicast_query_expired() local
3195 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier); in br_ip4_multicast_query_expired()
3201 struct net_bridge *br = from_timer(br, t, ip6_own_query.timer); in br_ip6_multicast_query_expired() local
3203 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier); in br_ip6_multicast_query_expired()
3209 struct net_bridge *br = container_of(work, struct net_bridge, in br_multicast_gc_work() local
3213 spin_lock_bh(&br->multicast_lock); in br_multicast_gc_work()
3214 hlist_move_list(&br->mcast_gc_list, &deleted_head); in br_multicast_gc_work()
3215 spin_unlock_bh(&br->multicast_lock); in br_multicast_gc_work()
3220 void br_multicast_init(struct net_bridge *br) in br_multicast_init() argument
3222 br->hash_max = BR_MULTICAST_DEFAULT_HASH_MAX; in br_multicast_init()
3224 br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; in br_multicast_init()
3225 br->multicast_last_member_count = 2; in br_multicast_init()
3226 br->multicast_startup_query_count = 2; in br_multicast_init()
3228 br->multicast_last_member_interval = HZ; in br_multicast_init()
3229 br->multicast_query_response_interval = 10 * HZ; in br_multicast_init()
3230 br->multicast_startup_query_interval = 125 * HZ / 4; in br_multicast_init()
3231 br->multicast_query_interval = 125 * HZ; in br_multicast_init()
3232 br->multicast_querier_interval = 255 * HZ; in br_multicast_init()
3233 br->multicast_membership_interval = 260 * HZ; in br_multicast_init()
3235 br->ip4_other_query.delay_time = 0; in br_multicast_init()
3236 br->ip4_querier.port = NULL; in br_multicast_init()
3237 br->multicast_igmp_version = 2; in br_multicast_init()
3239 br->multicast_mld_version = 1; in br_multicast_init()
3240 br->ip6_other_query.delay_time = 0; in br_multicast_init()
3241 br->ip6_querier.port = NULL; in br_multicast_init()
3243 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, true); in br_multicast_init()
3244 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true); in br_multicast_init()
3246 spin_lock_init(&br->multicast_lock); in br_multicast_init()
3247 timer_setup(&br->multicast_router_timer, in br_multicast_init()
3249 timer_setup(&br->ip4_other_query.timer, in br_multicast_init()
3251 timer_setup(&br->ip4_own_query.timer, in br_multicast_init()
3254 timer_setup(&br->ip6_other_query.timer, in br_multicast_init()
3256 timer_setup(&br->ip6_own_query.timer, in br_multicast_init()
3259 INIT_HLIST_HEAD(&br->mdb_list); in br_multicast_init()
3260 INIT_HLIST_HEAD(&br->mcast_gc_list); in br_multicast_init()
3261 INIT_WORK(&br->mcast_gc_work, br_multicast_gc_work); in br_multicast_init()
3264 static void br_ip4_multicast_join_snoopers(struct net_bridge *br) in br_ip4_multicast_join_snoopers() argument
3266 struct in_device *in_dev = in_dev_get(br->dev); in br_ip4_multicast_join_snoopers()
3276 static void br_ip6_multicast_join_snoopers(struct net_bridge *br) in br_ip6_multicast_join_snoopers() argument
3281 ipv6_dev_mc_inc(br->dev, &addr); in br_ip6_multicast_join_snoopers()
3284 static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br) in br_ip6_multicast_join_snoopers() argument
3289 void br_multicast_join_snoopers(struct net_bridge *br) in br_multicast_join_snoopers() argument
3291 br_ip4_multicast_join_snoopers(br); in br_multicast_join_snoopers()
3292 br_ip6_multicast_join_snoopers(br); in br_multicast_join_snoopers()
3295 static void br_ip4_multicast_leave_snoopers(struct net_bridge *br) in br_ip4_multicast_leave_snoopers() argument
3297 struct in_device *in_dev = in_dev_get(br->dev); in br_ip4_multicast_leave_snoopers()
3307 static void br_ip6_multicast_leave_snoopers(struct net_bridge *br) in br_ip6_multicast_leave_snoopers() argument
3312 ipv6_dev_mc_dec(br->dev, &addr); in br_ip6_multicast_leave_snoopers()
3315 static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br) in br_ip6_multicast_leave_snoopers() argument
3320 void br_multicast_leave_snoopers(struct net_bridge *br) in br_multicast_leave_snoopers() argument
3322 br_ip4_multicast_leave_snoopers(br); in br_multicast_leave_snoopers()
3323 br_ip6_multicast_leave_snoopers(br); in br_multicast_leave_snoopers()
3326 static void __br_multicast_open(struct net_bridge *br, in __br_multicast_open() argument
3331 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) in __br_multicast_open()
3337 void br_multicast_open(struct net_bridge *br) in br_multicast_open() argument
3339 __br_multicast_open(br, &br->ip4_own_query); in br_multicast_open()
3341 __br_multicast_open(br, &br->ip6_own_query); in br_multicast_open()
3345 void br_multicast_stop(struct net_bridge *br) in br_multicast_stop() argument
3347 del_timer_sync(&br->multicast_router_timer); in br_multicast_stop()
3348 del_timer_sync(&br->ip4_other_query.timer); in br_multicast_stop()
3349 del_timer_sync(&br->ip4_own_query.timer); in br_multicast_stop()
3351 del_timer_sync(&br->ip6_other_query.timer); in br_multicast_stop()
3352 del_timer_sync(&br->ip6_own_query.timer); in br_multicast_stop()
3356 void br_multicast_dev_del(struct net_bridge *br) in br_multicast_dev_del() argument
3362 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
3363 hlist_for_each_entry_safe(mp, tmp, &br->mdb_list, mdb_node) in br_multicast_dev_del()
3365 hlist_move_list(&br->mcast_gc_list, &deleted_head); in br_multicast_dev_del()
3366 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
3369 cancel_work_sync(&br->mcast_gc_work); in br_multicast_dev_del()
3374 int br_multicast_set_router(struct net_bridge *br, unsigned long val) in br_multicast_set_router() argument
3378 spin_lock_bh(&br->multicast_lock); in br_multicast_set_router()
3383 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM); in br_multicast_set_router()
3384 del_timer(&br->multicast_router_timer); in br_multicast_set_router()
3385 br->multicast_router = val; in br_multicast_set_router()
3389 if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) in br_multicast_set_router()
3390 br_mc_router_state_change(br, false); in br_multicast_set_router()
3391 br->multicast_router = val; in br_multicast_set_router()
3396 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_router()
3406 br_rtr_notify(p->br->dev, p, RTM_DELMDB); in __del_port_router()
3416 struct net_bridge *br = p->br; in br_multicast_set_port_router() local
3420 spin_lock(&br->multicast_lock); in br_multicast_set_port_router()
3425 now + br->multicast_querier_interval); in br_multicast_set_port_router()
3442 br_multicast_add_router(br, p); in br_multicast_set_port_router()
3446 br_multicast_mark_router(br, p); in br_multicast_set_port_router()
3453 spin_unlock(&br->multicast_lock); in br_multicast_set_port_router()
3458 static void br_multicast_start_querier(struct net_bridge *br, in br_multicast_start_querier() argument
3463 __br_multicast_open(br, query); in br_multicast_start_querier()
3466 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_start_querier()
3471 if (query == &br->ip4_own_query) in br_multicast_start_querier()
3481 int br_multicast_toggle(struct net_bridge *br, unsigned long val) in br_multicast_toggle() argument
3486 spin_lock_bh(&br->multicast_lock); in br_multicast_toggle()
3487 if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val) in br_multicast_toggle()
3490 br_mc_disabled_update(br->dev, val); in br_multicast_toggle()
3491 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val); in br_multicast_toggle()
3492 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) { in br_multicast_toggle()
3497 if (!netif_running(br->dev)) in br_multicast_toggle()
3500 br_multicast_open(br); in br_multicast_toggle()
3501 list_for_each_entry(port, &br->port_list, list) in br_multicast_toggle()
3507 spin_unlock_bh(&br->multicast_lock); in br_multicast_toggle()
3522 if (br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_toggle()
3523 br_multicast_join_snoopers(br); in br_multicast_toggle()
3525 br_multicast_leave_snoopers(br); in br_multicast_toggle()
3533 struct net_bridge *br = netdev_priv(dev); in br_multicast_enabled() local
3535 return !!br_opt_get(br, BROPT_MULTICAST_ENABLED); in br_multicast_enabled()
3541 struct net_bridge *br = netdev_priv(dev); in br_multicast_router() local
3544 spin_lock_bh(&br->multicast_lock); in br_multicast_router()
3545 is_router = br_multicast_is_router(br); in br_multicast_router()
3546 spin_unlock_bh(&br->multicast_lock); in br_multicast_router()
3551 int br_multicast_set_querier(struct net_bridge *br, unsigned long val) in br_multicast_set_querier() argument
3557 spin_lock_bh(&br->multicast_lock); in br_multicast_set_querier()
3558 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) == val) in br_multicast_set_querier()
3561 br_opt_toggle(br, BROPT_MULTICAST_QUERIER, !!val); in br_multicast_set_querier()
3565 max_delay = br->multicast_query_response_interval; in br_multicast_set_querier()
3567 if (!timer_pending(&br->ip4_other_query.timer)) in br_multicast_set_querier()
3568 br->ip4_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
3570 br_multicast_start_querier(br, &br->ip4_own_query); in br_multicast_set_querier()
3573 if (!timer_pending(&br->ip6_other_query.timer)) in br_multicast_set_querier()
3574 br->ip6_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
3576 br_multicast_start_querier(br, &br->ip6_own_query); in br_multicast_set_querier()
3580 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_querier()
3585 int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val) in br_multicast_set_igmp_version() argument
3587 /* Currently we support only version 2 and 3 */ in br_multicast_set_igmp_version()
3590 case 3: in br_multicast_set_igmp_version()
3596 spin_lock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
3597 br->multicast_igmp_version = val; in br_multicast_set_igmp_version()
3598 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
3604 int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val) in br_multicast_set_mld_version() argument
3615 spin_lock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
3616 br->multicast_mld_version = val; in br_multicast_set_mld_version()
3617 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
3643 struct net_bridge *br; in br_multicast_list_adjacent() local
3654 if (!port || !port->br) in br_multicast_list_adjacent()
3657 br = port->br; in br_multicast_list_adjacent()
3659 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_list_adjacent()
3691 struct net_bridge *br; in br_multicast_has_querier_anywhere() local
3701 if (!port || !port->br) in br_multicast_has_querier_anywhere()
3704 br = port->br; in br_multicast_has_querier_anywhere()
3709 ret = br_multicast_querier_exists(br, &eth); in br_multicast_has_querier_anywhere()
3728 struct net_bridge *br; in br_multicast_has_querier_adjacent() local
3737 if (!port || !port->br) in br_multicast_has_querier_adjacent()
3740 br = port->br; in br_multicast_has_querier_adjacent()
3744 if (!timer_pending(&br->ip4_other_query.timer) || in br_multicast_has_querier_adjacent()
3745 rcu_dereference(br->ip4_querier.port) == port) in br_multicast_has_querier_adjacent()
3750 if (!timer_pending(&br->ip6_other_query.timer) || in br_multicast_has_querier_adjacent()
3751 rcu_dereference(br->ip6_querier.port) == port) in br_multicast_has_querier_adjacent()
3837 void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, in br_multicast_count() argument
3843 if (!type || !br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED)) in br_multicast_count()
3849 stats = br->mcast_stats; in br_multicast_count()
3856 int br_multicast_init_stats(struct net_bridge *br) in br_multicast_init_stats() argument
3858 br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats); in br_multicast_init_stats()
3859 if (!br->mcast_stats) in br_multicast_init_stats()
3865 void br_multicast_uninit_stats(struct net_bridge *br) in br_multicast_uninit_stats() argument
3867 free_percpu(br->mcast_stats); in br_multicast_uninit_stats()
3877 void br_multicast_get_stats(const struct net_bridge *br, in br_multicast_get_stats() argument
3889 stats = br->mcast_stats; in br_multicast_get_stats()
3923 int br_mdb_hash_init(struct net_bridge *br) in br_mdb_hash_init() argument
3927 err = rhashtable_init(&br->sg_port_tbl, &br_sg_port_rht_params); in br_mdb_hash_init()
3931 err = rhashtable_init(&br->mdb_hash_tbl, &br_mdb_rht_params); in br_mdb_hash_init()
3933 rhashtable_destroy(&br->sg_port_tbl); in br_mdb_hash_init()
3940 void br_mdb_hash_fini(struct net_bridge *br) in br_mdb_hash_fini() argument
3942 rhashtable_destroy(&br->sg_port_tbl); in br_mdb_hash_fini()
3943 rhashtable_destroy(&br->mdb_hash_tbl); in br_mdb_hash_fini()