Lines Matching refs:br

38 static void br_multicast_start_querier(struct net_bridge *br,
40 static void br_multicast_add_router(struct net_bridge *br,
42 static void br_ip4_multicast_leave_group(struct net_bridge *br,
47 static void br_ip6_multicast_leave_group(struct net_bridge *br,
150 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, in br_mdb_get() argument
153 struct net_bridge_mdb_htable *mdb = rcu_dereference(br->mdb); in br_mdb_get()
156 if (br->multicast_disabled) in br_mdb_get()
240 struct net_bridge *br = mp->br; in br_multicast_group_expired() local
243 spin_lock(&br->multicast_lock); in br_multicast_group_expired()
244 if (!netif_running(br->dev) || timer_pending(&mp->timer)) in br_multicast_group_expired()
252 mdb = mlock_dereference(br->mdb, br); in br_multicast_group_expired()
260 spin_unlock(&br->multicast_lock); in br_multicast_group_expired()
263 static void br_multicast_del_pg(struct net_bridge *br, in br_multicast_del_pg() argument
271 mdb = mlock_dereference(br->mdb, br); in br_multicast_del_pg()
278 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_del_pg()
286 br_mdb_notify(br->dev, p->port, &pg->addr, RTM_DELMDB, in br_multicast_del_pg()
291 netif_running(br->dev)) in br_multicast_del_pg()
303 struct net_bridge *br = pg->port->br; in br_multicast_port_group_expired() local
305 spin_lock(&br->multicast_lock); in br_multicast_port_group_expired()
306 if (!netif_running(br->dev) || timer_pending(&pg->timer) || in br_multicast_port_group_expired()
310 br_multicast_del_pg(br, pg); in br_multicast_port_group_expired()
313 spin_unlock(&br->multicast_lock); in br_multicast_port_group_expired()
363 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br, in br_ip4_multicast_alloc_query() argument
371 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*iph) + in br_ip4_multicast_alloc_query()
381 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip4_multicast_alloc_query()
402 iph->saddr = br->multicast_query_use_ifaddr ? in br_ip4_multicast_alloc_query()
403 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0; in br_ip4_multicast_alloc_query()
415 ih->code = (group ? br->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
416 br->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
430 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, in br_ip6_multicast_alloc_query() argument
440 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*ip6h) + in br_ip6_multicast_alloc_query()
451 ether_addr_copy(eth->h_source, br->dev->dev_addr); in br_ip6_multicast_alloc_query()
464 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, in br_ip6_multicast_alloc_query()
488 br->multicast_query_response_interval : in br_ip6_multicast_alloc_query()
489 br->multicast_last_member_interval; in br_ip6_multicast_alloc_query()
512 static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br, in br_multicast_alloc_query() argument
517 return br_ip4_multicast_alloc_query(br, addr->u.ip4); in br_multicast_alloc_query()
520 return br_ip6_multicast_alloc_query(br, &addr->u.ip6); in br_multicast_alloc_query()
527 struct net_bridge *br, struct net_bridge_port *port, in br_multicast_get_group() argument
537 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_get_group()
547 if (unlikely(count > br->hash_elasticity && count)) { in br_multicast_get_group()
549 br_info(br, "Multicast hash table " in br_multicast_get_group()
551 port ? port->dev->name : br->dev->name); in br_multicast_get_group()
553 elasticity = br->hash_elasticity; in br_multicast_get_group()
558 if (unlikely(max > br->hash_max)) { in br_multicast_get_group()
559 br_warn(br, "Multicast hash table maximum of %d " in br_multicast_get_group()
561 br->hash_max, in br_multicast_get_group()
562 port ? port->dev->name : br->dev->name); in br_multicast_get_group()
565 br->multicast_disabled = 1; in br_multicast_get_group()
573 br_info(br, "Multicast hash table " in br_multicast_get_group()
575 port ? port->dev->name : br->dev->name); in br_multicast_get_group()
580 err = br_mdb_rehash(&br->mdb, max, elasticity); in br_multicast_get_group()
582 br_warn(br, "Cannot rehash multicast " in br_multicast_get_group()
584 port ? port->dev->name : br->dev->name, in br_multicast_get_group()
600 struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br, in br_multicast_new_group() argument
608 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_new_group()
610 err = br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0); in br_multicast_new_group()
617 mp = br_multicast_get_group(br, port, group, hash); in br_multicast_new_group()
624 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_new_group()
636 mp->br = br; in br_multicast_new_group()
670 static int br_multicast_add_group(struct net_bridge *br, in br_multicast_add_group() argument
680 spin_lock(&br->multicast_lock); in br_multicast_add_group()
681 if (!netif_running(br->dev) || in br_multicast_add_group()
685 mp = br_multicast_new_group(br, port, group); in br_multicast_add_group()
692 mod_timer(&mp->timer, now + br->multicast_membership_interval); in br_multicast_add_group()
697 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_add_group()
709 br_mdb_notify(br->dev, port, group, RTM_NEWMDB, MDB_TEMPORARY); in br_multicast_add_group()
712 mod_timer(&p->timer, now + br->multicast_membership_interval); in br_multicast_add_group()
717 spin_unlock(&br->multicast_lock); in br_multicast_add_group()
721 static int br_ip4_multicast_add_group(struct net_bridge *br, in br_ip4_multicast_add_group() argument
735 return br_multicast_add_group(br, port, &br_group); in br_ip4_multicast_add_group()
739 static int br_ip6_multicast_add_group(struct net_bridge *br, in br_ip6_multicast_add_group() argument
753 return br_multicast_add_group(br, port, &br_group); in br_ip6_multicast_add_group()
760 struct net_bridge *br = port->br; in br_multicast_router_expired() local
762 spin_lock(&br->multicast_lock); in br_multicast_router_expired()
769 br_rtr_notify(br->dev, port, RTM_DELMDB); in br_multicast_router_expired()
772 spin_unlock(&br->multicast_lock); in br_multicast_router_expired()
779 static void br_multicast_querier_expired(struct net_bridge *br, in br_multicast_querier_expired() argument
782 spin_lock(&br->multicast_lock); in br_multicast_querier_expired()
783 if (!netif_running(br->dev) || br->multicast_disabled) in br_multicast_querier_expired()
786 br_multicast_start_querier(br, query); in br_multicast_querier_expired()
789 spin_unlock(&br->multicast_lock); in br_multicast_querier_expired()
794 struct net_bridge *br = (void *)data; in br_ip4_multicast_querier_expired() local
796 br_multicast_querier_expired(br, &br->ip4_own_query); in br_ip4_multicast_querier_expired()
802 struct net_bridge *br = (void *)data; in br_ip6_multicast_querier_expired() local
804 br_multicast_querier_expired(br, &br->ip6_own_query); in br_ip6_multicast_querier_expired()
808 static void br_multicast_select_own_querier(struct net_bridge *br, in br_multicast_select_own_querier() argument
813 br->ip4_querier.addr.u.ip4 = ip_hdr(skb)->saddr; in br_multicast_select_own_querier()
816 br->ip6_querier.addr.u.ip6 = ipv6_hdr(skb)->saddr; in br_multicast_select_own_querier()
820 static void __br_multicast_send_query(struct net_bridge *br, in __br_multicast_send_query() argument
826 skb = br_multicast_alloc_query(br, ip); in __br_multicast_send_query()
836 br_multicast_select_own_querier(br, ip, skb); in __br_multicast_send_query()
841 static void br_multicast_send_query(struct net_bridge *br, in br_multicast_send_query() argument
849 if (!netif_running(br->dev) || br->multicast_disabled || in br_multicast_send_query()
850 !br->multicast_querier) in br_multicast_send_query()
856 (own_query == &br->ip4_own_query)) { in br_multicast_send_query()
857 other_query = &br->ip4_other_query; in br_multicast_send_query()
861 other_query = &br->ip6_other_query; in br_multicast_send_query()
869 __br_multicast_send_query(br, port, &br_group); in br_multicast_send_query()
872 time += own_query->startup_sent < br->multicast_startup_query_count ? in br_multicast_send_query()
873 br->multicast_startup_query_interval : in br_multicast_send_query()
874 br->multicast_query_interval; in br_multicast_send_query()
882 struct net_bridge *br = port->br; in br_multicast_port_query_expired() local
884 spin_lock(&br->multicast_lock); in br_multicast_port_query_expired()
889 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_port_query_expired()
892 br_multicast_send_query(port->br, port, query); in br_multicast_port_query_expired()
895 spin_unlock(&br->multicast_lock); in br_multicast_port_query_expired()
930 struct net_bridge *br = port->br; in br_multicast_del_port() local
935 spin_lock_bh(&br->multicast_lock); in br_multicast_del_port()
937 br_multicast_del_pg(br, pg); in br_multicast_del_port()
938 spin_unlock_bh(&br->multicast_lock); in br_multicast_del_port()
953 struct net_bridge *br = port->br; in br_multicast_enable_port() local
955 spin_lock(&br->multicast_lock); in br_multicast_enable_port()
956 if (br->multicast_disabled || !netif_running(br->dev)) in br_multicast_enable_port()
964 br_multicast_add_router(br, port); in br_multicast_enable_port()
967 spin_unlock(&br->multicast_lock); in br_multicast_enable_port()
972 struct net_bridge *br = port->br; in br_multicast_disable_port() local
976 spin_lock(&br->multicast_lock); in br_multicast_disable_port()
979 br_multicast_del_pg(br, pg); in br_multicast_disable_port()
983 br_rtr_notify(br->dev, port, RTM_DELMDB); in br_multicast_disable_port()
990 spin_unlock(&br->multicast_lock); in br_multicast_disable_port()
993 static int br_ip4_multicast_igmp3_report(struct net_bridge *br, in br_ip4_multicast_igmp3_report() argument
1041 br_ip4_multicast_leave_group(br, port, group, vid); in br_ip4_multicast_igmp3_report()
1043 err = br_ip4_multicast_add_group(br, port, group, vid); in br_ip4_multicast_igmp3_report()
1053 static int br_ip6_multicast_mld2_report(struct net_bridge *br, in br_ip6_multicast_mld2_report() argument
1108 br_ip6_multicast_leave_group(br, port, &grec->grec_mca, in br_ip6_multicast_mld2_report()
1111 err = br_ip6_multicast_add_group(br, port, in br_ip6_multicast_mld2_report()
1122 static bool br_ip4_multicast_select_querier(struct net_bridge *br, in br_ip4_multicast_select_querier() argument
1126 if (!timer_pending(&br->ip4_own_query.timer) && in br_ip4_multicast_select_querier()
1127 !timer_pending(&br->ip4_other_query.timer)) in br_ip4_multicast_select_querier()
1130 if (!br->ip4_querier.addr.u.ip4) in br_ip4_multicast_select_querier()
1133 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.u.ip4)) in br_ip4_multicast_select_querier()
1139 br->ip4_querier.addr.u.ip4 = saddr; in br_ip4_multicast_select_querier()
1142 rcu_assign_pointer(br->ip4_querier.port, port); in br_ip4_multicast_select_querier()
1148 static bool br_ip6_multicast_select_querier(struct net_bridge *br, in br_ip6_multicast_select_querier() argument
1152 if (!timer_pending(&br->ip6_own_query.timer) && in br_ip6_multicast_select_querier()
1153 !timer_pending(&br->ip6_other_query.timer)) in br_ip6_multicast_select_querier()
1156 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.u.ip6) <= 0) in br_ip6_multicast_select_querier()
1162 br->ip6_querier.addr.u.ip6 = *saddr; in br_ip6_multicast_select_querier()
1165 rcu_assign_pointer(br->ip6_querier.port, port); in br_ip6_multicast_select_querier()
1171 static bool br_multicast_select_querier(struct net_bridge *br, in br_multicast_select_querier() argument
1177 return br_ip4_multicast_select_querier(br, port, saddr->u.ip4); in br_multicast_select_querier()
1180 return br_ip6_multicast_select_querier(br, port, &saddr->u.ip6); in br_multicast_select_querier()
1188 br_multicast_update_query_timer(struct net_bridge *br, in br_multicast_update_query_timer() argument
1195 mod_timer(&query->timer, jiffies + br->multicast_querier_interval); in br_multicast_update_query_timer()
1203 static void br_multicast_add_router(struct net_bridge *br, in br_multicast_add_router() argument
1212 hlist_for_each_entry(p, &br->router_list, rlist) { in br_multicast_add_router()
1221 hlist_add_head_rcu(&port->rlist, &br->router_list); in br_multicast_add_router()
1222 br_rtr_notify(br->dev, port, RTM_NEWMDB); in br_multicast_add_router()
1225 static void br_multicast_mark_router(struct net_bridge *br, in br_multicast_mark_router() argument
1231 if (br->multicast_router == 1) in br_multicast_mark_router()
1232 mod_timer(&br->multicast_router_timer, in br_multicast_mark_router()
1233 now + br->multicast_querier_interval); in br_multicast_mark_router()
1240 br_multicast_add_router(br, port); in br_multicast_mark_router()
1243 now + br->multicast_querier_interval); in br_multicast_mark_router()
1246 static void br_multicast_query_received(struct net_bridge *br, in br_multicast_query_received() argument
1252 if (!br_multicast_select_querier(br, port, saddr)) in br_multicast_query_received()
1255 br_multicast_update_query_timer(br, query, max_delay); in br_multicast_query_received()
1256 br_multicast_mark_router(br, port); in br_multicast_query_received()
1259 static int br_ip4_multicast_query(struct net_bridge *br, in br_ip4_multicast_query() argument
1277 spin_lock(&br->multicast_lock); in br_ip4_multicast_query()
1278 if (!netif_running(br->dev) || in br_ip4_multicast_query()
1306 br_multicast_query_received(br, port, &br->ip4_other_query, in br_ip4_multicast_query()
1311 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid); in br_ip4_multicast_query()
1315 max_delay *= br->multicast_last_member_count; in br_ip4_multicast_query()
1324 (p = mlock_dereference(*pp, br)) != NULL; in br_ip4_multicast_query()
1333 spin_unlock(&br->multicast_lock); in br_ip4_multicast_query()
1338 static int br_ip6_multicast_query(struct net_bridge *br, in br_ip6_multicast_query() argument
1357 spin_lock(&br->multicast_lock); in br_ip6_multicast_query()
1358 if (!netif_running(br->dev) || in br_ip6_multicast_query()
1389 br_multicast_query_received(br, port, &br->ip6_other_query, in br_ip6_multicast_query()
1396 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid); in br_ip6_multicast_query()
1400 max_delay *= br->multicast_last_member_count; in br_ip6_multicast_query()
1408 (p = mlock_dereference(*pp, br)) != NULL; in br_ip6_multicast_query()
1417 spin_unlock(&br->multicast_lock); in br_ip6_multicast_query()
1423 br_multicast_leave_group(struct net_bridge *br, in br_multicast_leave_group() argument
1435 spin_lock(&br->multicast_lock); in br_multicast_leave_group()
1436 if (!netif_running(br->dev) || in br_multicast_leave_group()
1440 mdb = mlock_dereference(br->mdb, br); in br_multicast_leave_group()
1449 (p = mlock_dereference(*pp, br)) != NULL; in br_multicast_leave_group()
1458 br_mdb_notify(br->dev, port, group, RTM_DELMDB, in br_multicast_leave_group()
1462 netif_running(br->dev)) in br_multicast_leave_group()
1471 if (br->multicast_querier) { in br_multicast_leave_group()
1472 __br_multicast_send_query(br, port, &mp->addr); in br_multicast_leave_group()
1474 time = jiffies + br->multicast_last_member_count * in br_multicast_leave_group()
1475 br->multicast_last_member_interval; in br_multicast_leave_group()
1479 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1481 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1497 time = now + br->multicast_last_member_count * in br_multicast_leave_group()
1498 br->multicast_last_member_interval; in br_multicast_leave_group()
1511 for (p = mlock_dereference(mp->ports, br); in br_multicast_leave_group()
1513 p = mlock_dereference(p->next, br)) { in br_multicast_leave_group()
1527 spin_unlock(&br->multicast_lock); in br_multicast_leave_group()
1530 static void br_ip4_multicast_leave_group(struct net_bridge *br, in br_ip4_multicast_leave_group() argument
1541 own_query = port ? &port->ip4_own_query : &br->ip4_own_query; in br_ip4_multicast_leave_group()
1547 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query, in br_ip4_multicast_leave_group()
1552 static void br_ip6_multicast_leave_group(struct net_bridge *br, in br_ip6_multicast_leave_group() argument
1563 own_query = port ? &port->ip6_own_query : &br->ip6_own_query; in br_ip6_multicast_leave_group()
1569 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, in br_ip6_multicast_leave_group()
1574 static int br_multicast_ipv4_rcv(struct net_bridge *br, in br_multicast_ipv4_rcv() argument
1600 err = br_ip4_multicast_add_group(br, port, ih->group, vid); in br_multicast_ipv4_rcv()
1603 err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid); in br_multicast_ipv4_rcv()
1606 err = br_ip4_multicast_query(br, port, skb_trimmed, vid); in br_multicast_ipv4_rcv()
1609 br_ip4_multicast_leave_group(br, port, ih->group, vid); in br_multicast_ipv4_rcv()
1620 static int br_multicast_ipv6_rcv(struct net_bridge *br, in br_multicast_ipv6_rcv() argument
1645 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid); in br_multicast_ipv6_rcv()
1648 err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid); in br_multicast_ipv6_rcv()
1651 err = br_ip6_multicast_query(br, port, skb_trimmed, vid); in br_multicast_ipv6_rcv()
1654 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid); in br_multicast_ipv6_rcv()
1665 int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, in br_multicast_rcv() argument
1671 if (br->multicast_disabled) in br_multicast_rcv()
1676 return br_multicast_ipv4_rcv(br, port, skb, vid); in br_multicast_rcv()
1679 return br_multicast_ipv6_rcv(br, port, skb, vid); in br_multicast_rcv()
1686 static void br_multicast_query_expired(struct net_bridge *br, in br_multicast_query_expired() argument
1690 spin_lock(&br->multicast_lock); in br_multicast_query_expired()
1691 if (query->startup_sent < br->multicast_startup_query_count) in br_multicast_query_expired()
1695 br_multicast_send_query(br, NULL, query); in br_multicast_query_expired()
1696 spin_unlock(&br->multicast_lock); in br_multicast_query_expired()
1701 struct net_bridge *br = (void *)data; in br_ip4_multicast_query_expired() local
1703 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier); in br_ip4_multicast_query_expired()
1709 struct net_bridge *br = (void *)data; in br_ip6_multicast_query_expired() local
1711 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier); in br_ip6_multicast_query_expired()
1715 void br_multicast_init(struct net_bridge *br) in br_multicast_init() argument
1717 br->hash_elasticity = 4; in br_multicast_init()
1718 br->hash_max = 512; in br_multicast_init()
1720 br->multicast_router = 1; in br_multicast_init()
1721 br->multicast_querier = 0; in br_multicast_init()
1722 br->multicast_query_use_ifaddr = 0; in br_multicast_init()
1723 br->multicast_last_member_count = 2; in br_multicast_init()
1724 br->multicast_startup_query_count = 2; in br_multicast_init()
1726 br->multicast_last_member_interval = HZ; in br_multicast_init()
1727 br->multicast_query_response_interval = 10 * HZ; in br_multicast_init()
1728 br->multicast_startup_query_interval = 125 * HZ / 4; in br_multicast_init()
1729 br->multicast_query_interval = 125 * HZ; in br_multicast_init()
1730 br->multicast_querier_interval = 255 * HZ; in br_multicast_init()
1731 br->multicast_membership_interval = 260 * HZ; in br_multicast_init()
1733 br->ip4_other_query.delay_time = 0; in br_multicast_init()
1734 br->ip4_querier.port = NULL; in br_multicast_init()
1736 br->ip6_other_query.delay_time = 0; in br_multicast_init()
1737 br->ip6_querier.port = NULL; in br_multicast_init()
1740 spin_lock_init(&br->multicast_lock); in br_multicast_init()
1741 setup_timer(&br->multicast_router_timer, in br_multicast_init()
1743 setup_timer(&br->ip4_other_query.timer, in br_multicast_init()
1744 br_ip4_multicast_querier_expired, (unsigned long)br); in br_multicast_init()
1745 setup_timer(&br->ip4_own_query.timer, br_ip4_multicast_query_expired, in br_multicast_init()
1746 (unsigned long)br); in br_multicast_init()
1748 setup_timer(&br->ip6_other_query.timer, in br_multicast_init()
1749 br_ip6_multicast_querier_expired, (unsigned long)br); in br_multicast_init()
1750 setup_timer(&br->ip6_own_query.timer, br_ip6_multicast_query_expired, in br_multicast_init()
1751 (unsigned long)br); in br_multicast_init()
1755 static void __br_multicast_open(struct net_bridge *br, in __br_multicast_open() argument
1760 if (br->multicast_disabled) in __br_multicast_open()
1766 void br_multicast_open(struct net_bridge *br) in br_multicast_open() argument
1768 __br_multicast_open(br, &br->ip4_own_query); in br_multicast_open()
1770 __br_multicast_open(br, &br->ip6_own_query); in br_multicast_open()
1774 void br_multicast_stop(struct net_bridge *br) in br_multicast_stop() argument
1776 del_timer_sync(&br->multicast_router_timer); in br_multicast_stop()
1777 del_timer_sync(&br->ip4_other_query.timer); in br_multicast_stop()
1778 del_timer_sync(&br->ip4_own_query.timer); in br_multicast_stop()
1780 del_timer_sync(&br->ip6_other_query.timer); in br_multicast_stop()
1781 del_timer_sync(&br->ip6_own_query.timer); in br_multicast_stop()
1785 void br_multicast_dev_del(struct net_bridge *br) in br_multicast_dev_del() argument
1793 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
1794 mdb = mlock_dereference(br->mdb, br); in br_multicast_dev_del()
1798 br->mdb = NULL; in br_multicast_dev_del()
1810 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
1812 spin_lock_bh(&br->multicast_lock); in br_multicast_dev_del()
1820 spin_unlock_bh(&br->multicast_lock); in br_multicast_dev_del()
1823 int br_multicast_set_router(struct net_bridge *br, unsigned long val) in br_multicast_set_router() argument
1827 spin_lock_bh(&br->multicast_lock); in br_multicast_set_router()
1832 del_timer(&br->multicast_router_timer); in br_multicast_set_router()
1835 br->multicast_router = val; in br_multicast_set_router()
1840 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_router()
1847 struct net_bridge *br = p->br; in br_multicast_set_port_router() local
1850 spin_lock(&br->multicast_lock); in br_multicast_set_port_router()
1861 br_rtr_notify(br->dev, p, RTM_DELMDB); in br_multicast_set_port_router()
1872 br_multicast_add_router(br, p); in br_multicast_set_port_router()
1876 spin_unlock(&br->multicast_lock); in br_multicast_set_port_router()
1881 static void br_multicast_start_querier(struct net_bridge *br, in br_multicast_start_querier() argument
1886 __br_multicast_open(br, query); in br_multicast_start_querier()
1888 list_for_each_entry(port, &br->port_list, list) { in br_multicast_start_querier()
1893 if (query == &br->ip4_own_query) in br_multicast_start_querier()
1902 int br_multicast_toggle(struct net_bridge *br, unsigned long val) in br_multicast_toggle() argument
1907 spin_lock_bh(&br->multicast_lock); in br_multicast_toggle()
1908 if (br->multicast_disabled == !val) in br_multicast_toggle()
1911 br->multicast_disabled = !val; in br_multicast_toggle()
1912 if (br->multicast_disabled) in br_multicast_toggle()
1915 if (!netif_running(br->dev)) in br_multicast_toggle()
1918 mdb = mlock_dereference(br->mdb, br); in br_multicast_toggle()
1923 br->multicast_disabled = !!val; in br_multicast_toggle()
1927 err = br_mdb_rehash(&br->mdb, mdb->max, in br_multicast_toggle()
1928 br->hash_elasticity); in br_multicast_toggle()
1933 br_multicast_start_querier(br, &br->ip4_own_query); in br_multicast_toggle()
1935 br_multicast_start_querier(br, &br->ip6_own_query); in br_multicast_toggle()
1939 spin_unlock_bh(&br->multicast_lock); in br_multicast_toggle()
1944 int br_multicast_set_querier(struct net_bridge *br, unsigned long val) in br_multicast_set_querier() argument
1950 spin_lock_bh(&br->multicast_lock); in br_multicast_set_querier()
1951 if (br->multicast_querier == val) in br_multicast_set_querier()
1954 br->multicast_querier = val; in br_multicast_set_querier()
1958 max_delay = br->multicast_query_response_interval; in br_multicast_set_querier()
1960 if (!timer_pending(&br->ip4_other_query.timer)) in br_multicast_set_querier()
1961 br->ip4_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
1963 br_multicast_start_querier(br, &br->ip4_own_query); in br_multicast_set_querier()
1966 if (!timer_pending(&br->ip6_other_query.timer)) in br_multicast_set_querier()
1967 br->ip6_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
1969 br_multicast_start_querier(br, &br->ip6_own_query); in br_multicast_set_querier()
1973 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_querier()
1978 int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val) in br_multicast_set_hash_max() argument
1984 spin_lock_bh(&br->multicast_lock); in br_multicast_set_hash_max()
1988 mdb = mlock_dereference(br->mdb, br); in br_multicast_set_hash_max()
1994 old = br->hash_max; in br_multicast_set_hash_max()
1995 br->hash_max = val; in br_multicast_set_hash_max()
2001 br->hash_max = old; in br_multicast_set_hash_max()
2005 err = br_mdb_rehash(&br->mdb, br->hash_max, in br_multicast_set_hash_max()
2006 br->hash_elasticity); in br_multicast_set_hash_max()
2012 spin_unlock_bh(&br->multicast_lock); in br_multicast_set_hash_max()
2037 struct net_bridge *br; in br_multicast_list_adjacent() local
2048 if (!port || !port->br) in br_multicast_list_adjacent()
2051 br = port->br; in br_multicast_list_adjacent()
2053 list_for_each_entry_rcu(port, &br->port_list, list) { in br_multicast_list_adjacent()
2085 struct net_bridge *br; in br_multicast_has_querier_anywhere() local
2095 if (!port || !port->br) in br_multicast_has_querier_anywhere()
2098 br = port->br; in br_multicast_has_querier_anywhere()
2103 ret = br_multicast_querier_exists(br, &eth); in br_multicast_has_querier_anywhere()
2122 struct net_bridge *br; in br_multicast_has_querier_adjacent() local
2131 if (!port || !port->br) in br_multicast_has_querier_adjacent()
2134 br = port->br; in br_multicast_has_querier_adjacent()
2138 if (!timer_pending(&br->ip4_other_query.timer) || in br_multicast_has_querier_adjacent()
2139 rcu_dereference(br->ip4_querier.port) == port) in br_multicast_has_querier_adjacent()
2144 if (!timer_pending(&br->ip6_other_query.timer) || in br_multicast_has_querier_adjacent()
2145 rcu_dereference(br->ip6_querier.port) == port) in br_multicast_has_querier_adjacent()