Lines Matching refs:br

40 static void br_multicast_start_querier(struct net_bridge *br,
42 static void br_multicast_add_router(struct net_bridge *br,
44 static void br_ip4_multicast_leave_group(struct net_bridge *br,
52 static void br_ip6_multicast_leave_group(struct net_bridge *br,
155 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, in br_mdb_get() argument
158 struct net_bridge_mdb_htable *mdb = rcu_dereference(br->mdb); in br_mdb_get()
161 if (br->multicast_disabled) in br_mdb_get()
245 struct net_bridge *br = mp->br; in br_multicast_group_expired() local
248 spin_lock(&br->multicast_lock); in br_multicast_group_expired()
249 if (!netif_running(br->dev) || timer_pending(&mp->timer)) in br_multicast_group_expired()
253 br_mdb_notify(br->dev, NULL, &mp->addr, RTM_DELMDB, 0); in br_multicast_group_expired()
258 mdb = mlock_dereference(br->mdb, br); in br_multicast_group_expired()
266 spin_unlock(&br->multicast_lock); in br_multicast_group_expired()
269 static void br_multicast_del_pg(struct net_bridge *br, in br_multicast_del_pg() argument
277 mdb = mlock_dereference(br->mdb, br); in br_multicast_del_pg()
284 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_del_pg()
292 br_mdb_notify(br->dev, p->port, &pg->addr, RTM_DELMDB, in br_multicast_del_pg()
297 netif_running(br->dev)) in br_multicast_del_pg()
309 struct net_bridge *br = pg->port->br; in br_multicast_port_group_expired() local
311 spin_lock(&br->multicast_lock); in br_multicast_port_group_expired()
312 if (!netif_running(br->dev) || timer_pending(&pg->timer) || in br_multicast_port_group_expired()
316 br_multicast_del_pg(br, pg); in br_multicast_port_group_expired()
319 spin_unlock(&br->multicast_lock); in br_multicast_port_group_expired()
369 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br, in br_ip4_multicast_alloc_query() argument
381 if (br->multicast_igmp_version == 3) in br_ip4_multicast_alloc_query()
383 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*iph) + in br_ip4_multicast_alloc_query()
393 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip4_multicast_alloc_query()
414 iph->saddr = br->multicast_query_use_ifaddr ? in br_ip4_multicast_alloc_query()
415 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0; in br_ip4_multicast_alloc_query()
427 switch (br->multicast_igmp_version) { in br_ip4_multicast_alloc_query()
431 ih->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
432 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
441 ihv3->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
442 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
445 ihv3->qqic = br->multicast_query_interval / HZ; in br_ip4_multicast_alloc_query()
463 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, in br_ip6_multicast_alloc_query() argument
477 if (br->multicast_mld_version == 2) in br_ip6_multicast_alloc_query()
479 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*ip6h) + in br_ip6_multicast_alloc_query()
490 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip6_multicast_alloc_query()
503 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, in br_ip6_multicast_alloc_query()
506 br->has_ipv6_addr = 0; in br_ip6_multicast_alloc_query()
510 br->has_ipv6_addr = 1; in br_ip6_multicast_alloc_query()
528 br->multicast_query_response_interval : in br_ip6_multicast_alloc_query()
529 br->multicast_last_member_interval; in br_ip6_multicast_alloc_query()
531 switch (br->multicast_mld_version) { in br_ip6_multicast_alloc_query()
557 mld2q->mld2q_qqic = br->multicast_query_interval / HZ; in br_ip6_multicast_alloc_query()
576 static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br, in br_multicast_alloc_query() argument
582 return br_ip4_multicast_alloc_query(br, addr->u.ip4, igmp_type); in br_multicast_alloc_query()
585 return br_ip6_multicast_alloc_query(br, &addr->u.ip6, in br_multicast_alloc_query()
593 struct net_bridge *br, struct net_bridge_port *port, in br_multicast_get_group() argument
603 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_get_group()
613 if (unlikely(count > br->hash_elasticity && count)) { in br_multicast_get_group()
615 br_info(br, "Multicast hash table " in br_multicast_get_group()
617 port ? port->dev->name : br->dev->name); in br_multicast_get_group()
619 elasticity = br->hash_elasticity; in br_multicast_get_group()
624 if (unlikely(max > br->hash_max)) { in br_multicast_get_group()
625 br_warn(br, "Multicast hash table maximum of %d " in br_multicast_get_group()
627 br->hash_max, in br_multicast_get_group()
628 port ? port->dev->name : br->dev->name); in br_multicast_get_group()
631 br->multicast_disabled = 1; in br_multicast_get_group()
639 br_info(br, "Multicast hash table " in br_multicast_get_group()
641 port ? port->dev->name : br->dev->name); in br_multicast_get_group()
646 err = br_mdb_rehash(&br->mdb, max, elasticity); in br_multicast_get_group()
648 br_warn(br, "Cannot rehash multicast " in br_multicast_get_group()
650 port ? port->dev->name : br->dev->name, in br_multicast_get_group()
666 struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br, in br_multicast_new_group() argument
675 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_new_group()
677 err = br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0); in br_multicast_new_group()
684 mp = br_multicast_get_group(br, p, group, hash); in br_multicast_new_group()
691 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_new_group()
703 mp->br = br; in br_multicast_new_group()
755 static int br_multicast_add_group(struct net_bridge *br, in br_multicast_add_group() argument
766 spin_lock(&br->multicast_lock); in br_multicast_add_group()
767 if (!netif_running(br->dev) || in br_multicast_add_group()
771 mp = br_multicast_new_group(br, port, group); in br_multicast_add_group()
779 br_mdb_notify(br->dev, NULL, &mp->addr, RTM_NEWMDB, 0); in br_multicast_add_group()
781 mod_timer(&mp->timer, now + br->multicast_membership_interval); in br_multicast_add_group()
786 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_add_group()
798 br_mdb_notify(br->dev, port, group, RTM_NEWMDB, 0); in br_multicast_add_group()
801 mod_timer(&p->timer, now + br->multicast_membership_interval); in br_multicast_add_group()
806 spin_unlock(&br->multicast_lock); in br_multicast_add_group()
810 static int br_ip4_multicast_add_group(struct net_bridge *br, in br_ip4_multicast_add_group() argument
825 return br_multicast_add_group(br, port, &br_group, src); in br_ip4_multicast_add_group()
829 static int br_ip6_multicast_add_group(struct net_bridge *br, in br_ip6_multicast_add_group() argument
844 return br_multicast_add_group(br, port, &br_group, src); in br_ip6_multicast_add_group()
852 struct net_bridge *br = port->br; in br_multicast_router_expired() local
854 spin_lock(&br->multicast_lock); in br_multicast_router_expired()
862 spin_unlock(&br->multicast_lock); in br_multicast_router_expired()
880 struct net_bridge *br = from_timer(br, t, multicast_router_timer); in br_multicast_local_router_expired() local
882 spin_lock(&br->multicast_lock); in br_multicast_local_router_expired()
883 if (br->multicast_router == MDB_RTR_TYPE_DISABLED || in br_multicast_local_router_expired()
884 br->multicast_router == MDB_RTR_TYPE_PERM || in br_multicast_local_router_expired()
885 timer_pending(&br->multicast_router_timer)) in br_multicast_local_router_expired()
888 br_mc_router_state_change(br, false); in br_multicast_local_router_expired()
890 spin_unlock(&br->multicast_lock); in br_multicast_local_router_expired()
893 static void br_multicast_querier_expired(struct net_bridge *br, in br_multicast_querier_expired() argument
896 spin_lock(&br->multicast_lock); in br_multicast_querier_expired()
897 if (!netif_running(br->dev) || br->multicast_disabled) in br_multicast_querier_expired()
900 br_multicast_start_querier(br, query); in br_multicast_querier_expired()
903 spin_unlock(&br->multicast_lock); in br_multicast_querier_expired()
908 struct net_bridge *br = from_timer(br, t, ip4_other_query.timer); in br_ip4_multicast_querier_expired() local
910 br_multicast_querier_expired(br, &br->ip4_own_query); in br_ip4_multicast_querier_expired()
916 struct net_bridge *br = from_timer(br, t, ip6_other_query.timer); in br_ip6_multicast_querier_expired() local
918 br_multicast_querier_expired(br, &br->ip6_own_query); in br_ip6_multicast_querier_expired()
922 static void br_multicast_select_own_querier(struct net_bridge *br, in br_multicast_select_own_querier() argument
927 br->ip4_querier.addr.u.ip4 = ip_hdr(skb)->saddr; in br_multicast_select_own_querier()
930 br->ip6_querier.addr.u.ip6 = ipv6_hdr(skb)->saddr; in br_multicast_select_own_querier()
934 static void __br_multicast_send_query(struct net_bridge *br, in __br_multicast_send_query() argument
941 skb = br_multicast_alloc_query(br, ip, &igmp_type); in __br_multicast_send_query()
947 br_multicast_count(br, port, skb, igmp_type, in __br_multicast_send_query()
953 br_multicast_select_own_querier(br, ip, skb); in __br_multicast_send_query()
954 br_multicast_count(br, port, skb, igmp_type, in __br_multicast_send_query()
960 static void br_multicast_send_query(struct net_bridge *br, in br_multicast_send_query() argument
968 if (!netif_running(br->dev) || br->multicast_disabled || in br_multicast_send_query()
969 !br->multicast_querier) in br_multicast_send_query()
975 (own_query == &br->ip4_own_query)) { in br_multicast_send_query()
976 other_query = &br->ip4_other_query; in br_multicast_send_query()
980 other_query = &br->ip6_other_query; in br_multicast_send_query()
988 __br_multicast_send_query(br, port, &br_group); in br_multicast_send_query()
991 time += own_query->startup_sent < br->multicast_startup_query_count ? in br_multicast_send_query()
992 br->multicast_startup_query_interval : in br_multicast_send_query()
993 br->multicast_query_interval; in br_multicast_send_query()
1001 struct net_bridge *br = port->br; in br_multicast_port_query_expired() local
1003 spin_lock(&br->multicast_lock); in br_multicast_port_query_expired()
1008 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_port_query_expired()
1011 br_multicast_send_query(port->br, port, query); in br_multicast_port_query_expired()
1014 spin_unlock(&br->multicast_lock); in br_multicast_port_query_expired()
1057 br_mc_disabled_update(port->dev, port->br->multicast_disabled); in br_multicast_add_port()
1068 struct net_bridge *br = port->br; in br_multicast_del_port() local
1073 spin_lock_bh(&br->multicast_lock); in br_multicast_del_port()
1075 br_multicast_del_pg(br, pg); in br_multicast_del_port()
1076 spin_unlock_bh(&br->multicast_lock); in br_multicast_del_port()
1092 struct net_bridge *br = port->br; in __br_multicast_enable_port() local
1094 if (br->multicast_disabled || !netif_running(br->dev)) in __br_multicast_enable_port()
1103 br_multicast_add_router(br, port); in __br_multicast_enable_port()
1108 struct net_bridge *br = port->br; in br_multicast_enable_port() local
1110 spin_lock(&br->multicast_lock); in br_multicast_enable_port()
1112 spin_unlock(&br->multicast_lock); in br_multicast_enable_port()
1117 struct net_bridge *br = port->br; in br_multicast_disable_port() local
1121 spin_lock(&br->multicast_lock); in br_multicast_disable_port()
1124 br_multicast_del_pg(br, pg); in br_multicast_disable_port()
1133 spin_unlock(&br->multicast_lock); in br_multicast_disable_port()
1136 static int br_ip4_multicast_igmp3_report(struct net_bridge *br, in br_ip4_multicast_igmp3_report() argument
1186 br_ip4_multicast_leave_group(br, port, group, vid, src); in br_ip4_multicast_igmp3_report()
1188 err = br_ip4_multicast_add_group(br, port, group, vid, in br_ip4_multicast_igmp3_report()
1199 static int br_ip6_multicast_mld2_report(struct net_bridge *br, in br_ip6_multicast_mld2_report() argument
1256 br_ip6_multicast_leave_group(br, port, &grec->grec_mca, in br_ip6_multicast_mld2_report()
1259 err = br_ip6_multicast_add_group(br, port, in br_ip6_multicast_mld2_report()
1271 static bool br_ip4_multicast_select_querier(struct net_bridge *br, in br_ip4_multicast_select_querier() argument
1275 if (!timer_pending(&br->ip4_own_query.timer) && in br_ip4_multicast_select_querier()
1276 !timer_pending(&br->ip4_other_query.timer)) in br_ip4_multicast_select_querier()
1279 if (!br->ip4_querier.addr.u.ip4) in br_ip4_multicast_select_querier()
1282 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.u.ip4)) in br_ip4_multicast_select_querier()
1288 br->ip4_querier.addr.u.ip4 = saddr; in br_ip4_multicast_select_querier()
1291 rcu_assign_pointer(br->ip4_querier.port, port); in br_ip4_multicast_select_querier()
1297 static bool br_ip6_multicast_select_querier(struct net_bridge *br, in br_ip6_multicast_select_querier() argument
1301 if (!timer_pending(&br->ip6_own_query.timer) && in br_ip6_multicast_select_querier()
1302 !timer_pending(&br->ip6_other_query.timer)) in br_ip6_multicast_select_querier()
1305 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.u.ip6) <= 0) in br_ip6_multicast_select_querier()
1311 br->ip6_querier.addr.u.ip6 = *saddr; in br_ip6_multicast_select_querier()
1314 rcu_assign_pointer(br->ip6_querier.port, port); in br_ip6_multicast_select_querier()
1320 static bool br_multicast_select_querier(struct net_bridge *br, in br_multicast_select_querier() argument
1326 return br_ip4_multicast_select_querier(br, port, saddr->u.ip4); in br_multicast_select_querier()
1329 return br_ip6_multicast_select_querier(br, port, &saddr->u.ip6); in br_multicast_select_querier()
1337 br_multicast_update_query_timer(struct net_bridge *br, in br_multicast_update_query_timer() argument
1344 mod_timer(&query->timer, jiffies + br->multicast_querier_interval); in br_multicast_update_query_timer()
1365 static void br_multicast_add_router(struct net_bridge *br, in br_multicast_add_router() argument
1374 hlist_for_each_entry(p, &br->router_list, rlist) { in br_multicast_add_router()
1383 hlist_add_head_rcu(&port->rlist, &br->router_list); in br_multicast_add_router()
1384 br_rtr_notify(br->dev, port, RTM_NEWMDB); in br_multicast_add_router()
1388 static void br_multicast_mark_router(struct net_bridge *br, in br_multicast_mark_router() argument
1394 if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { in br_multicast_mark_router()
1395 if (!timer_pending(&br->multicast_router_timer)) in br_multicast_mark_router()
1396 br_mc_router_state_change(br, true); in br_multicast_mark_router()
1397 mod_timer(&br->multicast_router_timer, in br_multicast_mark_router()
1398 now + br->multicast_querier_interval); in br_multicast_mark_router()
1407 br_multicast_add_router(br, port); in br_multicast_mark_router()
1410 now + br->multicast_querier_interval); in br_multicast_mark_router()
1413 static void br_multicast_query_received(struct net_bridge *br, in br_multicast_query_received() argument
1419 if (!br_multicast_select_querier(br, port, saddr)) in br_multicast_query_received()
1422 br_multicast_update_query_timer(br, query, max_delay); in br_multicast_query_received()
1423 br_multicast_mark_router(br, port); in br_multicast_query_received()
1426 static void br_ip4_multicast_query(struct net_bridge *br, in br_ip4_multicast_query() argument
1443 spin_lock(&br->multicast_lock); in br_ip4_multicast_query()
1444 if (!netif_running(br->dev) || in br_ip4_multicast_query()
1472 br_multicast_query_received(br, port, &br->ip4_other_query, in br_ip4_multicast_query()
1477 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid); in br_ip4_multicast_query()
1481 max_delay *= br->multicast_last_member_count; in br_ip4_multicast_query()
1490 (p = mlock_dereference(*pp, br)) != NULL; in br_ip4_multicast_query()
1499 spin_unlock(&br->multicast_lock); in br_ip4_multicast_query()
1503 static int br_ip6_multicast_query(struct net_bridge *br, in br_ip6_multicast_query() argument
1522 spin_lock(&br->multicast_lock); in br_ip6_multicast_query()
1523 if (!netif_running(br->dev) || in br_ip6_multicast_query()
1554 br_multicast_query_received(br, port, &br->ip6_other_query, in br_ip6_multicast_query()
1561 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid); in br_ip6_multicast_query()
1565 max_delay *= br->multicast_last_member_count; in br_ip6_multicast_query()
1573 (p = mlock_dereference(*pp, br)) != NULL; in br_ip6_multicast_query()
1582 spin_unlock(&br->multicast_lock); in br_ip6_multicast_query()
1588 br_multicast_leave_group(struct net_bridge *br, in br_multicast_leave_group() argument
1601 spin_lock(&br->multicast_lock); in br_multicast_leave_group()
1602 if (!netif_running(br->dev) || in br_multicast_leave_group()
1606 mdb = mlock_dereference(br->mdb, br); in br_multicast_leave_group()
1615 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_leave_group()
1624 br_mdb_notify(br->dev, port, group, RTM_DELMDB, in br_multicast_leave_group()
1628 netif_running(br->dev)) in br_multicast_leave_group()
1637 if (br->multicast_querier) { in br_multicast_leave_group()
1638 __br_multicast_send_query(br, port, &mp->addr); in br_multicast_leave_group()
1640 time = jiffies + br->multicast_last_member_count * in br_multicast_leave_group()
1641 br->multicast_last_member_interval; in br_multicast_leave_group()
1645 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1647 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1663 time = now + br->multicast_last_member_count * in br_multicast_leave_group()
1664 br->multicast_last_member_interval; in br_multicast_leave_group()
1677 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1679 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1693 spin_unlock(&br->multicast_lock); in br_multicast_leave_group()
1696 static void br_ip4_multicast_leave_group(struct net_bridge *br, in br_ip4_multicast_leave_group() argument
1708 own_query = port ? &port->ip4_own_query : &br->ip4_own_query; in br_ip4_multicast_leave_group()
1714 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query, in br_ip4_multicast_leave_group()
1719 static void br_ip6_multicast_leave_group(struct net_bridge *br, in br_ip6_multicast_leave_group() argument
1731 own_query = port ? &port->ip6_own_query : &br->ip6_own_query; in br_ip6_multicast_leave_group()
1737 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, in br_ip6_multicast_leave_group()
1742 static void br_multicast_err_count(const struct net_bridge *br, in br_multicast_err_count() argument
1749 if (!br->multicast_stats_enabled) in br_multicast_err_count()
1755 stats = br->mcast_stats; in br_multicast_err_count()
1775 static void br_multicast_pim(struct net_bridge *br, in br_multicast_pim() argument
1787 br_multicast_mark_router(br, port); in br_multicast_pim()
1790 static int br_multicast_ipv4_rcv(struct net_bridge *br, in br_multicast_ipv4_rcv() argument
1807 br_multicast_pim(br, port, skb); in br_multicast_ipv4_rcv()
1811 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv4_rcv()
1823 err = br_ip4_multicast_add_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
1826 err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid); in br_multicast_ipv4_rcv()
1829 br_ip4_multicast_query(br, port, skb_trimmed, vid); in br_multicast_ipv4_rcv()
1832 br_ip4_multicast_leave_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
1839 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv4_rcv()
1846 static int br_multicast_ipv6_rcv(struct net_bridge *br, in br_multicast_ipv6_rcv() argument
1863 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv6_rcv()
1874 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, in br_multicast_ipv6_rcv()
1878 err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid); in br_multicast_ipv6_rcv()
1881 err = br_ip6_multicast_query(br, port, skb_trimmed, vid); in br_multicast_ipv6_rcv()
1885 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src); in br_multicast_ipv6_rcv()
1892 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv6_rcv()
1899 int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, in br_multicast_rcv() argument
1907 if (br->multicast_disabled) in br_multicast_rcv()
1912 ret = br_multicast_ipv4_rcv(br, port, skb, vid); in br_multicast_rcv()
1916 ret = br_multicast_ipv6_rcv(br, port, skb, vid); in br_multicast_rcv()
1924 static void br_multicast_query_expired(struct net_bridge *br, in br_multicast_query_expired() argument
1928 spin_lock(&br->multicast_lock); in br_multicast_query_expired()
1929 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_query_expired()
1933 br_multicast_send_query(br, NULL, query); in br_multicast_query_expired()
1934 spin_unlock(&br->multicast_lock); in br_multicast_query_expired()
1939 struct net_bridge *br = from_timer(br, t, ip4_own_query.timer); in br_ip4_multicast_query_expired() local
1941 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier); in br_ip4_multicast_query_expired()
1947 struct net_bridge *br = from_timer(br, t, ip6_own_query.timer); in br_ip6_multicast_query_expired() local
1949 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier); in br_ip6_multicast_query_expired()
1953 void br_multicast_init(struct net_bridge *br) in br_multicast_init() argument
1955 br->hash_elasticity = 4; in br_multicast_init()
1956 br->hash_max = 512; in br_multicast_init()
1958 br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; in br_multicast_init()
1959 br->multicast_querier = 0; in br_multicast_init()
1960 br->multicast_query_use_ifaddr = 0; in br_multicast_init()
1961 br->multicast_last_member_count = 2; in br_multicast_init()
1962 br->multicast_startup_query_count = 2; in br_multicast_init()
1964 br->multicast_last_member_interval = HZ; in br_multicast_init()
1965 br->multicast_query_response_interval = 10 * HZ; in br_multicast_init()
1966 br->multicast_startup_query_interval = 125 * HZ / 4; in br_multicast_init()
1967 br->multicast_query_interval = 125 * HZ; in br_multicast_init()
1968 br->multicast_querier_interval = 255 * HZ; in br_multicast_init()
1969 br->multicast_membership_interval = 260 * HZ; in br_multicast_init()
1971 br->ip4_other_query.delay_time = 0; in br_multicast_init()
1972 br->ip4_querier.port = NULL; in br_multicast_init()
1973 br->multicast_igmp_version = 2; in br_multicast_init()
1975 br->multicast_mld_version = 1; in br_multicast_init()
1976 br->ip6_other_query.delay_time = 0; in br_multicast_init()
1977 br->ip6_querier.port = NULL; in br_multicast_init()
1979 br->has_ipv6_addr = 1; in br_multicast_init()
1981 spin_lock_init(&br->multicast_lock); in br_multicast_init()
1982 timer_setup(&br->multicast_router_timer, in br_multicast_init()
1984 timer_setup(&br->ip4_other_query.timer, in br_multicast_init()
1986 timer_setup(&br->ip4_own_query.timer, in br_multicast_init()
1989 timer_setup(&br->ip6_other_query.timer, in br_multicast_init()
1991 timer_setup(&br->ip6_own_query.timer, in br_multicast_init()
1996 static void __br_multicast_open(struct net_bridge *br, in __br_multicast_open() argument
2001 if (br->multicast_disabled) in __br_multicast_open()
2007 void br_multicast_open(struct net_bridge *br) in br_multicast_open() argument
2009 __br_multicast_open(br, &br->ip4_own_query); in br_multicast_open()
2011 __br_multicast_open(br, &br->ip6_own_query); in br_multicast_open()
2015 void br_multicast_stop(struct net_bridge *br) in br_multicast_stop() argument
2017 del_timer_sync(&br->multicast_router_timer); in br_multicast_stop()
2018 del_timer_sync(&br->ip4_other_query.timer); in br_multicast_stop()
2019 del_timer_sync(&br->ip4_own_query.timer); in br_multicast_stop()
2021 del_timer_sync(&br->ip6_other_query.timer); in br_multicast_stop()
2022 del_timer_sync(&br->ip6_own_query.timer); in br_multicast_stop()
2026 void br_multicast_dev_del(struct net_bridge *br) in br_multicast_dev_del() argument
2034 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
2035 mdb = mlock_dereference(br->mdb, br); in br_multicast_dev_del()
2039 br->mdb = NULL; in br_multicast_dev_del()
2051 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
2053 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
2061 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
2064 int br_multicast_set_router(struct net_bridge *br, unsigned long val) in br_multicast_set_router() argument
2068 spin_lock_bh(&br->multicast_lock); in br_multicast_set_router()
2073 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM); in br_multicast_set_router()
2074 del_timer(&br->multicast_router_timer); in br_multicast_set_router()
2075 br->multicast_router = val; in br_multicast_set_router()
2079 if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) in br_multicast_set_router()
2080 br_mc_router_state_change(br, false); in br_multicast_set_router()
2081 br->multicast_router = val; in br_multicast_set_router()
2086 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_router()
2096 br_rtr_notify(p->br->dev, p, RTM_DELMDB); in __del_port_router()
2106 struct net_bridge *br = p->br; in br_multicast_set_port_router() local
2110 spin_lock(&br->multicast_lock); in br_multicast_set_port_router()
2115 now + br->multicast_querier_interval); in br_multicast_set_port_router()
2132 br_multicast_add_router(br, p); in br_multicast_set_port_router()
2136 br_multicast_mark_router(br, p); in br_multicast_set_port_router()
2143 spin_unlock(&br->multicast_lock); in br_multicast_set_port_router()
2148 static void br_multicast_start_querier(struct net_bridge *br, in br_multicast_start_querier() argument
2153 __br_multicast_open(br, query); in br_multicast_start_querier()
2155 list_for_each_entry(port, &br->port_list, list) { in br_multicast_start_querier()
2160 if (query == &br->ip4_own_query) in br_multicast_start_querier()
2169 int br_multicast_toggle(struct net_bridge *br, unsigned long val) in br_multicast_toggle() argument
2175 spin_lock_bh(&br->multicast_lock); in br_multicast_toggle()
2176 if (br->multicast_disabled == !val) in br_multicast_toggle()
2179 br_mc_disabled_update(br->dev, !val); in br_multicast_toggle()
2180 br->multicast_disabled = !val; in br_multicast_toggle()
2181 if (br->multicast_disabled) in br_multicast_toggle()
2184 if (!netif_running(br->dev)) in br_multicast_toggle()
2187 mdb = mlock_dereference(br->mdb, br); in br_multicast_toggle()
2192 br->multicast_disabled = !!val; in br_multicast_toggle()
2196 err = br_mdb_rehash(&br->mdb, mdb->max, in br_multicast_toggle()
2197 br->hash_elasticity); in br_multicast_toggle()
2202 br_multicast_open(br); in br_multicast_toggle()
2203 list_for_each_entry(port, &br->port_list, list) in br_multicast_toggle()
2207 spin_unlock_bh(&br->multicast_lock); in br_multicast_toggle()
2214 struct net_bridge *br = netdev_priv(dev); in br_multicast_enabled() local
2216 return !br->multicast_disabled; in br_multicast_enabled()
2222 struct net_bridge *br = netdev_priv(dev); in br_multicast_router() local
2225 spin_lock_bh(&br->multicast_lock); in br_multicast_router()
2226 is_router = br_multicast_is_router(br); in br_multicast_router()
2227 spin_unlock_bh(&br->multicast_lock); in br_multicast_router()
2232 int br_multicast_set_querier(struct net_bridge *br, unsigned long val) in br_multicast_set_querier() argument
2238 spin_lock_bh(&br->multicast_lock); in br_multicast_set_querier()
2239 if (br->multicast_querier == val) in br_multicast_set_querier()
2242 br->multicast_querier = val; in br_multicast_set_querier()
2246 max_delay = br->multicast_query_response_interval; in br_multicast_set_querier()
2248 if (!timer_pending(&br->ip4_other_query.timer)) in br_multicast_set_querier()
2249 br->ip4_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
2251 br_multicast_start_querier(br, &br->ip4_own_query); in br_multicast_set_querier()
2254 if (!timer_pending(&br->ip6_other_query.timer)) in br_multicast_set_querier()
2255 br->ip6_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
2257 br_multicast_start_querier(br, &br->ip6_own_query); in br_multicast_set_querier()
2261 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_querier()
2266 int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val) in br_multicast_set_hash_max() argument
2272 spin_lock_bh(&br->multicast_lock); in br_multicast_set_hash_max()
2276 mdb = mlock_dereference(br->mdb, br); in br_multicast_set_hash_max()
2282 old = br->hash_max; in br_multicast_set_hash_max()
2283 br->hash_max = val; in br_multicast_set_hash_max()
2289 br->hash_max = old; in br_multicast_set_hash_max()
2293 err = br_mdb_rehash(&br->mdb, br->hash_max, in br_multicast_set_hash_max()
2294 br->hash_elasticity); in br_multicast_set_hash_max()
2300 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_hash_max()
2305 int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val) in br_multicast_set_igmp_version() argument
2316 spin_lock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
2317 br->multicast_igmp_version = val; in br_multicast_set_igmp_version()
2318 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
2324 int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val) in br_multicast_set_mld_version() argument
2335 spin_lock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
2336 br->multicast_mld_version = val; in br_multicast_set_mld_version()
2337 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
2363 struct net_bridge *br; in br_multicast_list_adjacent() local
2374 if (!port || !port->br) in br_multicast_list_adjacent()
2377 br = port->br; in br_multicast_list_adjacent()
2379 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_list_adjacent()
2411 struct net_bridge *br; in br_multicast_has_querier_anywhere() local
2421 if (!port || !port->br) in br_multicast_has_querier_anywhere()
2424 br = port->br; in br_multicast_has_querier_anywhere()
2429 ret = br_multicast_querier_exists(br, &eth); in br_multicast_has_querier_anywhere()
2448 struct net_bridge *br; in br_multicast_has_querier_adjacent() local
2457 if (!port || !port->br) in br_multicast_has_querier_adjacent()
2460 br = port->br; in br_multicast_has_querier_adjacent()
2464 if (!timer_pending(&br->ip4_other_query.timer) || in br_multicast_has_querier_adjacent()
2465 rcu_dereference(br->ip4_querier.port) == port) in br_multicast_has_querier_adjacent()
2470 if (!timer_pending(&br->ip6_other_query.timer) || in br_multicast_has_querier_adjacent()
2471 rcu_dereference(br->ip6_querier.port) == port) in br_multicast_has_querier_adjacent()
2557 void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, in br_multicast_count() argument
2563 if (!type || !br->multicast_stats_enabled) in br_multicast_count()
2569 stats = br->mcast_stats; in br_multicast_count()
2576 int br_multicast_init_stats(struct net_bridge *br) in br_multicast_init_stats() argument
2578 br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats); in br_multicast_init_stats()
2579 if (!br->mcast_stats) in br_multicast_init_stats()
2585 void br_multicast_uninit_stats(struct net_bridge *br) in br_multicast_uninit_stats() argument
2587 free_percpu(br->mcast_stats); in br_multicast_uninit_stats()
2596 void br_multicast_get_stats(const struct net_bridge *br, in br_multicast_get_stats() argument
2608 stats = br->mcast_stats; in br_multicast_get_stats()