Lines Matching refs:br

44 static void br_multicast_start_querier(struct net_bridge *br,
46 static void br_multicast_add_router(struct net_bridge *br,
48 static void br_ip4_multicast_leave_group(struct net_bridge *br,
56 static void br_ip6_multicast_leave_group(struct net_bridge *br,
62 static struct net_bridge_mdb_entry *br_mdb_ip_get_rcu(struct net_bridge *br, in br_mdb_ip_get_rcu() argument
65 return rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params); in br_mdb_ip_get_rcu()
68 struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge *br, in br_mdb_ip_get() argument
73 lockdep_assert_held_once(&br->multicast_lock); in br_mdb_ip_get()
76 ent = rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params); in br_mdb_ip_get()
82 static struct net_bridge_mdb_entry *br_mdb_ip4_get(struct net_bridge *br, in br_mdb_ip4_get() argument
92 return br_mdb_ip_get(br, &br_dst); in br_mdb_ip4_get()
96 static struct net_bridge_mdb_entry *br_mdb_ip6_get(struct net_bridge *br, in br_mdb_ip6_get() argument
107 return br_mdb_ip_get(br, &br_dst); in br_mdb_ip6_get()
111 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, in br_mdb_get() argument
116 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_mdb_get()
139 return br_mdb_ip_get_rcu(br, &ip); in br_mdb_get()
145 struct net_bridge *br = mp->br; in br_multicast_group_expired() local
147 spin_lock(&br->multicast_lock); in br_multicast_group_expired()
148 if (!netif_running(br->dev) || timer_pending(&mp->timer)) in br_multicast_group_expired()
156 rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode, in br_multicast_group_expired()
163 spin_unlock(&br->multicast_lock); in br_multicast_group_expired()
166 static void br_multicast_del_pg(struct net_bridge *br, in br_multicast_del_pg() argument
173 mp = br_mdb_ip_get(br, &pg->addr); in br_multicast_del_pg()
178 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_del_pg()
186 br_mdb_notify(br->dev, p->port, &pg->addr, RTM_DELMDB, in br_multicast_del_pg()
191 netif_running(br->dev)) in br_multicast_del_pg()
203 struct net_bridge *br = pg->port->br; in br_multicast_port_group_expired() local
205 spin_lock(&br->multicast_lock); in br_multicast_port_group_expired()
206 if (!netif_running(br->dev) || timer_pending(&pg->timer) || in br_multicast_port_group_expired()
210 br_multicast_del_pg(br, pg); in br_multicast_port_group_expired()
213 spin_unlock(&br->multicast_lock); in br_multicast_port_group_expired()
216 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br, in br_ip4_multicast_alloc_query() argument
228 if (br->multicast_igmp_version == 3) in br_ip4_multicast_alloc_query()
230 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*iph) + in br_ip4_multicast_alloc_query()
240 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip4_multicast_alloc_query()
261 iph->saddr = br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR) ? in br_ip4_multicast_alloc_query()
262 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0; in br_ip4_multicast_alloc_query()
274 switch (br->multicast_igmp_version) { in br_ip4_multicast_alloc_query()
278 ih->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
279 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
288 ihv3->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
289 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
292 ihv3->qqic = br->multicast_query_interval / HZ; in br_ip4_multicast_alloc_query()
310 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, in br_ip6_multicast_alloc_query() argument
324 if (br->multicast_mld_version == 2) in br_ip6_multicast_alloc_query()
326 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*ip6h) + in br_ip6_multicast_alloc_query()
337 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip6_multicast_alloc_query()
350 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, in br_ip6_multicast_alloc_query()
353 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, false); in br_ip6_multicast_alloc_query()
357 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true); in br_ip6_multicast_alloc_query()
375 br->multicast_query_response_interval : in br_ip6_multicast_alloc_query()
376 br->multicast_last_member_interval; in br_ip6_multicast_alloc_query()
378 switch (br->multicast_mld_version) { in br_ip6_multicast_alloc_query()
404 mld2q->mld2q_qqic = br->multicast_query_interval / HZ; in br_ip6_multicast_alloc_query()
423 static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br, in br_multicast_alloc_query() argument
429 return br_ip4_multicast_alloc_query(br, addr->u.ip4, igmp_type); in br_multicast_alloc_query()
432 return br_ip6_multicast_alloc_query(br, &addr->u.ip6, in br_multicast_alloc_query()
439 struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br, in br_multicast_new_group() argument
445 mp = br_mdb_ip_get(br, group); in br_multicast_new_group()
449 if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) { in br_multicast_new_group()
450 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false); in br_multicast_new_group()
458 mp->br = br; in br_multicast_new_group()
461 err = rhashtable_lookup_insert_fast(&br->mdb_hash_tbl, &mp->rhnode, in br_multicast_new_group()
467 hlist_add_head_rcu(&mp->mdb_node, &br->mdb_list); in br_multicast_new_group()
519 br_mdb_notify(mp->br->dev, NULL, &mp->addr, in br_multicast_host_join()
522 mod_timer(&mp->timer, jiffies + mp->br->multicast_membership_interval); in br_multicast_host_join()
532 br_mdb_notify(mp->br->dev, NULL, &mp->addr, RTM_DELMDB, 0); in br_multicast_host_leave()
535 static int br_multicast_add_group(struct net_bridge *br, in br_multicast_add_group() argument
546 spin_lock(&br->multicast_lock); in br_multicast_add_group()
547 if (!netif_running(br->dev) || in br_multicast_add_group()
551 mp = br_multicast_new_group(br, group); in br_multicast_add_group()
562 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_add_group()
574 br_mdb_notify(br->dev, port, group, RTM_NEWMDB, 0); in br_multicast_add_group()
577 mod_timer(&p->timer, now + br->multicast_membership_interval); in br_multicast_add_group()
582 spin_unlock(&br->multicast_lock); in br_multicast_add_group()
586 static int br_ip4_multicast_add_group(struct net_bridge *br, in br_ip4_multicast_add_group() argument
602 return br_multicast_add_group(br, port, &br_group, src); in br_ip4_multicast_add_group()
606 static int br_ip6_multicast_add_group(struct net_bridge *br, in br_ip6_multicast_add_group() argument
622 return br_multicast_add_group(br, port, &br_group, src); in br_ip6_multicast_add_group()
630 struct net_bridge *br = port->br; in br_multicast_router_expired() local
632 spin_lock(&br->multicast_lock); in br_multicast_router_expired()
640 spin_unlock(&br->multicast_lock); in br_multicast_router_expired()
658 struct net_bridge *br = from_timer(br, t, multicast_router_timer); in br_multicast_local_router_expired() local
660 spin_lock(&br->multicast_lock); in br_multicast_local_router_expired()
661 if (br->multicast_router == MDB_RTR_TYPE_DISABLED || in br_multicast_local_router_expired()
662 br->multicast_router == MDB_RTR_TYPE_PERM || in br_multicast_local_router_expired()
663 timer_pending(&br->multicast_router_timer)) in br_multicast_local_router_expired()
666 br_mc_router_state_change(br, false); in br_multicast_local_router_expired()
668 spin_unlock(&br->multicast_lock); in br_multicast_local_router_expired()
671 static void br_multicast_querier_expired(struct net_bridge *br, in br_multicast_querier_expired() argument
674 spin_lock(&br->multicast_lock); in br_multicast_querier_expired()
675 if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_querier_expired()
678 br_multicast_start_querier(br, query); in br_multicast_querier_expired()
681 spin_unlock(&br->multicast_lock); in br_multicast_querier_expired()
686 struct net_bridge *br = from_timer(br, t, ip4_other_query.timer); in br_ip4_multicast_querier_expired() local
688 br_multicast_querier_expired(br, &br->ip4_own_query); in br_ip4_multicast_querier_expired()
694 struct net_bridge *br = from_timer(br, t, ip6_other_query.timer); in br_ip6_multicast_querier_expired() local
696 br_multicast_querier_expired(br, &br->ip6_own_query); in br_ip6_multicast_querier_expired()
700 static void br_multicast_select_own_querier(struct net_bridge *br, in br_multicast_select_own_querier() argument
705 br->ip4_querier.addr.u.ip4 = ip_hdr(skb)->saddr; in br_multicast_select_own_querier()
708 br->ip6_querier.addr.u.ip6 = ipv6_hdr(skb)->saddr; in br_multicast_select_own_querier()
712 static void __br_multicast_send_query(struct net_bridge *br, in __br_multicast_send_query() argument
719 skb = br_multicast_alloc_query(br, ip, &igmp_type); in __br_multicast_send_query()
725 br_multicast_count(br, port, skb, igmp_type, in __br_multicast_send_query()
731 br_multicast_select_own_querier(br, ip, skb); in __br_multicast_send_query()
732 br_multicast_count(br, port, skb, igmp_type, in __br_multicast_send_query()
738 static void br_multicast_send_query(struct net_bridge *br, in br_multicast_send_query() argument
746 if (!netif_running(br->dev) || in br_multicast_send_query()
747 !br_opt_get(br, BROPT_MULTICAST_ENABLED) || in br_multicast_send_query()
748 !br_opt_get(br, BROPT_MULTICAST_QUERIER)) in br_multicast_send_query()
754 (own_query == &br->ip4_own_query)) { in br_multicast_send_query()
755 other_query = &br->ip4_other_query; in br_multicast_send_query()
759 other_query = &br->ip6_other_query; in br_multicast_send_query()
767 __br_multicast_send_query(br, port, &br_group); in br_multicast_send_query()
770 time += own_query->startup_sent < br->multicast_startup_query_count ? in br_multicast_send_query()
771 br->multicast_startup_query_interval : in br_multicast_send_query()
772 br->multicast_query_interval; in br_multicast_send_query()
780 struct net_bridge *br = port->br; in br_multicast_port_query_expired() local
782 spin_lock(&br->multicast_lock); in br_multicast_port_query_expired()
787 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_port_query_expired()
790 br_multicast_send_query(port->br, port, query); in br_multicast_port_query_expired()
793 spin_unlock(&br->multicast_lock); in br_multicast_port_query_expired()
837 br_opt_get(port->br, BROPT_MULTICAST_ENABLED)); in br_multicast_add_port()
848 struct net_bridge *br = port->br; in br_multicast_del_port() local
853 spin_lock_bh(&br->multicast_lock); in br_multicast_del_port()
855 br_multicast_del_pg(br, pg); in br_multicast_del_port()
856 spin_unlock_bh(&br->multicast_lock); in br_multicast_del_port()
872 struct net_bridge *br = port->br; in __br_multicast_enable_port() local
874 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) || !netif_running(br->dev)) in __br_multicast_enable_port()
883 br_multicast_add_router(br, port); in __br_multicast_enable_port()
888 struct net_bridge *br = port->br; in br_multicast_enable_port() local
890 spin_lock(&br->multicast_lock); in br_multicast_enable_port()
892 spin_unlock(&br->multicast_lock); in br_multicast_enable_port()
897 struct net_bridge *br = port->br; in br_multicast_disable_port() local
901 spin_lock(&br->multicast_lock); in br_multicast_disable_port()
904 br_multicast_del_pg(br, pg); in br_multicast_disable_port()
913 spin_unlock(&br->multicast_lock); in br_multicast_disable_port()
916 static int br_ip4_multicast_igmp3_report(struct net_bridge *br, in br_ip4_multicast_igmp3_report() argument
968 br_ip4_multicast_leave_group(br, port, group, vid, src); in br_ip4_multicast_igmp3_report()
970 err = br_ip4_multicast_add_group(br, port, group, vid, in br_ip4_multicast_igmp3_report()
981 static int br_ip6_multicast_mld2_report(struct net_bridge *br, in br_ip6_multicast_mld2_report() argument
1045 br_ip6_multicast_leave_group(br, port, &grec->grec_mca, in br_ip6_multicast_mld2_report()
1048 err = br_ip6_multicast_add_group(br, port, in br_ip6_multicast_mld2_report()
1060 static bool br_ip4_multicast_select_querier(struct net_bridge *br, in br_ip4_multicast_select_querier() argument
1064 if (!timer_pending(&br->ip4_own_query.timer) && in br_ip4_multicast_select_querier()
1065 !timer_pending(&br->ip4_other_query.timer)) in br_ip4_multicast_select_querier()
1068 if (!br->ip4_querier.addr.u.ip4) in br_ip4_multicast_select_querier()
1071 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.u.ip4)) in br_ip4_multicast_select_querier()
1077 br->ip4_querier.addr.u.ip4 = saddr; in br_ip4_multicast_select_querier()
1080 rcu_assign_pointer(br->ip4_querier.port, port); in br_ip4_multicast_select_querier()
1086 static bool br_ip6_multicast_select_querier(struct net_bridge *br, in br_ip6_multicast_select_querier() argument
1090 if (!timer_pending(&br->ip6_own_query.timer) && in br_ip6_multicast_select_querier()
1091 !timer_pending(&br->ip6_other_query.timer)) in br_ip6_multicast_select_querier()
1094 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.u.ip6) <= 0) in br_ip6_multicast_select_querier()
1100 br->ip6_querier.addr.u.ip6 = *saddr; in br_ip6_multicast_select_querier()
1103 rcu_assign_pointer(br->ip6_querier.port, port); in br_ip6_multicast_select_querier()
1109 static bool br_multicast_select_querier(struct net_bridge *br, in br_multicast_select_querier() argument
1115 return br_ip4_multicast_select_querier(br, port, saddr->u.ip4); in br_multicast_select_querier()
1118 return br_ip6_multicast_select_querier(br, port, &saddr->u.ip6); in br_multicast_select_querier()
1126 br_multicast_update_query_timer(struct net_bridge *br, in br_multicast_update_query_timer() argument
1133 mod_timer(&query->timer, jiffies + br->multicast_querier_interval); in br_multicast_update_query_timer()
1154 static void br_multicast_add_router(struct net_bridge *br, in br_multicast_add_router() argument
1163 hlist_for_each_entry(p, &br->router_list, rlist) { in br_multicast_add_router()
1172 hlist_add_head_rcu(&port->rlist, &br->router_list); in br_multicast_add_router()
1173 br_rtr_notify(br->dev, port, RTM_NEWMDB); in br_multicast_add_router()
1177 static void br_multicast_mark_router(struct net_bridge *br, in br_multicast_mark_router() argument
1183 if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { in br_multicast_mark_router()
1184 if (!timer_pending(&br->multicast_router_timer)) in br_multicast_mark_router()
1185 br_mc_router_state_change(br, true); in br_multicast_mark_router()
1186 mod_timer(&br->multicast_router_timer, in br_multicast_mark_router()
1187 now + br->multicast_querier_interval); in br_multicast_mark_router()
1196 br_multicast_add_router(br, port); in br_multicast_mark_router()
1199 now + br->multicast_querier_interval); in br_multicast_mark_router()
1202 static void br_multicast_query_received(struct net_bridge *br, in br_multicast_query_received() argument
1208 if (!br_multicast_select_querier(br, port, saddr)) in br_multicast_query_received()
1211 br_multicast_update_query_timer(br, query, max_delay); in br_multicast_query_received()
1212 br_multicast_mark_router(br, port); in br_multicast_query_received()
1215 static void br_ip4_multicast_query(struct net_bridge *br, in br_ip4_multicast_query() argument
1232 spin_lock(&br->multicast_lock); in br_ip4_multicast_query()
1233 if (!netif_running(br->dev) || in br_ip4_multicast_query()
1261 br_multicast_query_received(br, port, &br->ip4_other_query, in br_ip4_multicast_query()
1266 mp = br_mdb_ip4_get(br, group, vid); in br_ip4_multicast_query()
1270 max_delay *= br->multicast_last_member_count; in br_ip4_multicast_query()
1279 (p = mlock_dereference(*pp, br)) != NULL; in br_ip4_multicast_query()
1288 spin_unlock(&br->multicast_lock); in br_ip4_multicast_query()
1292 static int br_ip6_multicast_query(struct net_bridge *br, in br_ip6_multicast_query() argument
1311 spin_lock(&br->multicast_lock); in br_ip6_multicast_query()
1312 if (!netif_running(br->dev) || in br_ip6_multicast_query()
1343 br_multicast_query_received(br, port, &br->ip6_other_query, in br_ip6_multicast_query()
1350 mp = br_mdb_ip6_get(br, group, vid); in br_ip6_multicast_query()
1354 max_delay *= br->multicast_last_member_count; in br_ip6_multicast_query()
1362 (p = mlock_dereference(*pp, br)) != NULL; in br_ip6_multicast_query()
1371 spin_unlock(&br->multicast_lock); in br_ip6_multicast_query()
1377 br_multicast_leave_group(struct net_bridge *br, in br_multicast_leave_group() argument
1389 spin_lock(&br->multicast_lock); in br_multicast_leave_group()
1390 if (!netif_running(br->dev) || in br_multicast_leave_group()
1394 mp = br_mdb_ip_get(br, group); in br_multicast_leave_group()
1402 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_leave_group()
1414 br_mdb_notify(br->dev, port, group, RTM_DELMDB, in br_multicast_leave_group()
1418 netif_running(br->dev)) in br_multicast_leave_group()
1427 if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) { in br_multicast_leave_group()
1428 __br_multicast_send_query(br, port, &mp->addr); in br_multicast_leave_group()
1430 time = jiffies + br->multicast_last_member_count * in br_multicast_leave_group()
1431 br->multicast_last_member_interval; in br_multicast_leave_group()
1435 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1437 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1453 time = now + br->multicast_last_member_count * in br_multicast_leave_group()
1454 br->multicast_last_member_interval; in br_multicast_leave_group()
1467 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1469 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1483 spin_unlock(&br->multicast_lock); in br_multicast_leave_group()
1486 static void br_ip4_multicast_leave_group(struct net_bridge *br, in br_ip4_multicast_leave_group() argument
1498 own_query = port ? &port->ip4_own_query : &br->ip4_own_query; in br_ip4_multicast_leave_group()
1505 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query, in br_ip4_multicast_leave_group()
1510 static void br_ip6_multicast_leave_group(struct net_bridge *br, in br_ip6_multicast_leave_group() argument
1522 own_query = port ? &port->ip6_own_query : &br->ip6_own_query; in br_ip6_multicast_leave_group()
1529 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, in br_ip6_multicast_leave_group()
1534 static void br_multicast_err_count(const struct net_bridge *br, in br_multicast_err_count() argument
1541 if (!br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED)) in br_multicast_err_count()
1547 stats = br->mcast_stats; in br_multicast_err_count()
1567 static void br_multicast_pim(struct net_bridge *br, in br_multicast_pim() argument
1579 br_multicast_mark_router(br, port); in br_multicast_pim()
1582 static int br_ip4_multicast_mrd_rcv(struct net_bridge *br, in br_ip4_multicast_mrd_rcv() argument
1590 br_multicast_mark_router(br, port); in br_ip4_multicast_mrd_rcv()
1595 static int br_multicast_ipv4_rcv(struct net_bridge *br, in br_multicast_ipv4_rcv() argument
1611 br_multicast_pim(br, port, skb); in br_multicast_ipv4_rcv()
1613 br_ip4_multicast_mrd_rcv(br, port, skb); in br_multicast_ipv4_rcv()
1618 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv4_rcv()
1630 err = br_ip4_multicast_add_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
1633 err = br_ip4_multicast_igmp3_report(br, port, skb, vid); in br_multicast_ipv4_rcv()
1636 br_ip4_multicast_query(br, port, skb, vid); in br_multicast_ipv4_rcv()
1639 br_ip4_multicast_leave_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
1643 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv4_rcv()
1650 static int br_ip6_multicast_mrd_rcv(struct net_bridge *br, in br_ip6_multicast_mrd_rcv() argument
1666 br_multicast_mark_router(br, port); in br_ip6_multicast_mrd_rcv()
1671 static int br_multicast_ipv6_rcv(struct net_bridge *br, in br_multicast_ipv6_rcv() argument
1687 err = br_ip6_multicast_mrd_rcv(br, port, skb); in br_multicast_ipv6_rcv()
1690 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv6_rcv()
1697 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv6_rcv()
1708 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, in br_multicast_ipv6_rcv()
1712 err = br_ip6_multicast_mld2_report(br, port, skb, vid); in br_multicast_ipv6_rcv()
1715 err = br_ip6_multicast_query(br, port, skb, vid); in br_multicast_ipv6_rcv()
1719 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src); in br_multicast_ipv6_rcv()
1723 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv6_rcv()
1730 int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, in br_multicast_rcv() argument
1738 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_rcv()
1743 ret = br_multicast_ipv4_rcv(br, port, skb, vid); in br_multicast_rcv()
1747 ret = br_multicast_ipv6_rcv(br, port, skb, vid); in br_multicast_rcv()
1755 static void br_multicast_query_expired(struct net_bridge *br, in br_multicast_query_expired() argument
1759 spin_lock(&br->multicast_lock); in br_multicast_query_expired()
1760 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_query_expired()
1764 br_multicast_send_query(br, NULL, query); in br_multicast_query_expired()
1765 spin_unlock(&br->multicast_lock); in br_multicast_query_expired()
1770 struct net_bridge *br = from_timer(br, t, ip4_own_query.timer); in br_ip4_multicast_query_expired() local
1772 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier); in br_ip4_multicast_query_expired()
1778 struct net_bridge *br = from_timer(br, t, ip6_own_query.timer); in br_ip6_multicast_query_expired() local
1780 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier); in br_ip6_multicast_query_expired()
1784 void br_multicast_init(struct net_bridge *br) in br_multicast_init() argument
1786 br->hash_max = BR_MULTICAST_DEFAULT_HASH_MAX; in br_multicast_init()
1788 br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; in br_multicast_init()
1789 br->multicast_last_member_count = 2; in br_multicast_init()
1790 br->multicast_startup_query_count = 2; in br_multicast_init()
1792 br->multicast_last_member_interval = HZ; in br_multicast_init()
1793 br->multicast_query_response_interval = 10 * HZ; in br_multicast_init()
1794 br->multicast_startup_query_interval = 125 * HZ / 4; in br_multicast_init()
1795 br->multicast_query_interval = 125 * HZ; in br_multicast_init()
1796 br->multicast_querier_interval = 255 * HZ; in br_multicast_init()
1797 br->multicast_membership_interval = 260 * HZ; in br_multicast_init()
1799 br->ip4_other_query.delay_time = 0; in br_multicast_init()
1800 br->ip4_querier.port = NULL; in br_multicast_init()
1801 br->multicast_igmp_version = 2; in br_multicast_init()
1803 br->multicast_mld_version = 1; in br_multicast_init()
1804 br->ip6_other_query.delay_time = 0; in br_multicast_init()
1805 br->ip6_querier.port = NULL; in br_multicast_init()
1807 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, true); in br_multicast_init()
1808 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true); in br_multicast_init()
1810 spin_lock_init(&br->multicast_lock); in br_multicast_init()
1811 timer_setup(&br->multicast_router_timer, in br_multicast_init()
1813 timer_setup(&br->ip4_other_query.timer, in br_multicast_init()
1815 timer_setup(&br->ip4_own_query.timer, in br_multicast_init()
1818 timer_setup(&br->ip6_other_query.timer, in br_multicast_init()
1820 timer_setup(&br->ip6_own_query.timer, in br_multicast_init()
1823 INIT_HLIST_HEAD(&br->mdb_list); in br_multicast_init()
1826 static void br_ip4_multicast_join_snoopers(struct net_bridge *br) in br_ip4_multicast_join_snoopers() argument
1828 struct in_device *in_dev = in_dev_get(br->dev); in br_ip4_multicast_join_snoopers()
1838 static void br_ip6_multicast_join_snoopers(struct net_bridge *br) in br_ip6_multicast_join_snoopers() argument
1843 ipv6_dev_mc_inc(br->dev, &addr); in br_ip6_multicast_join_snoopers()
1846 static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br) in br_ip6_multicast_join_snoopers() argument
1851 static void br_multicast_join_snoopers(struct net_bridge *br) in br_multicast_join_snoopers() argument
1853 br_ip4_multicast_join_snoopers(br); in br_multicast_join_snoopers()
1854 br_ip6_multicast_join_snoopers(br); in br_multicast_join_snoopers()
1857 static void br_ip4_multicast_leave_snoopers(struct net_bridge *br) in br_ip4_multicast_leave_snoopers() argument
1859 struct in_device *in_dev = in_dev_get(br->dev); in br_ip4_multicast_leave_snoopers()
1869 static void br_ip6_multicast_leave_snoopers(struct net_bridge *br) in br_ip6_multicast_leave_snoopers() argument
1874 ipv6_dev_mc_dec(br->dev, &addr); in br_ip6_multicast_leave_snoopers()
1877 static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br) in br_ip6_multicast_leave_snoopers() argument
1882 static void br_multicast_leave_snoopers(struct net_bridge *br) in br_multicast_leave_snoopers() argument
1884 br_ip4_multicast_leave_snoopers(br); in br_multicast_leave_snoopers()
1885 br_ip6_multicast_leave_snoopers(br); in br_multicast_leave_snoopers()
1888 static void __br_multicast_open(struct net_bridge *br, in __br_multicast_open() argument
1893 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) in __br_multicast_open()
1899 void br_multicast_open(struct net_bridge *br) in br_multicast_open() argument
1901 if (br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_open()
1902 br_multicast_join_snoopers(br); in br_multicast_open()
1904 __br_multicast_open(br, &br->ip4_own_query); in br_multicast_open()
1906 __br_multicast_open(br, &br->ip6_own_query); in br_multicast_open()
1910 void br_multicast_stop(struct net_bridge *br) in br_multicast_stop() argument
1912 del_timer_sync(&br->multicast_router_timer); in br_multicast_stop()
1913 del_timer_sync(&br->ip4_other_query.timer); in br_multicast_stop()
1914 del_timer_sync(&br->ip4_own_query.timer); in br_multicast_stop()
1916 del_timer_sync(&br->ip6_other_query.timer); in br_multicast_stop()
1917 del_timer_sync(&br->ip6_own_query.timer); in br_multicast_stop()
1920 if (br_opt_get(br, BROPT_MULTICAST_ENABLED)) in br_multicast_stop()
1921 br_multicast_leave_snoopers(br); in br_multicast_stop()
1924 void br_multicast_dev_del(struct net_bridge *br) in br_multicast_dev_del() argument
1929 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
1930 hlist_for_each_entry_safe(mp, tmp, &br->mdb_list, mdb_node) { in br_multicast_dev_del()
1932 rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode, in br_multicast_dev_del()
1937 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
1942 int br_multicast_set_router(struct net_bridge *br, unsigned long val) in br_multicast_set_router() argument
1946 spin_lock_bh(&br->multicast_lock); in br_multicast_set_router()
1951 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM); in br_multicast_set_router()
1952 del_timer(&br->multicast_router_timer); in br_multicast_set_router()
1953 br->multicast_router = val; in br_multicast_set_router()
1957 if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) in br_multicast_set_router()
1958 br_mc_router_state_change(br, false); in br_multicast_set_router()
1959 br->multicast_router = val; in br_multicast_set_router()
1964 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_router()
1974 br_rtr_notify(p->br->dev, p, RTM_DELMDB); in __del_port_router()
1984 struct net_bridge *br = p->br; in br_multicast_set_port_router() local
1988 spin_lock(&br->multicast_lock); in br_multicast_set_port_router()
1993 now + br->multicast_querier_interval); in br_multicast_set_port_router()
2010 br_multicast_add_router(br, p); in br_multicast_set_port_router()
2014 br_multicast_mark_router(br, p); in br_multicast_set_port_router()
2021 spin_unlock(&br->multicast_lock); in br_multicast_set_port_router()
2026 static void br_multicast_start_querier(struct net_bridge *br, in br_multicast_start_querier() argument
2031 __br_multicast_open(br, query); in br_multicast_start_querier()
2034 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_start_querier()
2039 if (query == &br->ip4_own_query) in br_multicast_start_querier()
2049 int br_multicast_toggle(struct net_bridge *br, unsigned long val) in br_multicast_toggle() argument
2053 spin_lock_bh(&br->multicast_lock); in br_multicast_toggle()
2054 if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val) in br_multicast_toggle()
2057 br_mc_disabled_update(br->dev, val); in br_multicast_toggle()
2058 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val); in br_multicast_toggle()
2059 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) { in br_multicast_toggle()
2060 br_multicast_leave_snoopers(br); in br_multicast_toggle()
2064 if (!netif_running(br->dev)) in br_multicast_toggle()
2067 br_multicast_open(br); in br_multicast_toggle()
2068 list_for_each_entry(port, &br->port_list, list) in br_multicast_toggle()
2072 spin_unlock_bh(&br->multicast_lock); in br_multicast_toggle()
2079 struct net_bridge *br = netdev_priv(dev); in br_multicast_enabled() local
2081 return !!br_opt_get(br, BROPT_MULTICAST_ENABLED); in br_multicast_enabled()
2087 struct net_bridge *br = netdev_priv(dev); in br_multicast_router() local
2090 spin_lock_bh(&br->multicast_lock); in br_multicast_router()
2091 is_router = br_multicast_is_router(br); in br_multicast_router()
2092 spin_unlock_bh(&br->multicast_lock); in br_multicast_router()
2097 int br_multicast_set_querier(struct net_bridge *br, unsigned long val) in br_multicast_set_querier() argument
2103 spin_lock_bh(&br->multicast_lock); in br_multicast_set_querier()
2104 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) == val) in br_multicast_set_querier()
2107 br_opt_toggle(br, BROPT_MULTICAST_QUERIER, !!val); in br_multicast_set_querier()
2111 max_delay = br->multicast_query_response_interval; in br_multicast_set_querier()
2113 if (!timer_pending(&br->ip4_other_query.timer)) in br_multicast_set_querier()
2114 br->ip4_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
2116 br_multicast_start_querier(br, &br->ip4_own_query); in br_multicast_set_querier()
2119 if (!timer_pending(&br->ip6_other_query.timer)) in br_multicast_set_querier()
2120 br->ip6_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
2122 br_multicast_start_querier(br, &br->ip6_own_query); in br_multicast_set_querier()
2126 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_querier()
2131 int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val) in br_multicast_set_igmp_version() argument
2142 spin_lock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
2143 br->multicast_igmp_version = val; in br_multicast_set_igmp_version()
2144 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
2150 int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val) in br_multicast_set_mld_version() argument
2161 spin_lock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
2162 br->multicast_mld_version = val; in br_multicast_set_mld_version()
2163 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
2189 struct net_bridge *br; in br_multicast_list_adjacent() local
2200 if (!port || !port->br) in br_multicast_list_adjacent()
2203 br = port->br; in br_multicast_list_adjacent()
2205 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_list_adjacent()
2237 struct net_bridge *br; in br_multicast_has_querier_anywhere() local
2247 if (!port || !port->br) in br_multicast_has_querier_anywhere()
2250 br = port->br; in br_multicast_has_querier_anywhere()
2255 ret = br_multicast_querier_exists(br, &eth); in br_multicast_has_querier_anywhere()
2274 struct net_bridge *br; in br_multicast_has_querier_adjacent() local
2283 if (!port || !port->br) in br_multicast_has_querier_adjacent()
2286 br = port->br; in br_multicast_has_querier_adjacent()
2290 if (!timer_pending(&br->ip4_other_query.timer) || in br_multicast_has_querier_adjacent()
2291 rcu_dereference(br->ip4_querier.port) == port) in br_multicast_has_querier_adjacent()
2296 if (!timer_pending(&br->ip6_other_query.timer) || in br_multicast_has_querier_adjacent()
2297 rcu_dereference(br->ip6_querier.port) == port) in br_multicast_has_querier_adjacent()
2383 void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, in br_multicast_count() argument
2389 if (!type || !br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED)) in br_multicast_count()
2395 stats = br->mcast_stats; in br_multicast_count()
2402 int br_multicast_init_stats(struct net_bridge *br) in br_multicast_init_stats() argument
2404 br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats); in br_multicast_init_stats()
2405 if (!br->mcast_stats) in br_multicast_init_stats()
2411 void br_multicast_uninit_stats(struct net_bridge *br) in br_multicast_uninit_stats() argument
2413 free_percpu(br->mcast_stats); in br_multicast_uninit_stats()
2422 void br_multicast_get_stats(const struct net_bridge *br, in br_multicast_get_stats() argument
2434 stats = br->mcast_stats; in br_multicast_get_stats()
2468 int br_mdb_hash_init(struct net_bridge *br) in br_mdb_hash_init() argument
2470 return rhashtable_init(&br->mdb_hash_tbl, &br_mdb_rht_params); in br_mdb_hash_init()
2473 void br_mdb_hash_fini(struct net_bridge *br) in br_mdb_hash_fini() argument
2475 rhashtable_destroy(&br->mdb_hash_tbl); in br_mdb_hash_fini()