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,
151 struct net_bridge *br = brmctx->br;
155 br_multicast_ctx_vlan_global_disabled(brmctx))
168 if (brmctx->multicast_igmp_version == 3) {
181 if (brmctx->multicast_mld_version == 2) {
264 * - if pmctx is NULL (bridge), check if brmctx should be used
267 br_multicast_ctx_should_use(const struct net_bridge_mcast *brmctx,
270 if (!netif_running(brmctx->br->dev))
276 return !br_multicast_ctx_vlan_disabled(brmctx);
298 struct net_bridge_mcast *brmctx;
301 brmctx = br_multicast_port_ctx_get_global(pmctx);
304 if (br_sg_port_find(brmctx->br, &sg_key))
307 src_pg = __br_multicast_add_group(brmctx, pmctx,
476 struct net_bridge_mcast *brmctx;
502 brmctx = br_multicast_port_ctx_get_global(pmctx);
504 src_pg = __br_multicast_add_group(brmctx, pmctx,
520 struct net_bridge_mcast *brmctx;
530 brmctx = br_multicast_port_ctx_get_global(pmctx);
534 sg = __br_multicast_add_group(brmctx, pmctx, &sg_ip,
905 static void __br_multicast_query_handle_vlan(struct net_bridge_mcast *brmctx,
913 else if (br_multicast_ctx_is_vlan(brmctx))
914 vlan = brmctx->vlan;
919 if (br_vlan_get_proto(brmctx->br->dev, &vlan_proto) != 0)
925 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge_mcast *brmctx,
948 if (brmctx->multicast_igmp_version == 3) {
951 lmqt = now + (brmctx->multicast_last_member_interval *
952 brmctx->multicast_last_member_count);
968 pkt_size > brmctx->br->dev->mtu)
971 skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size);
975 __br_multicast_query_handle_vlan(brmctx, pmctx, skb);
981 ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr);
997 iph->saddr = br_opt_get(brmctx->br, BROPT_MULTICAST_QUERY_USE_IFADDR) ?
998 inet_select_addr(brmctx->br->dev, 0, RT_SCOPE_LINK) : 0;
1010 switch (brmctx->multicast_igmp_version) {
1014 ih->code = (group ? brmctx->multicast_last_member_interval :
1015 brmctx->multicast_query_response_interval) /
1025 ihv3->code = (group ? brmctx->multicast_last_member_interval :
1026 brmctx->multicast_query_response_interval) /
1029 ihv3->qqic = brmctx->multicast_query_interval / HZ;
1072 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brmctx,
1098 if (brmctx->multicast_mld_version == 2) {
1101 llqt = now + (brmctx->multicast_last_member_interval *
1102 brmctx->multicast_last_member_count);
1118 pkt_size > brmctx->br->dev->mtu)
1121 skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size);
1125 __br_multicast_query_handle_vlan(brmctx, pmctx, skb);
1132 ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr);
1145 if (ipv6_dev_get_saddr(dev_net(brmctx->br->dev), brmctx->br->dev,
1148 br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, false);
1152 br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, true);
1170 brmctx->multicast_query_response_interval :
1171 brmctx->multicast_last_member_interval;
1173 switch (brmctx->multicast_mld_version) {
1196 mld2q->mld2q_qqic = brmctx->multicast_query_interval / HZ;
1237 static struct sk_buff *br_multicast_alloc_query(struct net_bridge_mcast *brmctx,
1251 return br_ip4_multicast_alloc_query(brmctx, pmctx, pg,
1266 return br_ip6_multicast_alloc_query(brmctx, pmctx, pg,
1473 void br_multicast_host_join(const struct net_bridge_mcast *brmctx,
1487 mod_timer(&mp->timer, jiffies + brmctx->multicast_membership_interval);
1503 __br_multicast_add_group(struct net_bridge_mcast *brmctx,
1516 if (!br_multicast_ctx_should_use(brmctx, pmctx))
1519 mp = br_multicast_new_group(brmctx->br, group);
1524 br_multicast_host_join(brmctx, mp, true);
1529 (p = mlock_dereference(*pp, brmctx->br)) != NULL;
1546 br_mdb_notify(brmctx->br->dev, mp, p, RTM_NEWMDB);
1551 now + brmctx->multicast_membership_interval);
1557 static int br_multicast_add_group(struct net_bridge_mcast *brmctx,
1567 spin_lock(&brmctx->br->multicast_lock);
1568 pg = __br_multicast_add_group(brmctx, pmctx, group, src, filter_mode,
1572 spin_unlock(&brmctx->br->multicast_lock);
1577 static int br_ip4_multicast_add_group(struct net_bridge_mcast *brmctx,
1596 return br_multicast_add_group(brmctx, pmctx, &br_group, src,
1601 static int br_ip6_multicast_add_group(struct net_bridge_mcast *brmctx,
1620 return br_multicast_add_group(brmctx, pmctx, &br_group, src,
1698 static void br_multicast_local_router_expired(struct net_bridge_mcast *brmctx,
1701 spin_lock(&brmctx->br->multicast_lock);
1702 if (brmctx->multicast_router == MDB_RTR_TYPE_DISABLED ||
1703 brmctx->multicast_router == MDB_RTR_TYPE_PERM ||
1704 br_ip4_multicast_is_router(brmctx) ||
1705 br_ip6_multicast_is_router(brmctx))
1708 br_mc_router_state_change(brmctx->br, false);
1710 spin_unlock(&brmctx->br->multicast_lock);
1715 struct net_bridge_mcast *brmctx = from_timer(brmctx, t,
1718 br_multicast_local_router_expired(brmctx, t);
1724 struct net_bridge_mcast *brmctx = from_timer(brmctx, t,
1727 br_multicast_local_router_expired(brmctx, t);
1731 static void br_multicast_querier_expired(struct net_bridge_mcast *brmctx,
1734 spin_lock(&brmctx->br->multicast_lock);
1735 if (!netif_running(brmctx->br->dev) ||
1736 br_multicast_ctx_vlan_global_disabled(brmctx) ||
1737 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
1740 br_multicast_start_querier(brmctx, query);
1743 spin_unlock(&brmctx->br->multicast_lock);
1748 struct net_bridge_mcast *brmctx = from_timer(brmctx, t,
1751 br_multicast_querier_expired(brmctx, &brmctx->ip4_own_query);
1757 struct net_bridge_mcast *brmctx = from_timer(brmctx, t,
1760 br_multicast_querier_expired(brmctx, &brmctx->ip6_own_query);
1768 static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx,
1773 brmctx->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr;
1776 brmctx->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr;
1780 static void __br_multicast_send_query(struct net_bridge_mcast *brmctx,
1793 if (!br_multicast_ctx_should_use(brmctx, pmctx) ||
1794 !br_multicast_ctx_matches_vlan_snooping(brmctx))
1798 skb = br_multicast_alloc_query(brmctx, pmctx, pg, ip_dst, group,
1806 br_multicast_count(brmctx->br, pmctx->port, skb, igmp_type,
1817 br_multicast_select_own_querier(brmctx, group, skb);
1818 br_multicast_count(brmctx->br, NULL, skb, igmp_type,
1837 static void br_multicast_update_querier(struct net_bridge_mcast *brmctx,
1848 static void br_multicast_send_query(struct net_bridge_mcast *brmctx,
1857 if (!br_multicast_ctx_should_use(brmctx, pmctx) ||
1858 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) ||
1859 !brmctx->multicast_querier)
1865 (own_query == &brmctx->ip4_own_query)) {
1866 querier = &brmctx->ip4_querier;
1867 other_query = &brmctx->ip4_other_query;
1871 querier = &brmctx->ip6_querier;
1872 other_query = &brmctx->ip6_other_query;
1884 br_multicast_update_querier(brmctx, querier, 0, &zeroip);
1887 __br_multicast_send_query(brmctx, pmctx, NULL, NULL, &br_group, false,
1891 time += own_query->startup_sent < brmctx->multicast_startup_query_count ?
1892 brmctx->multicast_startup_query_interval :
1893 brmctx->multicast_query_interval;
1902 struct net_bridge_mcast *brmctx;
1908 brmctx = br_multicast_port_ctx_get_global(pmctx);
1909 if (query->startup_sent < brmctx->multicast_startup_query_count)
1912 br_multicast_send_query(brmctx, pmctx, query);
1942 struct net_bridge_mcast *brmctx;
1953 brmctx = br_multicast_port_ctx_get_global(pmctx);
1954 if (!brmctx->multicast_querier)
1958 other_query = &brmctx->ip4_other_query;
1961 other_query = &brmctx->ip6_other_query;
1969 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
1972 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
1977 brmctx->multicast_last_member_interval);
2073 struct net_bridge_mcast *brmctx;
2075 brmctx = br_multicast_port_ctx_get_global(pmctx);
2085 br_ip4_multicast_add_router(brmctx, pmctx);
2086 br_ip6_multicast_add_router(brmctx, pmctx);
2170 static void __grp_src_query_marked_and_rexmit(struct net_bridge_mcast *brmctx,
2175 u32 lmqc = brmctx->multicast_last_member_count;
2179 if (!netif_running(brmctx->br->dev) ||
2180 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
2184 other_query = &brmctx->ip4_other_query;
2187 other_query = &brmctx->ip6_other_query;
2190 lmqt = now + br_multicast_lmqt(brmctx);
2195 if (brmctx->multicast_querier &&
2204 if (!brmctx->multicast_querier ||
2208 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
2211 lmi = now + brmctx->multicast_last_member_interval;
2217 static void __grp_send_query_and_rexmit(struct net_bridge_mcast *brmctx,
2224 if (!netif_running(brmctx->br->dev) ||
2225 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
2229 other_query = &brmctx->ip4_other_query;
2232 other_query = &brmctx->ip6_other_query;
2235 if (brmctx->multicast_querier &&
2237 lmi = now + brmctx->multicast_last_member_interval;
2238 pg->grp_query_rexmit_cnt = brmctx->multicast_last_member_count - 1;
2239 __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
2248 time_after(pg->timer.expires, now + br_multicast_lmqt(brmctx))))
2249 mod_timer(&pg->timer, now + br_multicast_lmqt(brmctx));
2257 static bool br_multicast_isinc_allow(const struct net_bridge_mcast *brmctx,
2280 __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx));
2283 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2295 static void __grp_src_isexc_incl(const struct net_bridge_mcast *brmctx,
2320 br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2332 static bool __grp_src_isexc_excl(const struct net_bridge_mcast *brmctx,
2357 now + br_multicast_gmi(brmctx));
2363 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2373 static bool br_multicast_isexc(const struct net_bridge_mcast *brmctx,
2382 __grp_src_isexc_incl(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2388 changed = __grp_src_isexc_excl(brmctx, pg, h_addr, srcs, nsrcs,
2394 mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx));
2403 static bool __grp_src_toin_incl(struct net_bridge_mcast *brmctx,
2432 __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx));
2435 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2440 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2450 static bool __grp_src_toin_excl(struct net_bridge_mcast *brmctx,
2482 __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx));
2485 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2490 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2492 __grp_send_query_and_rexmit(brmctx, pmctx, pg);
2497 static bool br_multicast_toin(struct net_bridge_mcast *brmctx,
2507 changed = __grp_src_toin_incl(brmctx, pmctx, pg, h_addr, srcs,
2511 changed = __grp_src_toin_excl(brmctx, pmctx, pg, h_addr, srcs,
2534 static void __grp_src_toex_incl(struct net_bridge_mcast *brmctx,
2563 br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2568 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2578 static bool __grp_src_toex_excl(struct net_bridge_mcast *brmctx,
2612 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2619 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2624 static bool br_multicast_toex(struct net_bridge_mcast *brmctx,
2634 __grp_src_toex_incl(brmctx, pmctx, pg, h_addr, srcs, nsrcs,
2640 changed = __grp_src_toex_excl(brmctx, pmctx, pg, h_addr, srcs,
2646 mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx));
2654 static bool __grp_src_block_incl(struct net_bridge_mcast *brmctx,
2678 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2683 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2692 static bool __grp_src_block_excl(struct net_bridge_mcast *brmctx,
2723 if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2728 __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2733 static bool br_multicast_block(struct net_bridge_mcast *brmctx,
2742 changed = __grp_src_block_incl(brmctx, pmctx, pg, h_addr, srcs,
2746 changed = __grp_src_block_excl(brmctx, pmctx, pg, h_addr, srcs,
2782 static int br_ip4_multicast_igmp3_report(struct net_bridge_mcast *brmctx,
2787 bool igmpv2 = brmctx->multicast_igmp_version == 2;
2835 br_ip4_multicast_leave_group(brmctx, pmctx,
2840 err = br_ip4_multicast_add_group(brmctx, pmctx, group,
2849 spin_lock(&brmctx->br->multicast_lock);
2850 if (!br_multicast_ctx_should_use(brmctx, pmctx))
2853 mdst = br_mdb_ip4_get(brmctx->br, group, vid);
2864 changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
2869 changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
2874 changed = br_multicast_isexc(brmctx, pg, h_addr,
2879 changed = br_multicast_toin(brmctx, pmctx, pg, h_addr,
2884 changed = br_multicast_toex(brmctx, pmctx, pg, h_addr,
2889 changed = br_multicast_block(brmctx, pmctx, pg, h_addr,
2895 br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB);
2897 spin_unlock(&brmctx->br->multicast_lock);
2904 static int br_ip6_multicast_mld2_report(struct net_bridge_mcast *brmctx,
2909 bool mldv1 = brmctx->multicast_mld_version == 1;
2971 br_ip6_multicast_leave_group(brmctx, pmctx,
2977 err = br_ip6_multicast_add_group(brmctx, pmctx,
2987 spin_lock(&brmctx->br->multicast_lock);
2988 if (!br_multicast_ctx_should_use(brmctx, pmctx))
2991 mdst = br_mdb_ip6_get(brmctx->br, &grec->grec_mca, vid);
3000 changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
3006 changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
3012 changed = br_multicast_isexc(brmctx, pg, h_addr,
3018 changed = br_multicast_toin(brmctx, pmctx, pg, h_addr,
3024 changed = br_multicast_toex(brmctx, pmctx, pg, h_addr,
3030 changed = br_multicast_block(brmctx, pmctx, pg, h_addr,
3037 br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB);
3039 spin_unlock(&brmctx->br->multicast_lock);
3046 static bool br_multicast_select_querier(struct net_bridge_mcast *brmctx,
3056 querier = &brmctx->ip4_querier;
3057 own_timer = &brmctx->ip4_own_query.timer;
3058 other_timer = &brmctx->ip4_other_query.timer;
3065 querier = &brmctx->ip6_querier;
3066 own_timer = &brmctx->ip6_own_query.timer;
3067 other_timer = &brmctx->ip6_other_query.timer;
3082 br_multicast_update_querier(brmctx, querier, port_ifidx, saddr);
3124 const struct net_bridge_mcast *brmctx,
3131 if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) ||
3132 br_multicast_ctx_vlan_global_disabled(brmctx))
3140 if (!brmctx->multicast_querier &&
3141 !timer_pending(&brmctx->ip4_other_query.timer))
3144 br_multicast_read_querier(&brmctx->ip4_querier, &querier);
3151 p = __br_multicast_get_querier_port(brmctx->br, &querier);
3152 if (timer_pending(&brmctx->ip4_other_query.timer) &&
3154 br_timer_value(&brmctx->ip4_other_query.timer),
3163 if (!brmctx->multicast_querier &&
3164 !timer_pending(&brmctx->ip6_other_query.timer))
3167 br_multicast_read_querier(&brmctx->ip6_querier, &querier);
3174 p = __br_multicast_get_querier_port(brmctx->br, &querier);
3175 if (timer_pending(&brmctx->ip6_other_query.timer) &&
3177 br_timer_value(&brmctx->ip6_other_query.timer),
3199 br_multicast_update_query_timer(struct net_bridge_mcast *brmctx,
3206 mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval);
3223 br_multicast_rport_from_node(struct net_bridge_mcast *brmctx,
3230 if (mc_router_list == &brmctx->ip6_mc_router_list)
3242 br_multicast_get_rport_slot(struct net_bridge_mcast *brmctx,
3252 p = br_multicast_rport_from_node(brmctx, mc_router_list, rlist);
3280 static void br_multicast_add_router(struct net_bridge_mcast *brmctx,
3290 slot = br_multicast_get_rport_slot(brmctx, pmctx->port, mc_router_list);
3311 static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx,
3314 br_multicast_add_router(brmctx, pmctx, &pmctx->ip4_rlist,
3315 &brmctx->ip4_mc_router_list);
3322 static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx,
3326 br_multicast_add_router(brmctx, pmctx, &pmctx->ip6_rlist,
3327 &brmctx->ip6_mc_router_list);
3331 static void br_multicast_mark_router(struct net_bridge_mcast *brmctx,
3339 if (!br_multicast_ctx_should_use(brmctx, pmctx))
3343 if (brmctx->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) {
3344 if (!br_ip4_multicast_is_router(brmctx) &&
3345 !br_ip6_multicast_is_router(brmctx))
3346 br_mc_router_state_change(brmctx->br, true);
3347 mod_timer(timer, now + brmctx->multicast_querier_interval);
3356 br_multicast_add_router(brmctx, pmctx, rlist, mc_router_list);
3357 mod_timer(timer, now + brmctx->multicast_querier_interval);
3360 static void br_ip4_multicast_mark_router(struct net_bridge_mcast *brmctx,
3363 struct timer_list *timer = &brmctx->ip4_mc_router_timer;
3371 br_multicast_mark_router(brmctx, pmctx, timer, rlist,
3372 &brmctx->ip4_mc_router_list);
3375 static void br_ip6_multicast_mark_router(struct net_bridge_mcast *brmctx,
3379 struct timer_list *timer = &brmctx->ip6_mc_router_timer;
3387 br_multicast_mark_router(brmctx, pmctx, timer, rlist,
3388 &brmctx->ip6_mc_router_list);
3393 br_ip4_multicast_query_received(struct net_bridge_mcast *brmctx,
3399 if (!br_multicast_select_querier(brmctx, pmctx, saddr))
3402 br_multicast_update_query_timer(brmctx, query, max_delay);
3403 br_ip4_multicast_mark_router(brmctx, pmctx);
3408 br_ip6_multicast_query_received(struct net_bridge_mcast *brmctx,
3414 if (!br_multicast_select_querier(brmctx, pmctx, saddr))
3417 br_multicast_update_query_timer(brmctx, query, max_delay);
3418 br_ip6_multicast_mark_router(brmctx, pmctx);
3422 static void br_ip4_multicast_query(struct net_bridge_mcast *brmctx,
3439 spin_lock(&brmctx->br->multicast_lock);
3440 if (!br_multicast_ctx_should_use(brmctx, pmctx))
3455 (brmctx->multicast_igmp_version == 3 && group &&
3469 br_ip4_multicast_query_received(brmctx, pmctx,
3470 &brmctx->ip4_other_query,
3475 mp = br_mdb_ip4_get(brmctx->br, group, vid);
3479 max_delay *= brmctx->multicast_last_member_count;
3488 (p = mlock_dereference(*pp, brmctx->br)) != NULL;
3493 (brmctx->multicast_igmp_version == 2 ||
3499 spin_unlock(&brmctx->br->multicast_lock);
3503 static int br_ip6_multicast_query(struct net_bridge_mcast *brmctx,
3522 spin_lock(&brmctx->br->multicast_lock);
3523 if (!br_multicast_ctx_should_use(brmctx, pmctx))
3543 if (brmctx->multicast_mld_version == 2 &&
3557 br_ip6_multicast_query_received(brmctx, pmctx,
3558 &brmctx->ip6_other_query,
3565 mp = br_mdb_ip6_get(brmctx->br, group, vid);
3569 max_delay *= brmctx->multicast_last_member_count;
3577 (p = mlock_dereference(*pp, brmctx->br)) != NULL;
3582 (brmctx->multicast_mld_version == 1 ||
3588 spin_unlock(&brmctx->br->multicast_lock);
3594 br_multicast_leave_group(struct net_bridge_mcast *brmctx,
3606 spin_lock(&brmctx->br->multicast_lock);
3607 if (!br_multicast_ctx_should_use(brmctx, pmctx))
3610 mp = br_mdb_ip_get(brmctx->br, group);
3618 (p = mlock_dereference(*pp, brmctx->br)) != NULL;
3635 if (brmctx->multicast_querier) {
3636 __br_multicast_send_query(brmctx, pmctx, NULL, NULL, &mp->addr,
3639 time = jiffies + brmctx->multicast_last_member_count *
3640 brmctx->multicast_last_member_interval;
3644 for (p = mlock_dereference(mp->ports, brmctx->br);
3646 p = mlock_dereference(p->next, brmctx->br)) {
3662 time = now + brmctx->multicast_last_member_count *
3663 brmctx->multicast_last_member_interval;
3676 for (p = mlock_dereference(mp->ports, brmctx->br);
3678 p = mlock_dereference(p->next, brmctx->br)) {
3692 spin_unlock(&brmctx->br->multicast_lock);
3695 static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx,
3707 own_query = pmctx ? &pmctx->ip4_own_query : &brmctx->ip4_own_query;
3714 br_multicast_leave_group(brmctx, pmctx, &br_group,
3715 &brmctx->ip4_other_query,
3720 static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx,
3732 own_query = pmctx ? &pmctx->ip6_own_query : &brmctx->ip6_own_query;
3739 br_multicast_leave_group(brmctx, pmctx, &br_group,
3740 &brmctx->ip6_other_query,
3778 static void br_multicast_pim(struct net_bridge_mcast *brmctx,
3790 spin_lock(&brmctx->br->multicast_lock);
3791 br_ip4_multicast_mark_router(brmctx, pmctx);
3792 spin_unlock(&brmctx->br->multicast_lock);
3795 static int br_ip4_multicast_mrd_rcv(struct net_bridge_mcast *brmctx,
3803 spin_lock(&brmctx->br->multicast_lock);
3804 br_ip4_multicast_mark_router(brmctx, pmctx);
3805 spin_unlock(&brmctx->br->multicast_lock);
3810 static int br_multicast_ipv4_rcv(struct net_bridge_mcast *brmctx,
3827 br_multicast_pim(brmctx, pmctx, skb);
3829 br_ip4_multicast_mrd_rcv(brmctx, pmctx, skb);
3834 br_multicast_err_count(brmctx->br, p, skb->protocol);
3846 err = br_ip4_multicast_add_group(brmctx, pmctx, ih->group, vid,
3850 err = br_ip4_multicast_igmp3_report(brmctx, pmctx, skb, vid);
3853 br_ip4_multicast_query(brmctx, pmctx, skb, vid);
3856 br_ip4_multicast_leave_group(brmctx, pmctx, ih->group, vid, src);
3860 br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp,
3867 static void br_ip6_multicast_mrd_rcv(struct net_bridge_mcast *brmctx,
3874 spin_lock(&brmctx->br->multicast_lock);
3875 br_ip6_multicast_mark_router(brmctx, pmctx);
3876 spin_unlock(&brmctx->br->multicast_lock);
3879 static int br_multicast_ipv6_rcv(struct net_bridge_mcast *brmctx,
3896 br_ip6_multicast_mrd_rcv(brmctx, pmctx, skb);
3900 br_multicast_err_count(brmctx->br, p, skb->protocol);
3911 err = br_ip6_multicast_add_group(brmctx, pmctx, &mld->mld_mca,
3915 err = br_ip6_multicast_mld2_report(brmctx, pmctx, skb, vid);
3918 err = br_ip6_multicast_query(brmctx, pmctx, skb, vid);
3922 br_ip6_multicast_leave_group(brmctx, pmctx, &mld->mld_mca, vid,
3927 br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp,
3934 int br_multicast_rcv(struct net_bridge_mcast **brmctx,
3944 if (!br_opt_get((*brmctx)->br, BROPT_MULTICAST_ENABLED))
3947 if (br_opt_get((*brmctx)->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED) && vlan) {
3955 *brmctx = &vlan->br_mcast_ctx;
3959 *brmctx = &vlan->brvlan->br_mcast_ctx;
3969 ret = br_multicast_ipv4_rcv(*brmctx, *pmctx, skb, vid);
3973 ret = br_multicast_ipv6_rcv(*brmctx, *pmctx, skb, vid);
3981 static void br_multicast_query_expired(struct net_bridge_mcast *brmctx,
3985 spin_lock(&brmctx->br->multicast_lock);
3986 if (br_multicast_ctx_vlan_disabled(brmctx))
3989 if (query->startup_sent < brmctx->multicast_startup_query_count)
3992 br_multicast_send_query(brmctx, NULL, query);
3994 spin_unlock(&brmctx->br->multicast_lock);
3999 struct net_bridge_mcast *brmctx = from_timer(brmctx, t,
4002 br_multicast_query_expired(brmctx, &brmctx->ip4_own_query,
4003 &brmctx->ip4_querier);
4009 struct net_bridge_mcast *brmctx = from_timer(brmctx, t,
4012 br_multicast_query_expired(brmctx, &brmctx->ip6_own_query,
4013 &brmctx->ip6_querier);
4032 struct net_bridge_mcast *brmctx)
4034 brmctx->br = br;
4035 brmctx->vlan = vlan;
4036 brmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
4037 brmctx->multicast_last_member_count = 2;
4038 brmctx->multicast_startup_query_count = 2;
4040 brmctx->multicast_last_member_interval = HZ;
4041 brmctx->multicast_query_response_interval = 10 * HZ;
4042 brmctx->multicast_startup_query_interval = 125 * HZ / 4;
4043 brmctx->multicast_query_interval = 125 * HZ;
4044 brmctx->multicast_querier_interval = 255 * HZ;
4045 brmctx->multicast_membership_interval = 260 * HZ;
4047 brmctx->ip4_querier.port_ifidx = 0;
4048 seqcount_spinlock_init(&brmctx->ip4_querier.seq, &br->multicast_lock);
4049 brmctx->multicast_igmp_version = 2;
4051 brmctx->multicast_mld_version = 1;
4052 brmctx->ip6_querier.port_ifidx = 0;
4053 seqcount_spinlock_init(&brmctx->ip6_querier.seq, &br->multicast_lock);
4056 timer_setup(&brmctx->ip4_mc_router_timer,
4058 timer_setup(&brmctx->ip4_other_query.timer,
4060 timer_setup(&brmctx->ip4_other_query.delay_timer,
4062 timer_setup(&brmctx->ip4_own_query.timer,
4065 timer_setup(&brmctx->ip6_mc_router_timer,
4067 timer_setup(&brmctx->ip6_other_query.timer,
4069 timer_setup(&brmctx->ip6_other_query.delay_timer,
4071 timer_setup(&brmctx->ip6_own_query.timer,
4076 void br_multicast_ctx_deinit(struct net_bridge_mcast *brmctx)
4078 __br_multicast_stop(brmctx);
4169 static void __br_multicast_open(struct net_bridge_mcast *brmctx)
4171 __br_multicast_open_query(brmctx->br, &brmctx->ip4_own_query);
4173 __br_multicast_open_query(brmctx->br, &brmctx->ip6_own_query);
4188 struct net_bridge_mcast *brmctx;
4190 brmctx = &vlan->br_mcast_ctx;
4192 !br_multicast_ctx_vlan_disabled(brmctx))
4201 static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
4203 del_timer_sync(&brmctx->ip4_mc_router_timer);
4204 del_timer_sync(&brmctx->ip4_other_query.timer);
4205 del_timer_sync(&brmctx->ip4_other_query.delay_timer);
4206 del_timer_sync(&brmctx->ip4_own_query.timer);
4208 del_timer_sync(&brmctx->ip6_mc_router_timer);
4209 del_timer_sync(&brmctx->ip6_other_query.timer);
4210 del_timer_sync(&brmctx->ip6_other_query.delay_timer);
4211 del_timer_sync(&brmctx->ip6_own_query.timer);
4243 struct net_bridge_mcast *brmctx;
4245 brmctx = br_multicast_port_ctx_get_global(&vlan->port_mcast_ctx);
4246 if (on && br_multicast_ctx_vlan_global_disabled(brmctx))
4346 struct net_bridge_mcast *brmctx;
4348 brmctx = &vlan->br_mcast_ctx;
4350 !br_multicast_ctx_vlan_disabled(brmctx))
4378 int br_multicast_set_router(struct net_bridge_mcast *brmctx, unsigned long val)
4382 spin_lock_bh(&brmctx->br->multicast_lock);
4387 br_mc_router_state_change(brmctx->br, val == MDB_RTR_TYPE_PERM);
4388 del_timer(&brmctx->ip4_mc_router_timer);
4390 del_timer(&brmctx->ip6_mc_router_timer);
4392 brmctx->multicast_router = val;
4396 if (brmctx->multicast_router != MDB_RTR_TYPE_TEMP_QUERY)
4397 br_mc_router_state_change(brmctx->br, false);
4398 brmctx->multicast_router = val;
4403 spin_unlock_bh(&brmctx->br->multicast_lock);
4435 struct net_bridge_mcast *brmctx;
4440 brmctx = br_multicast_port_ctx_get_global(pmctx);
4441 spin_lock_bh(&brmctx->br->multicast_lock);
4446 now + brmctx->multicast_querier_interval);
4449 now + brmctx->multicast_querier_interval);
4475 br_ip4_multicast_add_router(brmctx, pmctx);
4479 br_ip6_multicast_add_router(brmctx, pmctx);
4483 br_ip4_multicast_mark_router(brmctx, pmctx);
4484 br_ip6_multicast_mark_router(brmctx, pmctx);
4491 spin_unlock_bh(&brmctx->br->multicast_lock);
4509 static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
4514 if (!br_multicast_ctx_matches_vlan_snooping(brmctx))
4517 __br_multicast_open_query(brmctx->br, query);
4520 list_for_each_entry_rcu(port, &brmctx->br->port_list, list) {
4529 if (br_multicast_ctx_is_vlan(brmctx)) {
4533 brmctx->vlan->vid);
4549 if (query == &brmctx->ip4_own_query)
4636 int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
4642 spin_lock_bh(&brmctx->br->multicast_lock);
4643 if (brmctx->multicast_querier == val)
4646 WRITE_ONCE(brmctx->multicast_querier, val);
4650 max_delay = brmctx->multicast_query_response_interval;
4652 if (!timer_pending(&brmctx->ip4_other_query.timer))
4653 mod_timer(&brmctx->ip4_other_query.delay_timer,
4656 br_multicast_start_querier(brmctx, &brmctx->ip4_own_query);
4659 if (!timer_pending(&brmctx->ip6_other_query.timer))
4660 mod_timer(&brmctx->ip6_other_query.delay_timer,
4663 br_multicast_start_querier(brmctx, &brmctx->ip6_own_query);
4667 spin_unlock_bh(&brmctx->br->multicast_lock);
4672 int br_multicast_set_igmp_version(struct net_bridge_mcast *brmctx,
4684 spin_lock_bh(&brmctx->br->multicast_lock);
4685 brmctx->multicast_igmp_version = val;
4686 spin_unlock_bh(&brmctx->br->multicast_lock);
4692 int br_multicast_set_mld_version(struct net_bridge_mcast *brmctx,
4704 spin_lock_bh(&brmctx->br->multicast_lock);
4705 brmctx->multicast_mld_version = val;
4706 spin_unlock_bh(&brmctx->br->multicast_lock);
4712 void br_multicast_set_query_intvl(struct net_bridge_mcast *brmctx,
4718 br_info(brmctx->br,
4725 brmctx->multicast_query_interval = intvl_jiffies;
4728 void br_multicast_set_startup_query_intvl(struct net_bridge_mcast *brmctx,
4734 br_info(brmctx->br,
4741 brmctx->multicast_startup_query_interval = intvl_jiffies;
4849 struct net_bridge_mcast *brmctx;
4864 brmctx = &br->multicast_ctx;
4868 port_ifidx = brmctx->ip4_querier.port_ifidx;
4869 if (!timer_pending(&brmctx->ip4_other_query.timer) ||
4875 port_ifidx = brmctx->ip6_querier.port_ifidx;
4876 if (!timer_pending(&brmctx->ip6_other_query.timer) ||
4904 struct net_bridge_mcast *brmctx;
4913 brmctx = &port->br->multicast_ctx;
4916 hlist_for_each_entry_rcu(pmctx, &brmctx->ip4_mc_router_list,
4927 hlist_for_each_entry_rcu(pmctx, &brmctx->ip6_mc_router_list,