Lines Matching refs: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,
84 lockdep_assert_held_once(&br->multicast_lock);
86 return rhashtable_lookup_fast(&br->sg_port_tbl, sg_p,
90 static struct net_bridge_mdb_entry *br_mdb_ip_get_rcu(struct net_bridge *br,
93 return rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params);
96 struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge *br,
101 lockdep_assert_held_once(&br->multicast_lock);
104 ent = rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params);
110 static struct net_bridge_mdb_entry *br_mdb_ip4_get(struct net_bridge *br,
120 return br_mdb_ip_get(br, &br_dst);
124 static struct net_bridge_mdb_entry *br_mdb_ip6_get(struct net_bridge *br,
135 return br_mdb_ip_get(br, &br_dst);
139 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
144 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
157 if (br->multicast_igmp_version == 3) {
161 mdb = br_mdb_ip_get_rcu(br, &ip);
170 if (br->multicast_mld_version == 2) {
174 mdb = br_mdb_ip_get_rcu(br, &ip);
185 return br_mdb_ip_get_rcu(br, &ip);
205 struct net_bridge *br = pg->key.port->br;
211 if (br_sg_port_find(br, &sg_key))
214 src_pg = __br_multicast_add_group(br, pg->key.port, sg_ip, pg->eth_addr,
227 struct net_bridge *br = pg->key.port->br;
233 src_pg = br_sg_port_find(br, &sg_key);
238 br_multicast_find_del_pg(br, src_pg);
252 struct net_bridge *br = pg->key.port->br;
260 mp = br_mdb_ip_get(br, &pg->key.addr);
266 for (pg_lst = mlock_dereference(mp->ports, br);
268 pg_lst = mlock_dereference(pg_lst->next, br)) {
300 sg_mp = br_mdb_ip_get(star_mp->br, &sg->key.addr);
309 struct net_bridge *br = star_mp->br;
319 for (pg = mlock_dereference(star_mp->ports, br);
321 pg = mlock_dereference(pg->next, br)) {
328 sg_mp = br_mdb_ip_get(br, &sg_ip);
349 (p = mlock_dereference(*pp, sgmp->br)) != NULL;
362 (p = mlock_dereference(*pp, sgmp->br)) != NULL;) {
374 struct net_bridge *br = star_mp->br;
386 for (pg = mlock_dereference(star_mp->ports, br);
388 pg = mlock_dereference(pg->next, br)) {
395 if (br_sg_port_find(br, &sg_key))
398 src_pg = __br_multicast_add_group(br, pg->key.port,
421 sg = __br_multicast_add_group(src->br, src->pg->key.port, &sg_ip,
436 star_mp = br_mdb_ip_get(src->br, &src->pg->key.addr);
454 mp = br_mdb_ip_get(src->br, &sg_ip);
459 (p = mlock_dereference(*pp, src->br)) != NULL;
488 sg = br_sg_port_find(src->br, &sg_key);
501 sg_mp = br_mdb_ip_get(src->br, &sg_key.addr);
504 br_mdb_notify(src->br->dev, sg_mp, sg, RTM_NEWMDB);
522 struct net_bridge *br = mp->br;
524 rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode,
527 hlist_add_head(&mp->mcast_gc.gc_node, &br->mcast_gc_list);
528 queue_work(system_long_wq, &br->mcast_gc_work);
534 struct net_bridge *br = mp->br;
536 spin_lock(&br->multicast_lock);
537 if (hlist_unhashed(&mp->mdb_node) || !netif_running(br->dev) ||
547 spin_unlock(&br->multicast_lock);
563 struct net_bridge *br = src->pg->key.port->br;
568 hlist_add_head(&src->mcast_gc.gc_node, &br->mcast_gc_list);
569 queue_work(system_long_wq, &br->mcast_gc_work);
589 struct net_bridge *br = pg->key.port->br;
597 br_mdb_notify(br->dev, mp, pg, RTM_DELMDB);
599 rhashtable_remove_fast(&br->sg_port_tbl, &pg->rhnode,
605 hlist_add_head(&pg->mcast_gc.gc_node, &br->mcast_gc_list);
606 queue_work(system_long_wq, &br->mcast_gc_work);
608 if (!mp->ports && !mp->host_joined && netif_running(br->dev))
612 static void br_multicast_find_del_pg(struct net_bridge *br,
619 mp = br_mdb_ip_get(br, &pg->key.addr);
624 (p = mlock_dereference(*pp, br)) != NULL;
640 struct net_bridge *br = pg->key.port->br;
644 spin_lock(&br->multicast_lock);
645 if (!netif_running(br->dev) || timer_pending(&pg->timer) ||
659 br_multicast_find_del_pg(br, pg);
661 struct net_bridge_mdb_entry *mp = br_mdb_ip_get(br, &pg->key.addr);
668 br_mdb_notify(br->dev, mp, pg, RTM_NEWMDB);
671 spin_unlock(&br->multicast_lock);
685 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br,
707 if (br->multicast_igmp_version == 3) {
710 lmqt = now + (br->multicast_last_member_interval *
711 br->multicast_last_member_count);
727 pkt_size > br->dev->mtu)
730 skb = netdev_alloc_skb_ip_align(br->dev, pkt_size);
739 ether_addr_copy(eth->h_source, br->dev->dev_addr);
755 iph->saddr = br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR) ?
756 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0;
768 switch (br->multicast_igmp_version) {
772 ih->code = (group ? br->multicast_last_member_interval :
773 br->multicast_query_response_interval) /
783 ihv3->code = (group ? br->multicast_last_member_interval :
784 br->multicast_query_response_interval) /
787 ihv3->qqic = br->multicast_query_interval / HZ;
830 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
855 if (br->multicast_mld_version == 2) {
858 llqt = now + (br->multicast_last_member_interval *
859 br->multicast_last_member_count);
875 pkt_size > br->dev->mtu)
878 skb = netdev_alloc_skb_ip_align(br->dev, pkt_size);
888 ether_addr_copy(eth->h_source, br->dev->dev_addr);
901 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0,
904 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, false);
908 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true);
926 br->multicast_query_response_interval :
927 br->multicast_last_member_interval;
929 switch (br->multicast_mld_version) {
952 mld2q->mld2q_qqic = br->multicast_query_interval / HZ;
993 static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br,
1006 return br_ip4_multicast_alloc_query(br, pg,
1021 return br_ip6_multicast_alloc_query(br, pg,
1032 struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
1038 mp = br_mdb_ip_get(br, group);
1042 if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) {
1043 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false);
1051 mp->br = br;
1055 err = rhashtable_lookup_insert_fast(&br->mdb_hash_tbl, &mp->rhnode,
1061 hlist_add_head_rcu(&mp->mdb_node, &br->mdb_list);
1071 struct net_bridge *br = src->br;
1073 spin_lock(&br->multicast_lock);
1074 if (hlist_unhashed(&src->node) || !netif_running(br->dev) ||
1083 br_multicast_find_del_pg(br, pg);
1089 spin_unlock(&br->multicast_lock);
1143 grp_src->br = pg->key.port->br;
1178 rhashtable_lookup_insert_fast(&port->br->sg_port_tbl, &p->rhnode,
1204 br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB);
1206 mod_timer(&mp->timer, jiffies + mp->br->multicast_membership_interval);
1218 br_mdb_notify(mp->br->dev, mp, NULL, RTM_DELMDB);
1222 __br_multicast_add_group(struct net_bridge *br,
1235 if (!netif_running(br->dev) ||
1239 mp = br_multicast_new_group(br, group);
1249 (p = mlock_dereference(*pp, br)) != NULL;
1266 br_mdb_notify(br->dev, mp, p, RTM_NEWMDB);
1270 mod_timer(&p->timer, now + br->multicast_membership_interval);
1276 static int br_multicast_add_group(struct net_bridge *br,
1286 spin_lock(&br->multicast_lock);
1287 pg = __br_multicast_add_group(br, port, group, src, filter_mode,
1291 spin_unlock(&br->multicast_lock);
1296 static int br_ip4_multicast_add_group(struct net_bridge *br,
1315 return br_multicast_add_group(br, port, &br_group, src, filter_mode,
1320 static int br_ip6_multicast_add_group(struct net_bridge *br,
1339 return br_multicast_add_group(br, port, &br_group, src, filter_mode,
1348 struct net_bridge *br = port->br;
1350 spin_lock(&br->multicast_lock);
1358 spin_unlock(&br->multicast_lock);
1376 struct net_bridge *br = from_timer(br, t, multicast_router_timer);
1378 spin_lock(&br->multicast_lock);
1379 if (br->multicast_router == MDB_RTR_TYPE_DISABLED ||
1380 br->multicast_router == MDB_RTR_TYPE_PERM ||
1381 timer_pending(&br->multicast_router_timer))
1384 br_mc_router_state_change(br, false);
1386 spin_unlock(&br->multicast_lock);
1389 static void br_multicast_querier_expired(struct net_bridge *br,
1392 spin_lock(&br->multicast_lock);
1393 if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1396 br_multicast_start_querier(br, query);
1399 spin_unlock(&br->multicast_lock);
1404 struct net_bridge *br = from_timer(br, t, ip4_other_query.timer);
1406 br_multicast_querier_expired(br, &br->ip4_own_query);
1412 struct net_bridge *br = from_timer(br, t, ip6_other_query.timer);
1414 br_multicast_querier_expired(br, &br->ip6_own_query);
1418 static void br_multicast_select_own_querier(struct net_bridge *br,
1423 br->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr;
1426 br->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr;
1430 static void __br_multicast_send_query(struct net_bridge *br,
1444 skb = br_multicast_alloc_query(br, pg, ip_dst, group, with_srcs,
1452 br_multicast_count(br, port, skb, igmp_type,
1463 br_multicast_select_own_querier(br, group, skb);
1464 br_multicast_count(br, port, skb, igmp_type,
1470 static void br_multicast_send_query(struct net_bridge *br,
1478 if (!netif_running(br->dev) ||
1479 !br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
1480 !br_opt_get(br, BROPT_MULTICAST_QUERIER))
1486 (own_query == &br->ip4_own_query)) {
1487 other_query = &br->ip4_other_query;
1491 other_query = &br->ip6_other_query;
1499 __br_multicast_send_query(br, port, NULL, NULL, &br_group, false, 0,
1503 time += own_query->startup_sent < br->multicast_startup_query_count ?
1504 br->multicast_startup_query_interval :
1505 br->multicast_query_interval;
1513 struct net_bridge *br = port->br;
1515 spin_lock(&br->multicast_lock);
1520 if (query->startup_sent < br->multicast_startup_query_count)
1523 br_multicast_send_query(port->br, port, query);
1526 spin_unlock(&br->multicast_lock);
1549 struct net_bridge *br = pg->key.port->br;
1552 spin_lock(&br->multicast_lock);
1553 if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
1554 !br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
1555 !br_opt_get(br, BROPT_MULTICAST_QUERIER))
1559 other_query = &br->ip4_other_query;
1562 other_query = &br->ip6_other_query;
1570 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1573 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1578 br->multicast_last_member_interval);
1580 spin_unlock(&br->multicast_lock);
1608 br_opt_get(port->br, BROPT_MULTICAST_ENABLED));
1619 struct net_bridge *br = port->br;
1625 spin_lock_bh(&br->multicast_lock);
1627 br_multicast_find_del_pg(br, pg);
1628 hlist_move_list(&br->mcast_gc_list, &deleted_head);
1629 spin_unlock_bh(&br->multicast_lock);
1646 struct net_bridge *br = port->br;
1648 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) || !netif_running(br->dev))
1657 br_multicast_add_router(br, port);
1662 struct net_bridge *br = port->br;
1664 spin_lock(&br->multicast_lock);
1666 spin_unlock(&br->multicast_lock);
1671 struct net_bridge *br = port->br;
1675 spin_lock(&br->multicast_lock);
1678 br_multicast_find_del_pg(br, pg);
1687 spin_unlock(&br->multicast_lock);
1715 struct net_bridge *br = pg->key.port->br;
1716 u32 lmqc = br->multicast_last_member_count;
1720 if (!netif_running(br->dev) ||
1721 !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1725 other_query = &br->ip4_other_query;
1728 other_query = &br->ip6_other_query;
1731 lmqt = now + br_multicast_lmqt(br);
1736 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) &&
1745 if (!br_opt_get(br, BROPT_MULTICAST_QUERIER) ||
1749 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1752 lmi = now + br->multicast_last_member_interval;
1761 struct net_bridge *br = pg->key.port->br;
1764 if (!netif_running(br->dev) ||
1765 !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1769 other_query = &br->ip4_other_query;
1772 other_query = &br->ip6_other_query;
1775 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) &&
1777 lmi = now + br->multicast_last_member_interval;
1778 pg->grp_query_rexmit_cnt = br->multicast_last_member_count - 1;
1779 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1788 time_after(pg->timer.expires, now + br_multicast_lmqt(br))))
1789 mod_timer(&pg->timer, now + br_multicast_lmqt(br));
1800 struct net_bridge *br = pg->key.port->br;
1819 __grp_src_mod_timer(ent, now + br_multicast_gmi(br));
1867 struct net_bridge *br = pg->key.port->br;
1888 now + br_multicast_gmi(br));
1904 struct net_bridge *br = pg->key.port->br;
1919 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br));
1931 struct net_bridge *br = pg->key.port->br;
1955 __grp_src_mod_timer(ent, now + br_multicast_gmi(br));
1973 struct net_bridge *br = pg->key.port->br;
2000 __grp_src_mod_timer(ent, now + br_multicast_gmi(br));
2117 struct net_bridge *br = pg->key.port->br;
2132 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br));
2166 br_multicast_find_del_pg(pg->key.port->br, pg);
2231 struct net_bridge *br __maybe_unused = mp->br;
2234 for (pg = mlock_dereference(mp->ports, br);
2236 pg = mlock_dereference(pg->next, br))
2243 static int br_ip4_multicast_igmp3_report(struct net_bridge *br,
2248 bool igmpv2 = br->multicast_igmp_version == 2;
2296 br_ip4_multicast_leave_group(br, port, group, vid, src);
2300 err = br_ip4_multicast_add_group(br, port, group, vid,
2309 spin_lock_bh(&br->multicast_lock);
2310 mdst = br_mdb_ip4_get(br, group, vid);
2345 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB);
2347 spin_unlock_bh(&br->multicast_lock);
2354 static int br_ip6_multicast_mld2_report(struct net_bridge *br,
2359 bool mldv1 = br->multicast_mld_version == 1;
2420 br_ip6_multicast_leave_group(br, port,
2426 err = br_ip6_multicast_add_group(br, port,
2436 spin_lock_bh(&br->multicast_lock);
2437 mdst = br_mdb_ip6_get(br, &grec->grec_mca, vid);
2471 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB);
2473 spin_unlock_bh(&br->multicast_lock);
2480 static bool br_ip4_multicast_select_querier(struct net_bridge *br,
2484 if (!timer_pending(&br->ip4_own_query.timer) &&
2485 !timer_pending(&br->ip4_other_query.timer))
2488 if (!br->ip4_querier.addr.src.ip4)
2491 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.src.ip4))
2497 br->ip4_querier.addr.src.ip4 = saddr;
2500 rcu_assign_pointer(br->ip4_querier.port, port);
2506 static bool br_ip6_multicast_select_querier(struct net_bridge *br,
2510 if (!timer_pending(&br->ip6_own_query.timer) &&
2511 !timer_pending(&br->ip6_other_query.timer))
2514 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.src.ip6) <= 0)
2520 br->ip6_querier.addr.src.ip6 = *saddr;
2523 rcu_assign_pointer(br->ip6_querier.port, port);
2529 static bool br_multicast_select_querier(struct net_bridge *br,
2535 return br_ip4_multicast_select_querier(br, port, saddr->src.ip4);
2538 return br_ip6_multicast_select_querier(br, port, &saddr->src.ip6);
2546 br_multicast_update_query_timer(struct net_bridge *br,
2553 mod_timer(&query->timer, jiffies + br->multicast_querier_interval);
2572 * and locked by br->multicast_lock and RCU
2574 static void br_multicast_add_router(struct net_bridge *br,
2583 hlist_for_each_entry(p, &br->router_list, rlist) {
2592 hlist_add_head_rcu(&port->rlist, &br->router_list);
2593 br_rtr_notify(br->dev, port, RTM_NEWMDB);
2597 static void br_multicast_mark_router(struct net_bridge *br,
2603 if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) {
2604 if (!timer_pending(&br->multicast_router_timer))
2605 br_mc_router_state_change(br, true);
2606 mod_timer(&br->multicast_router_timer,
2607 now + br->multicast_querier_interval);
2616 br_multicast_add_router(br, port);
2619 now + br->multicast_querier_interval);
2622 static void br_multicast_query_received(struct net_bridge *br,
2628 if (!br_multicast_select_querier(br, port, saddr))
2631 br_multicast_update_query_timer(br, query, max_delay);
2632 br_multicast_mark_router(br, port);
2635 static void br_ip4_multicast_query(struct net_bridge *br,
2652 spin_lock(&br->multicast_lock);
2653 if (!netif_running(br->dev) ||
2669 (br->multicast_igmp_version == 3 && group && ih3->suppress))
2682 br_multicast_query_received(br, port, &br->ip4_other_query,
2687 mp = br_mdb_ip4_get(br, group, vid);
2691 max_delay *= br->multicast_last_member_count;
2700 (p = mlock_dereference(*pp, br)) != NULL;
2705 (br->multicast_igmp_version == 2 ||
2711 spin_unlock(&br->multicast_lock);
2715 static int br_ip6_multicast_query(struct net_bridge *br,
2734 spin_lock(&br->multicast_lock);
2735 if (!netif_running(br->dev) ||
2756 if (br->multicast_mld_version == 2 &&
2770 br_multicast_query_received(br, port, &br->ip6_other_query,
2777 mp = br_mdb_ip6_get(br, group, vid);
2781 max_delay *= br->multicast_last_member_count;
2789 (p = mlock_dereference(*pp, br)) != NULL;
2794 (br->multicast_mld_version == 1 ||
2800 spin_unlock(&br->multicast_lock);
2806 br_multicast_leave_group(struct net_bridge *br,
2818 spin_lock(&br->multicast_lock);
2819 if (!netif_running(br->dev) ||
2823 mp = br_mdb_ip_get(br, group);
2831 (p = mlock_dereference(*pp, br)) != NULL;
2848 if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) {
2849 __br_multicast_send_query(br, port, NULL, NULL, &mp->addr,
2852 time = jiffies + br->multicast_last_member_count *
2853 br->multicast_last_member_interval;
2857 for (p = mlock_dereference(mp->ports, br);
2859 p = mlock_dereference(p->next, br)) {
2875 time = now + br->multicast_last_member_count *
2876 br->multicast_last_member_interval;
2889 for (p = mlock_dereference(mp->ports, br);
2891 p = mlock_dereference(p->next, br)) {
2905 spin_unlock(&br->multicast_lock);
2908 static void br_ip4_multicast_leave_group(struct net_bridge *br,
2920 own_query = port ? &port->ip4_own_query : &br->ip4_own_query;
2927 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
2932 static void br_ip6_multicast_leave_group(struct net_bridge *br,
2944 own_query = port ? &port->ip6_own_query : &br->ip6_own_query;
2951 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
2956 static void br_multicast_err_count(const struct net_bridge *br,
2963 if (!br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED))
2969 stats = br->mcast_stats;
2989 static void br_multicast_pim(struct net_bridge *br,
3001 spin_lock(&br->multicast_lock);
3002 br_multicast_mark_router(br, port);
3003 spin_unlock(&br->multicast_lock);
3006 static int br_ip4_multicast_mrd_rcv(struct net_bridge *br,
3014 spin_lock(&br->multicast_lock);
3015 br_multicast_mark_router(br, port);
3016 spin_unlock(&br->multicast_lock);
3021 static int br_multicast_ipv4_rcv(struct net_bridge *br,
3037 br_multicast_pim(br, port, skb);
3039 br_ip4_multicast_mrd_rcv(br, port, skb);
3044 br_multicast_err_count(br, port, skb->protocol);
3056 err = br_ip4_multicast_add_group(br, port, ih->group, vid, src,
3060 err = br_ip4_multicast_igmp3_report(br, port, skb, vid);
3063 br_ip4_multicast_query(br, port, skb, vid);
3066 br_ip4_multicast_leave_group(br, port, ih->group, vid, src);
3070 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp,
3077 static void br_ip6_multicast_mrd_rcv(struct net_bridge *br,
3084 spin_lock(&br->multicast_lock);
3085 br_multicast_mark_router(br, port);
3086 spin_unlock(&br->multicast_lock);
3089 static int br_multicast_ipv6_rcv(struct net_bridge *br,
3105 br_ip6_multicast_mrd_rcv(br, port, skb);
3109 br_multicast_err_count(br, port, skb->protocol);
3120 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid,
3124 err = br_ip6_multicast_mld2_report(br, port, skb, vid);
3127 err = br_ip6_multicast_query(br, port, skb, vid);
3131 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src);
3135 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp,
3142 int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
3150 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
3155 ret = br_multicast_ipv4_rcv(br, port, skb, vid);
3159 ret = br_multicast_ipv6_rcv(br, port, skb, vid);
3167 static void br_multicast_query_expired(struct net_bridge *br,
3171 spin_lock(&br->multicast_lock);
3172 if (query->startup_sent < br->multicast_startup_query_count)
3176 br_multicast_send_query(br, NULL, query);
3177 spin_unlock(&br->multicast_lock);
3182 struct net_bridge *br = from_timer(br, t, ip4_own_query.timer);
3184 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier);
3190 struct net_bridge *br = from_timer(br, t, ip6_own_query.timer);
3192 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier);
3198 struct net_bridge *br = container_of(work, struct net_bridge,
3202 spin_lock_bh(&br->multicast_lock);
3203 hlist_move_list(&br->mcast_gc_list, &deleted_head);
3204 spin_unlock_bh(&br->multicast_lock);
3209 void br_multicast_init(struct net_bridge *br)
3211 br->hash_max = BR_MULTICAST_DEFAULT_HASH_MAX;
3213 br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
3214 br->multicast_last_member_count = 2;
3215 br->multicast_startup_query_count = 2;
3217 br->multicast_last_member_interval = HZ;
3218 br->multicast_query_response_interval = 10 * HZ;
3219 br->multicast_startup_query_interval = 125 * HZ / 4;
3220 br->multicast_query_interval = 125 * HZ;
3221 br->multicast_querier_interval = 255 * HZ;
3222 br->multicast_membership_interval = 260 * HZ;
3224 br->ip4_other_query.delay_time = 0;
3225 br->ip4_querier.port = NULL;
3226 br->multicast_igmp_version = 2;
3228 br->multicast_mld_version = 1;
3229 br->ip6_other_query.delay_time = 0;
3230 br->ip6_querier.port = NULL;
3232 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, true);
3233 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true);
3235 spin_lock_init(&br->multicast_lock);
3236 timer_setup(&br->multicast_router_timer,
3238 timer_setup(&br->ip4_other_query.timer,
3240 timer_setup(&br->ip4_own_query.timer,
3243 timer_setup(&br->ip6_other_query.timer,
3245 timer_setup(&br->ip6_own_query.timer,
3248 INIT_HLIST_HEAD(&br->mdb_list);
3249 INIT_HLIST_HEAD(&br->mcast_gc_list);
3250 INIT_WORK(&br->mcast_gc_work, br_multicast_gc_work);
3253 static void br_ip4_multicast_join_snoopers(struct net_bridge *br)
3255 struct in_device *in_dev = in_dev_get(br->dev);
3265 static void br_ip6_multicast_join_snoopers(struct net_bridge *br)
3270 ipv6_dev_mc_inc(br->dev, &addr);
3273 static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br)
3278 void br_multicast_join_snoopers(struct net_bridge *br)
3280 br_ip4_multicast_join_snoopers(br);
3281 br_ip6_multicast_join_snoopers(br);
3284 static void br_ip4_multicast_leave_snoopers(struct net_bridge *br)
3286 struct in_device *in_dev = in_dev_get(br->dev);
3296 static void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
3301 ipv6_dev_mc_dec(br->dev, &addr);
3304 static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
3309 void br_multicast_leave_snoopers(struct net_bridge *br)
3311 br_ip4_multicast_leave_snoopers(br);
3312 br_ip6_multicast_leave_snoopers(br);
3315 static void __br_multicast_open(struct net_bridge *br,
3320 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
3326 void br_multicast_open(struct net_bridge *br)
3328 __br_multicast_open(br, &br->ip4_own_query);
3330 __br_multicast_open(br, &br->ip6_own_query);
3334 void br_multicast_stop(struct net_bridge *br)
3336 del_timer_sync(&br->multicast_router_timer);
3337 del_timer_sync(&br->ip4_other_query.timer);
3338 del_timer_sync(&br->ip4_own_query.timer);
3340 del_timer_sync(&br->ip6_other_query.timer);
3341 del_timer_sync(&br->ip6_own_query.timer);
3345 void br_multicast_dev_del(struct net_bridge *br)
3351 spin_lock_bh(&br->multicast_lock);
3352 hlist_for_each_entry_safe(mp, tmp, &br->mdb_list, mdb_node)
3354 hlist_move_list(&br->mcast_gc_list, &deleted_head);
3355 spin_unlock_bh(&br->multicast_lock);
3358 cancel_work_sync(&br->mcast_gc_work);
3363 int br_multicast_set_router(struct net_bridge *br, unsigned long val)
3367 spin_lock_bh(&br->multicast_lock);
3372 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM);
3373 del_timer(&br->multicast_router_timer);
3374 br->multicast_router = val;
3378 if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY)
3379 br_mc_router_state_change(br, false);
3380 br->multicast_router = val;
3385 spin_unlock_bh(&br->multicast_lock);
3395 br_rtr_notify(p->br->dev, p, RTM_DELMDB);
3405 struct net_bridge *br = p->br;
3409 spin_lock(&br->multicast_lock);
3414 now + br->multicast_querier_interval);
3431 br_multicast_add_router(br, p);
3435 br_multicast_mark_router(br, p);
3442 spin_unlock(&br->multicast_lock);
3447 static void br_multicast_start_querier(struct net_bridge *br,
3452 __br_multicast_open(br, query);
3455 list_for_each_entry_rcu(port, &br->port_list, list) {
3460 if (query == &br->ip4_own_query)
3470 int br_multicast_toggle(struct net_bridge *br, unsigned long val)
3475 spin_lock_bh(&br->multicast_lock);
3476 if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val)
3479 br_mc_disabled_update(br->dev, val);
3480 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val);
3481 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
3486 if (!netif_running(br->dev))
3489 br_multicast_open(br);
3490 list_for_each_entry(port, &br->port_list, list)
3496 spin_unlock_bh(&br->multicast_lock);
3511 if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
3512 br_multicast_join_snoopers(br);
3514 br_multicast_leave_snoopers(br);
3522 struct net_bridge *br = netdev_priv(dev);
3524 return !!br_opt_get(br, BROPT_MULTICAST_ENABLED);
3530 struct net_bridge *br = netdev_priv(dev);
3533 spin_lock_bh(&br->multicast_lock);
3534 is_router = br_multicast_is_router(br);
3535 spin_unlock_bh(&br->multicast_lock);
3540 int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
3546 spin_lock_bh(&br->multicast_lock);
3547 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) == val)
3550 br_opt_toggle(br, BROPT_MULTICAST_QUERIER, !!val);
3554 max_delay = br->multicast_query_response_interval;
3556 if (!timer_pending(&br->ip4_other_query.timer))
3557 br->ip4_other_query.delay_time = jiffies + max_delay;
3559 br_multicast_start_querier(br, &br->ip4_own_query);
3562 if (!timer_pending(&br->ip6_other_query.timer))
3563 br->ip6_other_query.delay_time = jiffies + max_delay;
3565 br_multicast_start_querier(br, &br->ip6_own_query);
3569 spin_unlock_bh(&br->multicast_lock);
3574 int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val)
3585 spin_lock_bh(&br->multicast_lock);
3586 br->multicast_igmp_version = val;
3587 spin_unlock_bh(&br->multicast_lock);
3593 int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val)
3604 spin_lock_bh(&br->multicast_lock);
3605 br->multicast_mld_version = val;
3606 spin_unlock_bh(&br->multicast_lock);
3632 struct net_bridge *br;
3643 if (!port || !port->br)
3646 br = port->br;
3648 list_for_each_entry_rcu(port, &br->port_list, list) {
3680 struct net_bridge *br;
3690 if (!port || !port->br)
3693 br = port->br;
3698 ret = br_multicast_querier_exists(br, ð);
3717 struct net_bridge *br;
3726 if (!port || !port->br)
3729 br = port->br;
3733 if (!timer_pending(&br->ip4_other_query.timer) ||
3734 rcu_dereference(br->ip4_querier.port) == port)
3739 if (!timer_pending(&br->ip6_other_query.timer) ||
3740 rcu_dereference(br->ip6_querier.port) == port)
3826 void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p,
3832 if (!type || !br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED))
3838 stats = br->mcast_stats;
3845 int br_multicast_init_stats(struct net_bridge *br)
3847 br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats);
3848 if (!br->mcast_stats)
3854 void br_multicast_uninit_stats(struct net_bridge *br)
3856 free_percpu(br->mcast_stats);
3866 void br_multicast_get_stats(const struct net_bridge *br,
3878 stats = br->mcast_stats;
3912 int br_mdb_hash_init(struct net_bridge *br)
3916 err = rhashtable_init(&br->sg_port_tbl, &br_sg_port_rht_params);
3920 err = rhashtable_init(&br->mdb_hash_tbl, &br_mdb_rht_params);
3922 rhashtable_destroy(&br->sg_port_tbl);
3929 void br_mdb_hash_fini(struct net_bridge *br)
3931 rhashtable_destroy(&br->sg_port_tbl);
3932 rhashtable_destroy(&br->mdb_hash_tbl);