Lines Matching +full:3 +full: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()
397 eth->h_dest[3] = 0; 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()
420 ((u8 *)&iph[1])[3] = 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()
438 case 3: 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()
517 hopopt[3] = 2; /* Length of RA Option */ 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
1188 br_ip4_multicast_leave_group(br, port, group, vid, src); in br_ip4_multicast_igmp3_report()
1190 err = br_ip4_multicast_add_group(br, port, group, vid, in br_ip4_multicast_igmp3_report()
1201 static int br_ip6_multicast_mld2_report(struct net_bridge *br, in br_ip6_multicast_mld2_report() argument
1261 br_ip6_multicast_leave_group(br, port, &grec->grec_mca, in br_ip6_multicast_mld2_report()
1264 err = br_ip6_multicast_add_group(br, port, in br_ip6_multicast_mld2_report()
1276 static bool br_ip4_multicast_select_querier(struct net_bridge *br, in br_ip4_multicast_select_querier() argument
1280 if (!timer_pending(&br->ip4_own_query.timer) && in br_ip4_multicast_select_querier()
1281 !timer_pending(&br->ip4_other_query.timer)) in br_ip4_multicast_select_querier()
1284 if (!br->ip4_querier.addr.u.ip4) in br_ip4_multicast_select_querier()
1287 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.u.ip4)) in br_ip4_multicast_select_querier()
1293 br->ip4_querier.addr.u.ip4 = saddr; in br_ip4_multicast_select_querier()
1296 rcu_assign_pointer(br->ip4_querier.port, port); in br_ip4_multicast_select_querier()
1302 static bool br_ip6_multicast_select_querier(struct net_bridge *br, in br_ip6_multicast_select_querier() argument
1306 if (!timer_pending(&br->ip6_own_query.timer) && in br_ip6_multicast_select_querier()
1307 !timer_pending(&br->ip6_other_query.timer)) in br_ip6_multicast_select_querier()
1310 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.u.ip6) <= 0) in br_ip6_multicast_select_querier()
1316 br->ip6_querier.addr.u.ip6 = *saddr; in br_ip6_multicast_select_querier()
1319 rcu_assign_pointer(br->ip6_querier.port, port); in br_ip6_multicast_select_querier()
1325 static bool br_multicast_select_querier(struct net_bridge *br, in br_multicast_select_querier() argument
1331 return br_ip4_multicast_select_querier(br, port, saddr->u.ip4); in br_multicast_select_querier()
1334 return br_ip6_multicast_select_querier(br, port, &saddr->u.ip6); in br_multicast_select_querier()
1342 br_multicast_update_query_timer(struct net_bridge *br, in br_multicast_update_query_timer() argument
1349 mod_timer(&query->timer, jiffies + br->multicast_querier_interval); in br_multicast_update_query_timer()
1368 * and locked by br->multicast_lock and RCU
1370 static void br_multicast_add_router(struct net_bridge *br, in br_multicast_add_router() argument
1379 hlist_for_each_entry(p, &br->router_list, rlist) { in br_multicast_add_router()
1388 hlist_add_head_rcu(&port->rlist, &br->router_list); in br_multicast_add_router()
1389 br_rtr_notify(br->dev, port, RTM_NEWMDB); in br_multicast_add_router()
1393 static void br_multicast_mark_router(struct net_bridge *br, in br_multicast_mark_router() argument
1399 if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { in br_multicast_mark_router()
1400 if (!timer_pending(&br->multicast_router_timer)) in br_multicast_mark_router()
1401 br_mc_router_state_change(br, true); in br_multicast_mark_router()
1402 mod_timer(&br->multicast_router_timer, in br_multicast_mark_router()
1403 now + br->multicast_querier_interval); in br_multicast_mark_router()
1412 br_multicast_add_router(br, port); in br_multicast_mark_router()
1415 now + br->multicast_querier_interval); in br_multicast_mark_router()
1418 static void br_multicast_query_received(struct net_bridge *br, in br_multicast_query_received() argument
1424 if (!br_multicast_select_querier(br, port, saddr)) in br_multicast_query_received()
1427 br_multicast_update_query_timer(br, query, max_delay); in br_multicast_query_received()
1428 br_multicast_mark_router(br, port); in br_multicast_query_received()
1431 static void br_ip4_multicast_query(struct net_bridge *br, in br_ip4_multicast_query() argument
1448 spin_lock(&br->multicast_lock); in br_ip4_multicast_query()
1449 if (!netif_running(br->dev) || in br_ip4_multicast_query()
1477 br_multicast_query_received(br, port, &br->ip4_other_query, in br_ip4_multicast_query()
1482 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid); in br_ip4_multicast_query()
1486 max_delay *= br->multicast_last_member_count; in br_ip4_multicast_query()
1495 (p = mlock_dereference(*pp, br)) != NULL; in br_ip4_multicast_query()
1504 spin_unlock(&br->multicast_lock); in br_ip4_multicast_query()
1508 static int br_ip6_multicast_query(struct net_bridge *br, in br_ip6_multicast_query() argument
1526 spin_lock(&br->multicast_lock); in br_ip6_multicast_query()
1527 if (!netif_running(br->dev) || in br_ip6_multicast_query()
1558 br_multicast_query_received(br, port, &br->ip6_other_query, in br_ip6_multicast_query()
1565 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid); in br_ip6_multicast_query()
1569 max_delay *= br->multicast_last_member_count; in br_ip6_multicast_query()
1577 (p = mlock_dereference(*pp, br)) != NULL; in br_ip6_multicast_query()
1586 spin_unlock(&br->multicast_lock); in br_ip6_multicast_query()
1592 br_multicast_leave_group(struct net_bridge *br, in br_multicast_leave_group() argument
1605 spin_lock(&br->multicast_lock); in br_multicast_leave_group()
1606 if (!netif_running(br->dev) || in br_multicast_leave_group()
1610 mdb = mlock_dereference(br->mdb, br); in br_multicast_leave_group()
1619 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_leave_group()
1631 br_mdb_notify(br->dev, port, group, RTM_DELMDB, in br_multicast_leave_group()
1635 netif_running(br->dev)) in br_multicast_leave_group()
1644 if (br->multicast_querier) { in br_multicast_leave_group()
1645 __br_multicast_send_query(br, port, &mp->addr); in br_multicast_leave_group()
1647 time = jiffies + br->multicast_last_member_count * in br_multicast_leave_group()
1648 br->multicast_last_member_interval; in br_multicast_leave_group()
1652 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1654 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1670 time = now + br->multicast_last_member_count * in br_multicast_leave_group()
1671 br->multicast_last_member_interval; in br_multicast_leave_group()
1684 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1686 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1700 spin_unlock(&br->multicast_lock); in br_multicast_leave_group()
1703 static void br_ip4_multicast_leave_group(struct net_bridge *br, in br_ip4_multicast_leave_group() argument
1715 own_query = port ? &port->ip4_own_query : &br->ip4_own_query; in br_ip4_multicast_leave_group()
1721 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query, in br_ip4_multicast_leave_group()
1726 static void br_ip6_multicast_leave_group(struct net_bridge *br, in br_ip6_multicast_leave_group() argument
1738 own_query = port ? &port->ip6_own_query : &br->ip6_own_query; in br_ip6_multicast_leave_group()
1744 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, in br_ip6_multicast_leave_group()
1749 static void br_multicast_err_count(const struct net_bridge *br, in br_multicast_err_count() argument
1756 if (!br->multicast_stats_enabled) in br_multicast_err_count()
1762 stats = br->mcast_stats; in br_multicast_err_count()
1782 static void br_multicast_pim(struct net_bridge *br, in br_multicast_pim() argument
1794 br_multicast_mark_router(br, port); in br_multicast_pim()
1797 static int br_multicast_ipv4_rcv(struct net_bridge *br, in br_multicast_ipv4_rcv() argument
1814 br_multicast_pim(br, port, skb); in br_multicast_ipv4_rcv()
1818 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv4_rcv()
1830 err = br_ip4_multicast_add_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
1833 err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid); in br_multicast_ipv4_rcv()
1836 br_ip4_multicast_query(br, port, skb_trimmed, vid); in br_multicast_ipv4_rcv()
1839 br_ip4_multicast_leave_group(br, port, ih->group, vid, src); in br_multicast_ipv4_rcv()
1846 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv4_rcv()
1853 static int br_multicast_ipv6_rcv(struct net_bridge *br, in br_multicast_ipv6_rcv() argument
1870 br_multicast_err_count(br, port, skb->protocol); in br_multicast_ipv6_rcv()
1881 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, in br_multicast_ipv6_rcv()
1885 err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid); in br_multicast_ipv6_rcv()
1888 err = br_ip6_multicast_query(br, port, skb_trimmed, vid); in br_multicast_ipv6_rcv()
1892 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src); in br_multicast_ipv6_rcv()
1899 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv6_rcv()
1906 int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, in br_multicast_rcv() argument
1914 if (br->multicast_disabled) in br_multicast_rcv()
1919 ret = br_multicast_ipv4_rcv(br, port, skb, vid); in br_multicast_rcv()
1923 ret = br_multicast_ipv6_rcv(br, port, skb, vid); in br_multicast_rcv()
1931 static void br_multicast_query_expired(struct net_bridge *br, in br_multicast_query_expired() argument
1935 spin_lock(&br->multicast_lock); in br_multicast_query_expired()
1936 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_query_expired()
1940 br_multicast_send_query(br, NULL, query); in br_multicast_query_expired()
1941 spin_unlock(&br->multicast_lock); in br_multicast_query_expired()
1946 struct net_bridge *br = from_timer(br, t, ip4_own_query.timer); in br_ip4_multicast_query_expired() local
1948 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier); in br_ip4_multicast_query_expired()
1954 struct net_bridge *br = from_timer(br, t, ip6_own_query.timer); in br_ip6_multicast_query_expired() local
1956 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier); in br_ip6_multicast_query_expired()
1960 void br_multicast_init(struct net_bridge *br) in br_multicast_init() argument
1962 br->hash_elasticity = 4; in br_multicast_init()
1963 br->hash_max = 512; in br_multicast_init()
1965 br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; in br_multicast_init()
1966 br->multicast_querier = 0; in br_multicast_init()
1967 br->multicast_query_use_ifaddr = 0; in br_multicast_init()
1968 br->multicast_last_member_count = 2; in br_multicast_init()
1969 br->multicast_startup_query_count = 2; in br_multicast_init()
1971 br->multicast_last_member_interval = HZ; in br_multicast_init()
1972 br->multicast_query_response_interval = 10 * HZ; in br_multicast_init()
1973 br->multicast_startup_query_interval = 125 * HZ / 4; in br_multicast_init()
1974 br->multicast_query_interval = 125 * HZ; in br_multicast_init()
1975 br->multicast_querier_interval = 255 * HZ; in br_multicast_init()
1976 br->multicast_membership_interval = 260 * HZ; in br_multicast_init()
1978 br->ip4_other_query.delay_time = 0; in br_multicast_init()
1979 br->ip4_querier.port = NULL; in br_multicast_init()
1980 br->multicast_igmp_version = 2; in br_multicast_init()
1982 br->multicast_mld_version = 1; in br_multicast_init()
1983 br->ip6_other_query.delay_time = 0; in br_multicast_init()
1984 br->ip6_querier.port = NULL; in br_multicast_init()
1986 br->has_ipv6_addr = 1; in br_multicast_init()
1988 spin_lock_init(&br->multicast_lock); in br_multicast_init()
1989 timer_setup(&br->multicast_router_timer, in br_multicast_init()
1991 timer_setup(&br->ip4_other_query.timer, in br_multicast_init()
1993 timer_setup(&br->ip4_own_query.timer, in br_multicast_init()
1996 timer_setup(&br->ip6_other_query.timer, in br_multicast_init()
1998 timer_setup(&br->ip6_own_query.timer, in br_multicast_init()
2003 static void __br_multicast_open(struct net_bridge *br, in __br_multicast_open() argument
2008 if (br->multicast_disabled) in __br_multicast_open()
2014 void br_multicast_open(struct net_bridge *br) in br_multicast_open() argument
2016 __br_multicast_open(br, &br->ip4_own_query); in br_multicast_open()
2018 __br_multicast_open(br, &br->ip6_own_query); in br_multicast_open()
2022 void br_multicast_stop(struct net_bridge *br) in br_multicast_stop() argument
2024 del_timer_sync(&br->multicast_router_timer); in br_multicast_stop()
2025 del_timer_sync(&br->ip4_other_query.timer); in br_multicast_stop()
2026 del_timer_sync(&br->ip4_own_query.timer); in br_multicast_stop()
2028 del_timer_sync(&br->ip6_other_query.timer); in br_multicast_stop()
2029 del_timer_sync(&br->ip6_own_query.timer); in br_multicast_stop()
2033 void br_multicast_dev_del(struct net_bridge *br) in br_multicast_dev_del() argument
2041 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
2042 mdb = mlock_dereference(br->mdb, br); in br_multicast_dev_del()
2046 br->mdb = NULL; in br_multicast_dev_del()
2058 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
2060 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
2068 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
2071 int br_multicast_set_router(struct net_bridge *br, unsigned long val) in br_multicast_set_router() argument
2075 spin_lock_bh(&br->multicast_lock); in br_multicast_set_router()
2080 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM); in br_multicast_set_router()
2081 del_timer(&br->multicast_router_timer); in br_multicast_set_router()
2082 br->multicast_router = val; in br_multicast_set_router()
2086 if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) in br_multicast_set_router()
2087 br_mc_router_state_change(br, false); in br_multicast_set_router()
2088 br->multicast_router = val; in br_multicast_set_router()
2093 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_router()
2103 br_rtr_notify(p->br->dev, p, RTM_DELMDB); in __del_port_router()
2113 struct net_bridge *br = p->br; in br_multicast_set_port_router() local
2117 spin_lock(&br->multicast_lock); in br_multicast_set_port_router()
2122 now + br->multicast_querier_interval); in br_multicast_set_port_router()
2139 br_multicast_add_router(br, p); in br_multicast_set_port_router()
2143 br_multicast_mark_router(br, p); in br_multicast_set_port_router()
2150 spin_unlock(&br->multicast_lock); in br_multicast_set_port_router()
2155 static void br_multicast_start_querier(struct net_bridge *br, in br_multicast_start_querier() argument
2160 __br_multicast_open(br, query); in br_multicast_start_querier()
2163 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_start_querier()
2168 if (query == &br->ip4_own_query) in br_multicast_start_querier()
2178 int br_multicast_toggle(struct net_bridge *br, unsigned long val) in br_multicast_toggle() argument
2184 spin_lock_bh(&br->multicast_lock); in br_multicast_toggle()
2185 if (br->multicast_disabled == !val) in br_multicast_toggle()
2188 br_mc_disabled_update(br->dev, !val); in br_multicast_toggle()
2189 br->multicast_disabled = !val; in br_multicast_toggle()
2190 if (br->multicast_disabled) in br_multicast_toggle()
2193 if (!netif_running(br->dev)) in br_multicast_toggle()
2196 mdb = mlock_dereference(br->mdb, br); in br_multicast_toggle()
2201 br->multicast_disabled = !!val; in br_multicast_toggle()
2205 err = br_mdb_rehash(&br->mdb, mdb->max, in br_multicast_toggle()
2206 br->hash_elasticity); in br_multicast_toggle()
2211 br_multicast_open(br); in br_multicast_toggle()
2212 list_for_each_entry(port, &br->port_list, list) in br_multicast_toggle()
2216 spin_unlock_bh(&br->multicast_lock); in br_multicast_toggle()
2223 struct net_bridge *br = netdev_priv(dev); in br_multicast_enabled() local
2225 return !br->multicast_disabled; in br_multicast_enabled()
2231 struct net_bridge *br = netdev_priv(dev); in br_multicast_router() local
2234 spin_lock_bh(&br->multicast_lock); in br_multicast_router()
2235 is_router = br_multicast_is_router(br); in br_multicast_router()
2236 spin_unlock_bh(&br->multicast_lock); in br_multicast_router()
2241 int br_multicast_set_querier(struct net_bridge *br, unsigned long val) in br_multicast_set_querier() argument
2247 spin_lock_bh(&br->multicast_lock); in br_multicast_set_querier()
2248 if (br->multicast_querier == val) in br_multicast_set_querier()
2251 br->multicast_querier = val; in br_multicast_set_querier()
2255 max_delay = br->multicast_query_response_interval; in br_multicast_set_querier()
2257 if (!timer_pending(&br->ip4_other_query.timer)) in br_multicast_set_querier()
2258 br->ip4_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
2260 br_multicast_start_querier(br, &br->ip4_own_query); in br_multicast_set_querier()
2263 if (!timer_pending(&br->ip6_other_query.timer)) in br_multicast_set_querier()
2264 br->ip6_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
2266 br_multicast_start_querier(br, &br->ip6_own_query); in br_multicast_set_querier()
2270 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_querier()
2275 int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val) in br_multicast_set_hash_max() argument
2281 spin_lock_bh(&br->multicast_lock); in br_multicast_set_hash_max()
2285 mdb = mlock_dereference(br->mdb, br); in br_multicast_set_hash_max()
2291 old = br->hash_max; in br_multicast_set_hash_max()
2292 br->hash_max = val; in br_multicast_set_hash_max()
2298 br->hash_max = old; in br_multicast_set_hash_max()
2302 err = br_mdb_rehash(&br->mdb, br->hash_max, in br_multicast_set_hash_max()
2303 br->hash_elasticity); in br_multicast_set_hash_max()
2309 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_hash_max()
2314 int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val) in br_multicast_set_igmp_version() argument
2316 /* Currently we support only version 2 and 3 */ in br_multicast_set_igmp_version()
2319 case 3: in br_multicast_set_igmp_version()
2325 spin_lock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
2326 br->multicast_igmp_version = val; in br_multicast_set_igmp_version()
2327 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_igmp_version()
2333 int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val) in br_multicast_set_mld_version() argument
2344 spin_lock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
2345 br->multicast_mld_version = val; in br_multicast_set_mld_version()
2346 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_mld_version()
2372 struct net_bridge *br; in br_multicast_list_adjacent() local
2383 if (!port || !port->br) in br_multicast_list_adjacent()
2386 br = port->br; in br_multicast_list_adjacent()
2388 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_list_adjacent()
2420 struct net_bridge *br; in br_multicast_has_querier_anywhere() local
2430 if (!port || !port->br) in br_multicast_has_querier_anywhere()
2433 br = port->br; in br_multicast_has_querier_anywhere()
2438 ret = br_multicast_querier_exists(br, ð); in br_multicast_has_querier_anywhere()
2457 struct net_bridge *br; in br_multicast_has_querier_adjacent() local
2466 if (!port || !port->br) in br_multicast_has_querier_adjacent()
2469 br = port->br; in br_multicast_has_querier_adjacent()
2473 if (!timer_pending(&br->ip4_other_query.timer) || in br_multicast_has_querier_adjacent()
2474 rcu_dereference(br->ip4_querier.port) == port) in br_multicast_has_querier_adjacent()
2479 if (!timer_pending(&br->ip6_other_query.timer) || in br_multicast_has_querier_adjacent()
2480 rcu_dereference(br->ip6_querier.port) == port) in br_multicast_has_querier_adjacent()
2566 void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, in br_multicast_count() argument
2572 if (!type || !br->multicast_stats_enabled) in br_multicast_count()
2578 stats = br->mcast_stats; in br_multicast_count()
2585 int br_multicast_init_stats(struct net_bridge *br) in br_multicast_init_stats() argument
2587 br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats); in br_multicast_init_stats()
2588 if (!br->mcast_stats) in br_multicast_init_stats()
2594 void br_multicast_uninit_stats(struct net_bridge *br) in br_multicast_uninit_stats() argument
2596 free_percpu(br->mcast_stats); in br_multicast_uninit_stats()
2605 void br_multicast_get_stats(const struct net_bridge *br, in br_multicast_get_stats() argument
2617 stats = br->mcast_stats; in br_multicast_get_stats()