Lines Matching refs:brmctx

53 static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
55 static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx,
57 static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx,
66 static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx,
69 static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx,
75 __br_multicast_add_group(struct net_bridge_mcast *brmctx,
84 static void __br_multicast_stop(struct net_bridge_mcast *brmctx);
148 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge_mcast *brmctx, in br_mdb_get() argument
151 struct net_bridge *br = brmctx->br; in br_mdb_get()
155 br_multicast_ctx_vlan_global_disabled(brmctx)) in br_mdb_get()
168 if (brmctx->multicast_igmp_version == 3) { in br_mdb_get()
181 if (brmctx->multicast_mld_version == 2) { in br_mdb_get()
267 br_multicast_ctx_should_use(const struct net_bridge_mcast *brmctx, in br_multicast_ctx_should_use() argument
270 if (!netif_running(brmctx->br->dev)) in br_multicast_ctx_should_use()
276 return !br_multicast_ctx_vlan_disabled(brmctx); in br_multicast_ctx_should_use()
298 struct net_bridge_mcast *brmctx; in __fwd_add_star_excl() local
301 brmctx = br_multicast_port_ctx_get_global(pmctx); in __fwd_add_star_excl()
304 if (br_sg_port_find(brmctx->br, &sg_key)) in __fwd_add_star_excl()
307 src_pg = __br_multicast_add_group(brmctx, pmctx, in __fwd_add_star_excl()
476 struct net_bridge_mcast *brmctx; in br_multicast_sg_add_exclude_ports() local
502 brmctx = br_multicast_port_ctx_get_global(pmctx); in br_multicast_sg_add_exclude_ports()
504 src_pg = __br_multicast_add_group(brmctx, pmctx, in br_multicast_sg_add_exclude_ports()
520 struct net_bridge_mcast *brmctx; in br_multicast_fwd_src_add() local
530 brmctx = br_multicast_port_ctx_get_global(pmctx); in br_multicast_fwd_src_add()
534 sg = __br_multicast_add_group(brmctx, pmctx, &sg_ip, in br_multicast_fwd_src_add()
905 static void __br_multicast_query_handle_vlan(struct net_bridge_mcast *brmctx, in __br_multicast_query_handle_vlan() argument
913 else if (br_multicast_ctx_is_vlan(brmctx)) in __br_multicast_query_handle_vlan()
914 vlan = brmctx->vlan; in __br_multicast_query_handle_vlan()
919 if (br_vlan_get_proto(brmctx->br->dev, &vlan_proto) != 0) in __br_multicast_query_handle_vlan()
925 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge_mcast *brmctx, in br_ip4_multicast_alloc_query() argument
948 if (brmctx->multicast_igmp_version == 3) { in br_ip4_multicast_alloc_query()
951 lmqt = now + (brmctx->multicast_last_member_interval * in br_ip4_multicast_alloc_query()
952 brmctx->multicast_last_member_count); in br_ip4_multicast_alloc_query()
968 pkt_size > brmctx->br->dev->mtu) in br_ip4_multicast_alloc_query()
971 skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size); in br_ip4_multicast_alloc_query()
975 __br_multicast_query_handle_vlan(brmctx, pmctx, skb); in br_ip4_multicast_alloc_query()
981 ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr); in br_ip4_multicast_alloc_query()
997 iph->saddr = br_opt_get(brmctx->br, BROPT_MULTICAST_QUERY_USE_IFADDR) ? in br_ip4_multicast_alloc_query()
998 inet_select_addr(brmctx->br->dev, 0, RT_SCOPE_LINK) : 0; in br_ip4_multicast_alloc_query()
1010 switch (brmctx->multicast_igmp_version) { in br_ip4_multicast_alloc_query()
1014 ih->code = (group ? brmctx->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
1015 brmctx->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
1025 ihv3->code = (group ? brmctx->multicast_last_member_interval : in br_ip4_multicast_alloc_query()
1026 brmctx->multicast_query_response_interval) / in br_ip4_multicast_alloc_query()
1029 ihv3->qqic = brmctx->multicast_query_interval / HZ; in br_ip4_multicast_alloc_query()
1072 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brmctx, in br_ip6_multicast_alloc_query() argument
1098 if (brmctx->multicast_mld_version == 2) { in br_ip6_multicast_alloc_query()
1101 llqt = now + (brmctx->multicast_last_member_interval * in br_ip6_multicast_alloc_query()
1102 brmctx->multicast_last_member_count); in br_ip6_multicast_alloc_query()
1118 pkt_size > brmctx->br->dev->mtu) in br_ip6_multicast_alloc_query()
1121 skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size); in br_ip6_multicast_alloc_query()
1125 __br_multicast_query_handle_vlan(brmctx, pmctx, skb); in br_ip6_multicast_alloc_query()
1132 ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr); in br_ip6_multicast_alloc_query()
1145 if (ipv6_dev_get_saddr(dev_net(brmctx->br->dev), brmctx->br->dev, in br_ip6_multicast_alloc_query()
1148 br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, false); in br_ip6_multicast_alloc_query()
1152 br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, true); in br_ip6_multicast_alloc_query()
1170 brmctx->multicast_query_response_interval : in br_ip6_multicast_alloc_query()
1171 brmctx->multicast_last_member_interval; in br_ip6_multicast_alloc_query()
1173 switch (brmctx->multicast_mld_version) { in br_ip6_multicast_alloc_query()
1196 mld2q->mld2q_qqic = brmctx->multicast_query_interval / HZ; in br_ip6_multicast_alloc_query()
1237 static struct sk_buff *br_multicast_alloc_query(struct net_bridge_mcast *brmctx, in br_multicast_alloc_query() argument
1251 return br_ip4_multicast_alloc_query(brmctx, pmctx, pg, in br_multicast_alloc_query()
1266 return br_ip6_multicast_alloc_query(brmctx, pmctx, pg, in br_multicast_alloc_query()
1473 void br_multicast_host_join(const struct net_bridge_mcast *brmctx, in br_multicast_host_join() argument
1487 mod_timer(&mp->timer, jiffies + brmctx->multicast_membership_interval); in br_multicast_host_join()
1503 __br_multicast_add_group(struct net_bridge_mcast *brmctx, in __br_multicast_add_group() argument
1516 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in __br_multicast_add_group()
1519 mp = br_multicast_new_group(brmctx->br, group); in __br_multicast_add_group()
1524 br_multicast_host_join(brmctx, mp, true); in __br_multicast_add_group()
1529 (p = mlock_dereference(*pp, brmctx->br)) != NULL; in __br_multicast_add_group()
1546 br_mdb_notify(brmctx->br->dev, mp, p, RTM_NEWMDB); in __br_multicast_add_group()
1551 now + brmctx->multicast_membership_interval); in __br_multicast_add_group()
1557 static int br_multicast_add_group(struct net_bridge_mcast *brmctx, in br_multicast_add_group() argument
1567 spin_lock(&brmctx->br->multicast_lock); in br_multicast_add_group()
1568 pg = __br_multicast_add_group(brmctx, pmctx, group, src, filter_mode, in br_multicast_add_group()
1572 spin_unlock(&brmctx->br->multicast_lock); in br_multicast_add_group()
1577 static int br_ip4_multicast_add_group(struct net_bridge_mcast *brmctx, in br_ip4_multicast_add_group() argument
1596 return br_multicast_add_group(brmctx, pmctx, &br_group, src, in br_ip4_multicast_add_group()
1601 static int br_ip6_multicast_add_group(struct net_bridge_mcast *brmctx, in br_ip6_multicast_add_group() argument
1620 return br_multicast_add_group(brmctx, pmctx, &br_group, src, in br_ip6_multicast_add_group()
1698 static void br_multicast_local_router_expired(struct net_bridge_mcast *brmctx, in br_multicast_local_router_expired() argument
1701 spin_lock(&brmctx->br->multicast_lock); in br_multicast_local_router_expired()
1702 if (brmctx->multicast_router == MDB_RTR_TYPE_DISABLED || in br_multicast_local_router_expired()
1703 brmctx->multicast_router == MDB_RTR_TYPE_PERM || in br_multicast_local_router_expired()
1704 br_ip4_multicast_is_router(brmctx) || in br_multicast_local_router_expired()
1705 br_ip6_multicast_is_router(brmctx)) in br_multicast_local_router_expired()
1708 br_mc_router_state_change(brmctx->br, false); in br_multicast_local_router_expired()
1710 spin_unlock(&brmctx->br->multicast_lock); in br_multicast_local_router_expired()
1715 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, in br_ip4_multicast_local_router_expired() local
1718 br_multicast_local_router_expired(brmctx, t); in br_ip4_multicast_local_router_expired()
1724 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, in br_ip6_multicast_local_router_expired() local
1727 br_multicast_local_router_expired(brmctx, t); in br_ip6_multicast_local_router_expired()
1731 static void br_multicast_querier_expired(struct net_bridge_mcast *brmctx, in br_multicast_querier_expired() argument
1734 spin_lock(&brmctx->br->multicast_lock); in br_multicast_querier_expired()
1735 if (!netif_running(brmctx->br->dev) || in br_multicast_querier_expired()
1736 br_multicast_ctx_vlan_global_disabled(brmctx) || in br_multicast_querier_expired()
1737 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) in br_multicast_querier_expired()
1740 br_multicast_start_querier(brmctx, query); in br_multicast_querier_expired()
1743 spin_unlock(&brmctx->br->multicast_lock); in br_multicast_querier_expired()
1748 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, in br_ip4_multicast_querier_expired() local
1751 br_multicast_querier_expired(brmctx, &brmctx->ip4_own_query); in br_ip4_multicast_querier_expired()
1757 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, in br_ip6_multicast_querier_expired() local
1760 br_multicast_querier_expired(brmctx, &brmctx->ip6_own_query); in br_ip6_multicast_querier_expired()
1764 static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx, in br_multicast_select_own_querier() argument
1769 brmctx->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr; in br_multicast_select_own_querier()
1772 brmctx->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr; in br_multicast_select_own_querier()
1776 static void __br_multicast_send_query(struct net_bridge_mcast *brmctx, in __br_multicast_send_query() argument
1789 if (!br_multicast_ctx_should_use(brmctx, pmctx) || in __br_multicast_send_query()
1790 !br_multicast_ctx_matches_vlan_snooping(brmctx)) in __br_multicast_send_query()
1794 skb = br_multicast_alloc_query(brmctx, pmctx, pg, ip_dst, group, in __br_multicast_send_query()
1802 br_multicast_count(brmctx->br, pmctx->port, skb, igmp_type, in __br_multicast_send_query()
1813 br_multicast_select_own_querier(brmctx, group, skb); in __br_multicast_send_query()
1814 br_multicast_count(brmctx->br, NULL, skb, igmp_type, in __br_multicast_send_query()
1833 static void br_multicast_update_querier(struct net_bridge_mcast *brmctx, in br_multicast_update_querier() argument
1844 static void br_multicast_send_query(struct net_bridge_mcast *brmctx, in br_multicast_send_query() argument
1853 if (!br_multicast_ctx_should_use(brmctx, pmctx) || in br_multicast_send_query()
1854 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) || in br_multicast_send_query()
1855 !brmctx->multicast_querier) in br_multicast_send_query()
1861 (own_query == &brmctx->ip4_own_query)) { in br_multicast_send_query()
1862 querier = &brmctx->ip4_querier; in br_multicast_send_query()
1863 other_query = &brmctx->ip4_other_query; in br_multicast_send_query()
1867 querier = &brmctx->ip6_querier; in br_multicast_send_query()
1868 other_query = &brmctx->ip6_other_query; in br_multicast_send_query()
1880 br_multicast_update_querier(brmctx, querier, 0, &zeroip); in br_multicast_send_query()
1883 __br_multicast_send_query(brmctx, pmctx, NULL, NULL, &br_group, false, in br_multicast_send_query()
1887 time += own_query->startup_sent < brmctx->multicast_startup_query_count ? in br_multicast_send_query()
1888 brmctx->multicast_startup_query_interval : in br_multicast_send_query()
1889 brmctx->multicast_query_interval; in br_multicast_send_query()
1898 struct net_bridge_mcast *brmctx; in br_multicast_port_query_expired() local
1904 brmctx = br_multicast_port_ctx_get_global(pmctx); in br_multicast_port_query_expired()
1905 if (query->startup_sent < brmctx->multicast_startup_query_count) in br_multicast_port_query_expired()
1908 br_multicast_send_query(brmctx, pmctx, query); in br_multicast_port_query_expired()
1938 struct net_bridge_mcast *brmctx; in br_multicast_port_group_rexmit() local
1949 brmctx = br_multicast_port_ctx_get_global(pmctx); in br_multicast_port_group_rexmit()
1950 if (!brmctx->multicast_querier) in br_multicast_port_group_rexmit()
1954 other_query = &brmctx->ip4_other_query; in br_multicast_port_group_rexmit()
1957 other_query = &brmctx->ip6_other_query; in br_multicast_port_group_rexmit()
1965 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, in br_multicast_port_group_rexmit()
1968 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, in br_multicast_port_group_rexmit()
1973 brmctx->multicast_last_member_interval); in br_multicast_port_group_rexmit()
2069 struct net_bridge_mcast *brmctx; in __br_multicast_enable_port_ctx() local
2071 brmctx = br_multicast_port_ctx_get_global(pmctx); in __br_multicast_enable_port_ctx()
2081 br_ip4_multicast_add_router(brmctx, pmctx); in __br_multicast_enable_port_ctx()
2082 br_ip6_multicast_add_router(brmctx, pmctx); in __br_multicast_enable_port_ctx()
2166 static void __grp_src_query_marked_and_rexmit(struct net_bridge_mcast *brmctx, in __grp_src_query_marked_and_rexmit() argument
2171 u32 lmqc = brmctx->multicast_last_member_count; in __grp_src_query_marked_and_rexmit()
2175 if (!netif_running(brmctx->br->dev) || in __grp_src_query_marked_and_rexmit()
2176 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) in __grp_src_query_marked_and_rexmit()
2180 other_query = &brmctx->ip4_other_query; in __grp_src_query_marked_and_rexmit()
2183 other_query = &brmctx->ip6_other_query; in __grp_src_query_marked_and_rexmit()
2186 lmqt = now + br_multicast_lmqt(brmctx); in __grp_src_query_marked_and_rexmit()
2191 if (brmctx->multicast_querier && in __grp_src_query_marked_and_rexmit()
2200 if (!brmctx->multicast_querier || in __grp_src_query_marked_and_rexmit()
2204 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, in __grp_src_query_marked_and_rexmit()
2207 lmi = now + brmctx->multicast_last_member_interval; in __grp_src_query_marked_and_rexmit()
2213 static void __grp_send_query_and_rexmit(struct net_bridge_mcast *brmctx, in __grp_send_query_and_rexmit() argument
2220 if (!netif_running(brmctx->br->dev) || in __grp_send_query_and_rexmit()
2221 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) in __grp_send_query_and_rexmit()
2225 other_query = &brmctx->ip4_other_query; in __grp_send_query_and_rexmit()
2228 other_query = &brmctx->ip6_other_query; in __grp_send_query_and_rexmit()
2231 if (brmctx->multicast_querier && in __grp_send_query_and_rexmit()
2233 lmi = now + brmctx->multicast_last_member_interval; in __grp_send_query_and_rexmit()
2234 pg->grp_query_rexmit_cnt = brmctx->multicast_last_member_count - 1; in __grp_send_query_and_rexmit()
2235 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, in __grp_send_query_and_rexmit()
2244 time_after(pg->timer.expires, now + br_multicast_lmqt(brmctx)))) in __grp_send_query_and_rexmit()
2245 mod_timer(&pg->timer, now + br_multicast_lmqt(brmctx)); in __grp_send_query_and_rexmit()
2253 static bool br_multicast_isinc_allow(const struct net_bridge_mcast *brmctx, in br_multicast_isinc_allow() argument
2276 __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx)); in br_multicast_isinc_allow()
2279 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in br_multicast_isinc_allow()
2291 static void __grp_src_isexc_incl(const struct net_bridge_mcast *brmctx, in __grp_src_isexc_incl() argument
2316 br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_isexc_incl()
2328 static bool __grp_src_isexc_excl(const struct net_bridge_mcast *brmctx, in __grp_src_isexc_excl() argument
2353 now + br_multicast_gmi(brmctx)); in __grp_src_isexc_excl()
2359 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_isexc_excl()
2369 static bool br_multicast_isexc(const struct net_bridge_mcast *brmctx, in br_multicast_isexc() argument
2378 __grp_src_isexc_incl(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in br_multicast_isexc()
2384 changed = __grp_src_isexc_excl(brmctx, pg, h_addr, srcs, nsrcs, in br_multicast_isexc()
2390 mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx)); in br_multicast_isexc()
2399 static bool __grp_src_toin_incl(struct net_bridge_mcast *brmctx, in __grp_src_toin_incl() argument
2428 __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx)); in __grp_src_toin_incl()
2431 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_toin_incl()
2436 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); in __grp_src_toin_incl()
2446 static bool __grp_src_toin_excl(struct net_bridge_mcast *brmctx, in __grp_src_toin_excl() argument
2478 __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx)); in __grp_src_toin_excl()
2481 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_toin_excl()
2486 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); in __grp_src_toin_excl()
2488 __grp_send_query_and_rexmit(brmctx, pmctx, pg); in __grp_src_toin_excl()
2493 static bool br_multicast_toin(struct net_bridge_mcast *brmctx, in br_multicast_toin() argument
2503 changed = __grp_src_toin_incl(brmctx, pmctx, pg, h_addr, srcs, in br_multicast_toin()
2507 changed = __grp_src_toin_excl(brmctx, pmctx, pg, h_addr, srcs, in br_multicast_toin()
2530 static void __grp_src_toex_incl(struct net_bridge_mcast *brmctx, in __grp_src_toex_incl() argument
2559 br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_toex_incl()
2564 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); in __grp_src_toex_incl()
2574 static bool __grp_src_toex_excl(struct net_bridge_mcast *brmctx, in __grp_src_toex_excl() argument
2608 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_toex_excl()
2615 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); in __grp_src_toex_excl()
2620 static bool br_multicast_toex(struct net_bridge_mcast *brmctx, in br_multicast_toex() argument
2630 __grp_src_toex_incl(brmctx, pmctx, pg, h_addr, srcs, nsrcs, in br_multicast_toex()
2636 changed = __grp_src_toex_excl(brmctx, pmctx, pg, h_addr, srcs, in br_multicast_toex()
2642 mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx)); in br_multicast_toex()
2650 static bool __grp_src_block_incl(struct net_bridge_mcast *brmctx, in __grp_src_block_incl() argument
2674 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_block_incl()
2679 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); in __grp_src_block_incl()
2688 static bool __grp_src_block_excl(struct net_bridge_mcast *brmctx, in __grp_src_block_excl() argument
2719 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, in __grp_src_block_excl()
2724 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); in __grp_src_block_excl()
2729 static bool br_multicast_block(struct net_bridge_mcast *brmctx, in br_multicast_block() argument
2738 changed = __grp_src_block_incl(brmctx, pmctx, pg, h_addr, srcs, in br_multicast_block()
2742 changed = __grp_src_block_excl(brmctx, pmctx, pg, h_addr, srcs, in br_multicast_block()
2778 static int br_ip4_multicast_igmp3_report(struct net_bridge_mcast *brmctx, in br_ip4_multicast_igmp3_report() argument
2783 bool igmpv2 = brmctx->multicast_igmp_version == 2; in br_ip4_multicast_igmp3_report()
2831 br_ip4_multicast_leave_group(brmctx, pmctx, in br_ip4_multicast_igmp3_report()
2836 err = br_ip4_multicast_add_group(brmctx, pmctx, group, in br_ip4_multicast_igmp3_report()
2845 spin_lock(&brmctx->br->multicast_lock); in br_ip4_multicast_igmp3_report()
2846 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in br_ip4_multicast_igmp3_report()
2849 mdst = br_mdb_ip4_get(brmctx->br, group, vid); in br_ip4_multicast_igmp3_report()
2860 changed = br_multicast_isinc_allow(brmctx, pg, h_addr, in br_ip4_multicast_igmp3_report()
2865 changed = br_multicast_isinc_allow(brmctx, pg, h_addr, in br_ip4_multicast_igmp3_report()
2870 changed = br_multicast_isexc(brmctx, pg, h_addr, in br_ip4_multicast_igmp3_report()
2875 changed = br_multicast_toin(brmctx, pmctx, pg, h_addr, in br_ip4_multicast_igmp3_report()
2880 changed = br_multicast_toex(brmctx, pmctx, pg, h_addr, in br_ip4_multicast_igmp3_report()
2885 changed = br_multicast_block(brmctx, pmctx, pg, h_addr, in br_ip4_multicast_igmp3_report()
2891 br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB); in br_ip4_multicast_igmp3_report()
2893 spin_unlock(&brmctx->br->multicast_lock); in br_ip4_multicast_igmp3_report()
2900 static int br_ip6_multicast_mld2_report(struct net_bridge_mcast *brmctx, in br_ip6_multicast_mld2_report() argument
2905 bool mldv1 = brmctx->multicast_mld_version == 1; in br_ip6_multicast_mld2_report()
2967 br_ip6_multicast_leave_group(brmctx, pmctx, in br_ip6_multicast_mld2_report()
2973 err = br_ip6_multicast_add_group(brmctx, pmctx, in br_ip6_multicast_mld2_report()
2983 spin_lock(&brmctx->br->multicast_lock); in br_ip6_multicast_mld2_report()
2984 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in br_ip6_multicast_mld2_report()
2987 mdst = br_mdb_ip6_get(brmctx->br, &grec->grec_mca, vid); in br_ip6_multicast_mld2_report()
2996 changed = br_multicast_isinc_allow(brmctx, pg, h_addr, in br_ip6_multicast_mld2_report()
3002 changed = br_multicast_isinc_allow(brmctx, pg, h_addr, in br_ip6_multicast_mld2_report()
3008 changed = br_multicast_isexc(brmctx, pg, h_addr, in br_ip6_multicast_mld2_report()
3014 changed = br_multicast_toin(brmctx, pmctx, pg, h_addr, in br_ip6_multicast_mld2_report()
3020 changed = br_multicast_toex(brmctx, pmctx, pg, h_addr, in br_ip6_multicast_mld2_report()
3026 changed = br_multicast_block(brmctx, pmctx, pg, h_addr, in br_ip6_multicast_mld2_report()
3033 br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB); in br_ip6_multicast_mld2_report()
3035 spin_unlock(&brmctx->br->multicast_lock); in br_ip6_multicast_mld2_report()
3042 static bool br_multicast_select_querier(struct net_bridge_mcast *brmctx, in br_multicast_select_querier() argument
3052 querier = &brmctx->ip4_querier; in br_multicast_select_querier()
3053 own_timer = &brmctx->ip4_own_query.timer; in br_multicast_select_querier()
3054 other_timer = &brmctx->ip4_other_query.timer; in br_multicast_select_querier()
3061 querier = &brmctx->ip6_querier; in br_multicast_select_querier()
3062 own_timer = &brmctx->ip6_own_query.timer; in br_multicast_select_querier()
3063 other_timer = &brmctx->ip6_other_query.timer; in br_multicast_select_querier()
3078 br_multicast_update_querier(brmctx, querier, port_ifidx, saddr); in br_multicast_select_querier()
3120 const struct net_bridge_mcast *brmctx, in br_multicast_dump_querier_state() argument
3127 if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) || in br_multicast_dump_querier_state()
3128 br_multicast_ctx_vlan_global_disabled(brmctx)) in br_multicast_dump_querier_state()
3136 if (!brmctx->multicast_querier && in br_multicast_dump_querier_state()
3137 !timer_pending(&brmctx->ip4_other_query.timer)) in br_multicast_dump_querier_state()
3140 br_multicast_read_querier(&brmctx->ip4_querier, &querier); in br_multicast_dump_querier_state()
3147 p = __br_multicast_get_querier_port(brmctx->br, &querier); in br_multicast_dump_querier_state()
3148 if (timer_pending(&brmctx->ip4_other_query.timer) && in br_multicast_dump_querier_state()
3150 br_timer_value(&brmctx->ip4_other_query.timer), in br_multicast_dump_querier_state()
3159 if (!brmctx->multicast_querier && in br_multicast_dump_querier_state()
3160 !timer_pending(&brmctx->ip6_other_query.timer)) in br_multicast_dump_querier_state()
3163 br_multicast_read_querier(&brmctx->ip6_querier, &querier); in br_multicast_dump_querier_state()
3170 p = __br_multicast_get_querier_port(brmctx->br, &querier); in br_multicast_dump_querier_state()
3171 if (timer_pending(&brmctx->ip6_other_query.timer) && in br_multicast_dump_querier_state()
3173 br_timer_value(&brmctx->ip6_other_query.timer), in br_multicast_dump_querier_state()
3195 br_multicast_update_query_timer(struct net_bridge_mcast *brmctx, in br_multicast_update_query_timer() argument
3202 mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval); in br_multicast_update_query_timer()
3219 br_multicast_rport_from_node(struct net_bridge_mcast *brmctx, in br_multicast_rport_from_node() argument
3226 if (mc_router_list == &brmctx->ip6_mc_router_list) in br_multicast_rport_from_node()
3238 br_multicast_get_rport_slot(struct net_bridge_mcast *brmctx, in br_multicast_get_rport_slot() argument
3248 p = br_multicast_rport_from_node(brmctx, mc_router_list, rlist); in br_multicast_get_rport_slot()
3276 static void br_multicast_add_router(struct net_bridge_mcast *brmctx, in br_multicast_add_router() argument
3286 slot = br_multicast_get_rport_slot(brmctx, pmctx->port, mc_router_list); in br_multicast_add_router()
3307 static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx, in br_ip4_multicast_add_router() argument
3310 br_multicast_add_router(brmctx, pmctx, &pmctx->ip4_rlist, in br_ip4_multicast_add_router()
3311 &brmctx->ip4_mc_router_list); in br_ip4_multicast_add_router()
3318 static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx, in br_ip6_multicast_add_router() argument
3322 br_multicast_add_router(brmctx, pmctx, &pmctx->ip6_rlist, in br_ip6_multicast_add_router()
3323 &brmctx->ip6_mc_router_list); in br_ip6_multicast_add_router()
3327 static void br_multicast_mark_router(struct net_bridge_mcast *brmctx, in br_multicast_mark_router() argument
3335 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in br_multicast_mark_router()
3339 if (brmctx->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { in br_multicast_mark_router()
3340 if (!br_ip4_multicast_is_router(brmctx) && in br_multicast_mark_router()
3341 !br_ip6_multicast_is_router(brmctx)) in br_multicast_mark_router()
3342 br_mc_router_state_change(brmctx->br, true); in br_multicast_mark_router()
3343 mod_timer(timer, now + brmctx->multicast_querier_interval); in br_multicast_mark_router()
3352 br_multicast_add_router(brmctx, pmctx, rlist, mc_router_list); in br_multicast_mark_router()
3353 mod_timer(timer, now + brmctx->multicast_querier_interval); in br_multicast_mark_router()
3356 static void br_ip4_multicast_mark_router(struct net_bridge_mcast *brmctx, in br_ip4_multicast_mark_router() argument
3359 struct timer_list *timer = &brmctx->ip4_mc_router_timer; in br_ip4_multicast_mark_router()
3367 br_multicast_mark_router(brmctx, pmctx, timer, rlist, in br_ip4_multicast_mark_router()
3368 &brmctx->ip4_mc_router_list); in br_ip4_multicast_mark_router()
3371 static void br_ip6_multicast_mark_router(struct net_bridge_mcast *brmctx, in br_ip6_multicast_mark_router() argument
3375 struct timer_list *timer = &brmctx->ip6_mc_router_timer; in br_ip6_multicast_mark_router()
3383 br_multicast_mark_router(brmctx, pmctx, timer, rlist, in br_ip6_multicast_mark_router()
3384 &brmctx->ip6_mc_router_list); in br_ip6_multicast_mark_router()
3389 br_ip4_multicast_query_received(struct net_bridge_mcast *brmctx, in br_ip4_multicast_query_received() argument
3395 if (!br_multicast_select_querier(brmctx, pmctx, saddr)) in br_ip4_multicast_query_received()
3398 br_multicast_update_query_timer(brmctx, query, max_delay); in br_ip4_multicast_query_received()
3399 br_ip4_multicast_mark_router(brmctx, pmctx); in br_ip4_multicast_query_received()
3404 br_ip6_multicast_query_received(struct net_bridge_mcast *brmctx, in br_ip6_multicast_query_received() argument
3410 if (!br_multicast_select_querier(brmctx, pmctx, saddr)) in br_ip6_multicast_query_received()
3413 br_multicast_update_query_timer(brmctx, query, max_delay); in br_ip6_multicast_query_received()
3414 br_ip6_multicast_mark_router(brmctx, pmctx); in br_ip6_multicast_query_received()
3418 static void br_ip4_multicast_query(struct net_bridge_mcast *brmctx, in br_ip4_multicast_query() argument
3435 spin_lock(&brmctx->br->multicast_lock); in br_ip4_multicast_query()
3436 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in br_ip4_multicast_query()
3451 (brmctx->multicast_igmp_version == 3 && group && in br_ip4_multicast_query()
3465 br_ip4_multicast_query_received(brmctx, pmctx, in br_ip4_multicast_query()
3466 &brmctx->ip4_other_query, in br_ip4_multicast_query()
3471 mp = br_mdb_ip4_get(brmctx->br, group, vid); in br_ip4_multicast_query()
3475 max_delay *= brmctx->multicast_last_member_count; in br_ip4_multicast_query()
3484 (p = mlock_dereference(*pp, brmctx->br)) != NULL; in br_ip4_multicast_query()
3489 (brmctx->multicast_igmp_version == 2 || in br_ip4_multicast_query()
3495 spin_unlock(&brmctx->br->multicast_lock); in br_ip4_multicast_query()
3499 static int br_ip6_multicast_query(struct net_bridge_mcast *brmctx, in br_ip6_multicast_query() argument
3518 spin_lock(&brmctx->br->multicast_lock); in br_ip6_multicast_query()
3519 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in br_ip6_multicast_query()
3539 if (brmctx->multicast_mld_version == 2 && in br_ip6_multicast_query()
3553 br_ip6_multicast_query_received(brmctx, pmctx, in br_ip6_multicast_query()
3554 &brmctx->ip6_other_query, in br_ip6_multicast_query()
3561 mp = br_mdb_ip6_get(brmctx->br, group, vid); in br_ip6_multicast_query()
3565 max_delay *= brmctx->multicast_last_member_count; in br_ip6_multicast_query()
3573 (p = mlock_dereference(*pp, brmctx->br)) != NULL; in br_ip6_multicast_query()
3578 (brmctx->multicast_mld_version == 1 || in br_ip6_multicast_query()
3584 spin_unlock(&brmctx->br->multicast_lock); in br_ip6_multicast_query()
3590 br_multicast_leave_group(struct net_bridge_mcast *brmctx, in br_multicast_leave_group() argument
3602 spin_lock(&brmctx->br->multicast_lock); in br_multicast_leave_group()
3603 if (!br_multicast_ctx_should_use(brmctx, pmctx)) in br_multicast_leave_group()
3606 mp = br_mdb_ip_get(brmctx->br, group); in br_multicast_leave_group()
3614 (p = mlock_dereference(*pp, brmctx->br)) != NULL; in br_multicast_leave_group()
3631 if (brmctx->multicast_querier) { in br_multicast_leave_group()
3632 __br_multicast_send_query(brmctx, pmctx, NULL, NULL, &mp->addr, in br_multicast_leave_group()
3635 time = jiffies + brmctx->multicast_last_member_count * in br_multicast_leave_group()
3636 brmctx->multicast_last_member_interval; in br_multicast_leave_group()
3640 for (p = mlock_dereference(mp->ports, brmctx->br); in br_multicast_leave_group()
3642 p = mlock_dereference(p->next, brmctx->br)) { in br_multicast_leave_group()
3658 time = now + brmctx->multicast_last_member_count * in br_multicast_leave_group()
3659 brmctx->multicast_last_member_interval; in br_multicast_leave_group()
3672 for (p = mlock_dereference(mp->ports, brmctx->br); in br_multicast_leave_group()
3674 p = mlock_dereference(p->next, brmctx->br)) { in br_multicast_leave_group()
3688 spin_unlock(&brmctx->br->multicast_lock); in br_multicast_leave_group()
3691 static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx, in br_ip4_multicast_leave_group() argument
3703 own_query = pmctx ? &pmctx->ip4_own_query : &brmctx->ip4_own_query; in br_ip4_multicast_leave_group()
3710 br_multicast_leave_group(brmctx, pmctx, &br_group, in br_ip4_multicast_leave_group()
3711 &brmctx->ip4_other_query, in br_ip4_multicast_leave_group()
3716 static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx, in br_ip6_multicast_leave_group() argument
3728 own_query = pmctx ? &pmctx->ip6_own_query : &brmctx->ip6_own_query; in br_ip6_multicast_leave_group()
3735 br_multicast_leave_group(brmctx, pmctx, &br_group, in br_ip6_multicast_leave_group()
3736 &brmctx->ip6_other_query, in br_ip6_multicast_leave_group()
3774 static void br_multicast_pim(struct net_bridge_mcast *brmctx, in br_multicast_pim() argument
3786 spin_lock(&brmctx->br->multicast_lock); in br_multicast_pim()
3787 br_ip4_multicast_mark_router(brmctx, pmctx); in br_multicast_pim()
3788 spin_unlock(&brmctx->br->multicast_lock); in br_multicast_pim()
3791 static int br_ip4_multicast_mrd_rcv(struct net_bridge_mcast *brmctx, in br_ip4_multicast_mrd_rcv() argument
3799 spin_lock(&brmctx->br->multicast_lock); in br_ip4_multicast_mrd_rcv()
3800 br_ip4_multicast_mark_router(brmctx, pmctx); in br_ip4_multicast_mrd_rcv()
3801 spin_unlock(&brmctx->br->multicast_lock); in br_ip4_multicast_mrd_rcv()
3806 static int br_multicast_ipv4_rcv(struct net_bridge_mcast *brmctx, in br_multicast_ipv4_rcv() argument
3823 br_multicast_pim(brmctx, pmctx, skb); in br_multicast_ipv4_rcv()
3825 br_ip4_multicast_mrd_rcv(brmctx, pmctx, skb); in br_multicast_ipv4_rcv()
3830 br_multicast_err_count(brmctx->br, p, skb->protocol); in br_multicast_ipv4_rcv()
3842 err = br_ip4_multicast_add_group(brmctx, pmctx, ih->group, vid, in br_multicast_ipv4_rcv()
3846 err = br_ip4_multicast_igmp3_report(brmctx, pmctx, skb, vid); in br_multicast_ipv4_rcv()
3849 br_ip4_multicast_query(brmctx, pmctx, skb, vid); in br_multicast_ipv4_rcv()
3852 br_ip4_multicast_leave_group(brmctx, pmctx, ih->group, vid, src); in br_multicast_ipv4_rcv()
3856 br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv4_rcv()
3863 static void br_ip6_multicast_mrd_rcv(struct net_bridge_mcast *brmctx, in br_ip6_multicast_mrd_rcv() argument
3870 spin_lock(&brmctx->br->multicast_lock); in br_ip6_multicast_mrd_rcv()
3871 br_ip6_multicast_mark_router(brmctx, pmctx); in br_ip6_multicast_mrd_rcv()
3872 spin_unlock(&brmctx->br->multicast_lock); in br_ip6_multicast_mrd_rcv()
3875 static int br_multicast_ipv6_rcv(struct net_bridge_mcast *brmctx, in br_multicast_ipv6_rcv() argument
3892 br_ip6_multicast_mrd_rcv(brmctx, pmctx, skb); in br_multicast_ipv6_rcv()
3896 br_multicast_err_count(brmctx->br, p, skb->protocol); in br_multicast_ipv6_rcv()
3907 err = br_ip6_multicast_add_group(brmctx, pmctx, &mld->mld_mca, in br_multicast_ipv6_rcv()
3911 err = br_ip6_multicast_mld2_report(brmctx, pmctx, skb, vid); in br_multicast_ipv6_rcv()
3914 err = br_ip6_multicast_query(brmctx, pmctx, skb, vid); in br_multicast_ipv6_rcv()
3918 br_ip6_multicast_leave_group(brmctx, pmctx, &mld->mld_mca, vid, in br_multicast_ipv6_rcv()
3923 br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp, in br_multicast_ipv6_rcv()
3930 int br_multicast_rcv(struct net_bridge_mcast **brmctx, in br_multicast_rcv() argument
3940 if (!br_opt_get((*brmctx)->br, BROPT_MULTICAST_ENABLED)) in br_multicast_rcv()
3943 if (br_opt_get((*brmctx)->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED) && vlan) { in br_multicast_rcv()
3951 *brmctx = &vlan->br_mcast_ctx; in br_multicast_rcv()
3955 *brmctx = &vlan->brvlan->br_mcast_ctx; in br_multicast_rcv()
3965 ret = br_multicast_ipv4_rcv(*brmctx, *pmctx, skb, vid); in br_multicast_rcv()
3969 ret = br_multicast_ipv6_rcv(*brmctx, *pmctx, skb, vid); in br_multicast_rcv()
3977 static void br_multicast_query_expired(struct net_bridge_mcast *brmctx, in br_multicast_query_expired() argument
3981 spin_lock(&brmctx->br->multicast_lock); in br_multicast_query_expired()
3982 if (br_multicast_ctx_vlan_disabled(brmctx)) in br_multicast_query_expired()
3985 if (query->startup_sent < brmctx->multicast_startup_query_count) in br_multicast_query_expired()
3988 br_multicast_send_query(brmctx, NULL, query); in br_multicast_query_expired()
3990 spin_unlock(&brmctx->br->multicast_lock); in br_multicast_query_expired()
3995 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, in br_ip4_multicast_query_expired() local
3998 br_multicast_query_expired(brmctx, &brmctx->ip4_own_query, in br_ip4_multicast_query_expired()
3999 &brmctx->ip4_querier); in br_ip4_multicast_query_expired()
4005 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, in br_ip6_multicast_query_expired() local
4008 br_multicast_query_expired(brmctx, &brmctx->ip6_own_query, in br_ip6_multicast_query_expired()
4009 &brmctx->ip6_querier); in br_ip6_multicast_query_expired()
4028 struct net_bridge_mcast *brmctx) in br_multicast_ctx_init() argument
4030 brmctx->br = br; in br_multicast_ctx_init()
4031 brmctx->vlan = vlan; in br_multicast_ctx_init()
4032 brmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; in br_multicast_ctx_init()
4033 brmctx->multicast_last_member_count = 2; in br_multicast_ctx_init()
4034 brmctx->multicast_startup_query_count = 2; in br_multicast_ctx_init()
4036 brmctx->multicast_last_member_interval = HZ; in br_multicast_ctx_init()
4037 brmctx->multicast_query_response_interval = 10 * HZ; in br_multicast_ctx_init()
4038 brmctx->multicast_startup_query_interval = 125 * HZ / 4; in br_multicast_ctx_init()
4039 brmctx->multicast_query_interval = 125 * HZ; in br_multicast_ctx_init()
4040 brmctx->multicast_querier_interval = 255 * HZ; in br_multicast_ctx_init()
4041 brmctx->multicast_membership_interval = 260 * HZ; in br_multicast_ctx_init()
4043 brmctx->ip4_other_query.delay_time = 0; in br_multicast_ctx_init()
4044 brmctx->ip4_querier.port_ifidx = 0; in br_multicast_ctx_init()
4045 seqcount_spinlock_init(&brmctx->ip4_querier.seq, &br->multicast_lock); in br_multicast_ctx_init()
4046 brmctx->multicast_igmp_version = 2; in br_multicast_ctx_init()
4048 brmctx->multicast_mld_version = 1; in br_multicast_ctx_init()
4049 brmctx->ip6_other_query.delay_time = 0; in br_multicast_ctx_init()
4050 brmctx->ip6_querier.port_ifidx = 0; in br_multicast_ctx_init()
4051 seqcount_spinlock_init(&brmctx->ip6_querier.seq, &br->multicast_lock); in br_multicast_ctx_init()
4054 timer_setup(&brmctx->ip4_mc_router_timer, in br_multicast_ctx_init()
4056 timer_setup(&brmctx->ip4_other_query.timer, in br_multicast_ctx_init()
4058 timer_setup(&brmctx->ip4_own_query.timer, in br_multicast_ctx_init()
4061 timer_setup(&brmctx->ip6_mc_router_timer, in br_multicast_ctx_init()
4063 timer_setup(&brmctx->ip6_other_query.timer, in br_multicast_ctx_init()
4065 timer_setup(&brmctx->ip6_own_query.timer, in br_multicast_ctx_init()
4070 void br_multicast_ctx_deinit(struct net_bridge_mcast *brmctx) in br_multicast_ctx_deinit() argument
4072 __br_multicast_stop(brmctx); in br_multicast_ctx_deinit()
4163 static void __br_multicast_open(struct net_bridge_mcast *brmctx) in __br_multicast_open() argument
4165 __br_multicast_open_query(brmctx->br, &brmctx->ip4_own_query); in __br_multicast_open()
4167 __br_multicast_open_query(brmctx->br, &brmctx->ip6_own_query); in __br_multicast_open()
4182 struct net_bridge_mcast *brmctx; in br_multicast_open() local
4184 brmctx = &vlan->br_mcast_ctx; in br_multicast_open()
4186 !br_multicast_ctx_vlan_disabled(brmctx)) in br_multicast_open()
4195 static void __br_multicast_stop(struct net_bridge_mcast *brmctx) in __br_multicast_stop() argument
4197 del_timer_sync(&brmctx->ip4_mc_router_timer); in __br_multicast_stop()
4198 del_timer_sync(&brmctx->ip4_other_query.timer); in __br_multicast_stop()
4199 del_timer_sync(&brmctx->ip4_own_query.timer); in __br_multicast_stop()
4201 del_timer_sync(&brmctx->ip6_mc_router_timer); in __br_multicast_stop()
4202 del_timer_sync(&brmctx->ip6_other_query.timer); in __br_multicast_stop()
4203 del_timer_sync(&brmctx->ip6_own_query.timer); in __br_multicast_stop()
4235 struct net_bridge_mcast *brmctx; in br_multicast_toggle_one_vlan() local
4237 brmctx = br_multicast_port_ctx_get_global(&vlan->port_mcast_ctx); in br_multicast_toggle_one_vlan()
4238 if (on && br_multicast_ctx_vlan_global_disabled(brmctx)) in br_multicast_toggle_one_vlan()
4338 struct net_bridge_mcast *brmctx; in br_multicast_stop() local
4340 brmctx = &vlan->br_mcast_ctx; in br_multicast_stop()
4342 !br_multicast_ctx_vlan_disabled(brmctx)) in br_multicast_stop()
4370 int br_multicast_set_router(struct net_bridge_mcast *brmctx, unsigned long val) in br_multicast_set_router() argument
4374 spin_lock_bh(&brmctx->br->multicast_lock); in br_multicast_set_router()
4379 br_mc_router_state_change(brmctx->br, val == MDB_RTR_TYPE_PERM); in br_multicast_set_router()
4380 del_timer(&brmctx->ip4_mc_router_timer); in br_multicast_set_router()
4382 del_timer(&brmctx->ip6_mc_router_timer); in br_multicast_set_router()
4384 brmctx->multicast_router = val; in br_multicast_set_router()
4388 if (brmctx->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) in br_multicast_set_router()
4389 br_mc_router_state_change(brmctx->br, false); in br_multicast_set_router()
4390 brmctx->multicast_router = val; in br_multicast_set_router()
4395 spin_unlock_bh(&brmctx->br->multicast_lock); in br_multicast_set_router()
4427 struct net_bridge_mcast *brmctx; in br_multicast_set_port_router() local
4432 brmctx = br_multicast_port_ctx_get_global(pmctx); in br_multicast_set_port_router()
4433 spin_lock_bh(&brmctx->br->multicast_lock); in br_multicast_set_port_router()
4438 now + brmctx->multicast_querier_interval); in br_multicast_set_port_router()
4441 now + brmctx->multicast_querier_interval); in br_multicast_set_port_router()
4467 br_ip4_multicast_add_router(brmctx, pmctx); in br_multicast_set_port_router()
4471 br_ip6_multicast_add_router(brmctx, pmctx); in br_multicast_set_port_router()
4475 br_ip4_multicast_mark_router(brmctx, pmctx); in br_multicast_set_port_router()
4476 br_ip6_multicast_mark_router(brmctx, pmctx); in br_multicast_set_port_router()
4483 spin_unlock_bh(&brmctx->br->multicast_lock); in br_multicast_set_port_router()
4501 static void br_multicast_start_querier(struct net_bridge_mcast *brmctx, in br_multicast_start_querier() argument
4506 if (!br_multicast_ctx_matches_vlan_snooping(brmctx)) in br_multicast_start_querier()
4509 __br_multicast_open_query(brmctx->br, query); in br_multicast_start_querier()
4512 list_for_each_entry_rcu(port, &brmctx->br->port_list, list) { in br_multicast_start_querier()
4521 if (br_multicast_ctx_is_vlan(brmctx)) { in br_multicast_start_querier()
4525 brmctx->vlan->vid); in br_multicast_start_querier()
4541 if (query == &brmctx->ip4_own_query) in br_multicast_start_querier()
4628 int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val) in br_multicast_set_querier() argument
4634 spin_lock_bh(&brmctx->br->multicast_lock); in br_multicast_set_querier()
4635 if (brmctx->multicast_querier == val) in br_multicast_set_querier()
4638 WRITE_ONCE(brmctx->multicast_querier, val); in br_multicast_set_querier()
4642 max_delay = brmctx->multicast_query_response_interval; in br_multicast_set_querier()
4644 if (!timer_pending(&brmctx->ip4_other_query.timer)) in br_multicast_set_querier()
4645 brmctx->ip4_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
4647 br_multicast_start_querier(brmctx, &brmctx->ip4_own_query); in br_multicast_set_querier()
4650 if (!timer_pending(&brmctx->ip6_other_query.timer)) in br_multicast_set_querier()
4651 brmctx->ip6_other_query.delay_time = jiffies + max_delay; in br_multicast_set_querier()
4653 br_multicast_start_querier(brmctx, &brmctx->ip6_own_query); in br_multicast_set_querier()
4657 spin_unlock_bh(&brmctx->br->multicast_lock); in br_multicast_set_querier()
4662 int br_multicast_set_igmp_version(struct net_bridge_mcast *brmctx, in br_multicast_set_igmp_version() argument
4674 spin_lock_bh(&brmctx->br->multicast_lock); in br_multicast_set_igmp_version()
4675 brmctx->multicast_igmp_version = val; in br_multicast_set_igmp_version()
4676 spin_unlock_bh(&brmctx->br->multicast_lock); in br_multicast_set_igmp_version()
4682 int br_multicast_set_mld_version(struct net_bridge_mcast *brmctx, in br_multicast_set_mld_version() argument
4694 spin_lock_bh(&brmctx->br->multicast_lock); in br_multicast_set_mld_version()
4695 brmctx->multicast_mld_version = val; in br_multicast_set_mld_version()
4696 spin_unlock_bh(&brmctx->br->multicast_lock); in br_multicast_set_mld_version()
4702 void br_multicast_set_query_intvl(struct net_bridge_mcast *brmctx, in br_multicast_set_query_intvl() argument
4708 br_info(brmctx->br, in br_multicast_set_query_intvl()
4715 brmctx->multicast_query_interval = intvl_jiffies; in br_multicast_set_query_intvl()
4718 void br_multicast_set_startup_query_intvl(struct net_bridge_mcast *brmctx, in br_multicast_set_startup_query_intvl() argument
4724 br_info(brmctx->br, in br_multicast_set_startup_query_intvl()
4731 brmctx->multicast_startup_query_interval = intvl_jiffies; in br_multicast_set_startup_query_intvl()
4839 struct net_bridge_mcast *brmctx; in br_multicast_has_querier_adjacent() local
4854 brmctx = &br->multicast_ctx; in br_multicast_has_querier_adjacent()
4858 port_ifidx = brmctx->ip4_querier.port_ifidx; in br_multicast_has_querier_adjacent()
4859 if (!timer_pending(&brmctx->ip4_other_query.timer) || in br_multicast_has_querier_adjacent()
4865 port_ifidx = brmctx->ip6_querier.port_ifidx; in br_multicast_has_querier_adjacent()
4866 if (!timer_pending(&brmctx->ip6_other_query.timer) || in br_multicast_has_querier_adjacent()
4894 struct net_bridge_mcast *brmctx; in br_multicast_has_router_adjacent() local
4903 brmctx = &port->br->multicast_ctx; in br_multicast_has_router_adjacent()
4906 hlist_for_each_entry_rcu(pmctx, &brmctx->ip4_mc_router_list, in br_multicast_has_router_adjacent()
4917 hlist_for_each_entry_rcu(pmctx, &brmctx->ip6_mc_router_list, in br_multicast_has_router_adjacent()