Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: bridge: multicast: use multicast contexts instead of bridge or port

Pass multicast context pointers to multicast functions instead of bridge/port.
This would make it easier later to switch these contexts to their per-vlan
versions. The patch is basically search and replace, no functional changes.

Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Nikolay Aleksandrov and committed by
David S. Miller
adc47037 d3d065c0

+575 -515
+5 -4
net/bridge/br_device.c
··· 28 28 netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) 29 29 { 30 30 struct net_bridge *br = netdev_priv(dev); 31 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 31 32 struct net_bridge_fdb_entry *dst; 32 33 struct net_bridge_mdb_entry *mdst; 33 34 const struct nf_br_ops *nf_ops; ··· 83 82 br_flood(br, skb, BR_PKT_MULTICAST, false, true); 84 83 goto out; 85 84 } 86 - if (br_multicast_rcv(br, NULL, skb, vid)) { 85 + if (br_multicast_rcv(brmctx, NULL, skb, vid)) { 87 86 kfree_skb(skb); 88 87 goto out; 89 88 } 90 89 91 - mdst = br_mdb_get(br, skb, vid); 90 + mdst = br_mdb_get(brmctx, skb, vid); 92 91 if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && 93 - br_multicast_querier_exists(br, eth_hdr(skb), mdst)) 94 - br_multicast_flood(mdst, skb, false, true); 92 + br_multicast_querier_exists(brmctx, eth_hdr(skb), mdst)) 93 + br_multicast_flood(mdst, skb, brmctx, false, true); 95 94 else 96 95 br_flood(br, skb, BR_PKT_MULTICAST, false, true); 97 96 } else if ((dst = br_fdb_find_rcu(br, dest, vid)) != NULL) {
+3 -4
net/bridge/br_forward.c
··· 267 267 /* called with rcu_read_lock */ 268 268 void br_multicast_flood(struct net_bridge_mdb_entry *mdst, 269 269 struct sk_buff *skb, 270 + struct net_bridge_mcast *brmctx, 270 271 bool local_rcv, bool local_orig) 271 272 { 272 - struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; 273 - struct net_bridge *br = netdev_priv(dev); 274 273 struct net_bridge_port *prev = NULL; 275 274 struct net_bridge_port_group *p; 276 275 bool allow_mode_include = true; 277 276 struct hlist_node *rp; 278 277 279 - rp = br_multicast_get_first_rport_node(br, skb); 278 + rp = br_multicast_get_first_rport_node(brmctx, skb); 280 279 281 280 if (mdst) { 282 281 p = rcu_dereference(mdst->ports); 283 - if (br_multicast_should_handle_mode(br, mdst->addr.proto) && 282 + if (br_multicast_should_handle_mode(brmctx, mdst->addr.proto) && 284 283 br_multicast_is_star_g(&mdst->addr)) 285 284 allow_mode_include = false; 286 285 } else {
+9 -5
net/bridge/br_input.c
··· 69 69 struct net_bridge_port *p = br_port_get_rcu(skb->dev); 70 70 enum br_pkt_type pkt_type = BR_PKT_UNICAST; 71 71 struct net_bridge_fdb_entry *dst = NULL; 72 + struct net_bridge_mcast_port *pmctx; 72 73 struct net_bridge_mdb_entry *mdst; 73 74 bool local_rcv, mcast_hit = false; 75 + struct net_bridge_mcast *brmctx; 74 76 struct net_bridge *br; 75 77 u16 vid = 0; 76 78 u8 state; ··· 80 78 if (!p || p->state == BR_STATE_DISABLED) 81 79 goto drop; 82 80 81 + brmctx = &p->br->multicast_ctx; 82 + pmctx = &p->multicast_ctx; 83 83 state = p->state; 84 84 if (!br_allowed_ingress(p->br, nbp_vlan_group_rcu(p), skb, &vid, 85 85 &state)) ··· 102 98 local_rcv = true; 103 99 } else { 104 100 pkt_type = BR_PKT_MULTICAST; 105 - if (br_multicast_rcv(br, p, skb, vid)) 101 + if (br_multicast_rcv(brmctx, pmctx, skb, vid)) 106 102 goto drop; 107 103 } 108 104 } ··· 132 128 133 129 switch (pkt_type) { 134 130 case BR_PKT_MULTICAST: 135 - mdst = br_mdb_get(br, skb, vid); 131 + mdst = br_mdb_get(brmctx, skb, vid); 136 132 if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && 137 - br_multicast_querier_exists(br, eth_hdr(skb), mdst)) { 133 + br_multicast_querier_exists(brmctx, eth_hdr(skb), mdst)) { 138 134 if ((mdst && mdst->host_joined) || 139 - br_multicast_is_router(br, skb)) { 135 + br_multicast_is_router(brmctx, skb)) { 140 136 local_rcv = true; 141 137 br->dev->stats.multicast++; 142 138 } ··· 166 162 if (!mcast_hit) 167 163 br_flood(br, skb, pkt_type, local_rcv, false); 168 164 else 169 - br_multicast_flood(mdst, skb, local_rcv, false); 165 + br_multicast_flood(mdst, skb, brmctx, local_rcv, false); 170 166 } 171 167 172 168 if (local_rcv)
+1 -1
net/bridge/br_mdb.c
··· 1092 1092 * a new INCLUDE port (S,G) then all of *,G EXCLUDE ports need to be 1093 1093 * added to it for proper replication 1094 1094 */ 1095 - if (br_multicast_should_handle_mode(br, group.proto)) { 1095 + if (br_multicast_should_handle_mode(&br->multicast_ctx, group.proto)) { 1096 1096 switch (filter_mode) { 1097 1097 case MCAST_EXCLUDE: 1098 1098 br_multicast_star_g_handle_mode(p, MCAST_EXCLUDE);
+465 -424
net/bridge/br_multicast.c
··· 49 49 .automatic_shrinking = true, 50 50 }; 51 51 52 - static void br_multicast_start_querier(struct net_bridge *br, 52 + static void br_multicast_start_querier(struct net_bridge_mcast *brmctx, 53 53 struct bridge_mcast_own_query *query); 54 - static void br_ip4_multicast_add_router(struct net_bridge *br, 55 - struct net_bridge_port *port); 56 - static void br_ip4_multicast_leave_group(struct net_bridge *br, 57 - struct net_bridge_port *port, 54 + static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx, 55 + struct net_bridge_mcast_port *pmctx); 56 + static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx, 57 + struct net_bridge_mcast_port *pmctx, 58 58 __be32 group, 59 59 __u16 vid, 60 60 const unsigned char *src); 61 61 static void br_multicast_port_group_rexmit(struct timer_list *t); 62 62 63 63 static void 64 - br_multicast_rport_del_notify(struct net_bridge_port *p, bool deleted); 65 - static void br_ip6_multicast_add_router(struct net_bridge *br, 66 - struct net_bridge_port *port); 64 + br_multicast_rport_del_notify(struct net_bridge_mcast_port *pmctx, bool deleted); 65 + static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx, 66 + struct net_bridge_mcast_port *pmctx); 67 67 #if IS_ENABLED(CONFIG_IPV6) 68 - static void br_ip6_multicast_leave_group(struct net_bridge *br, 69 - struct net_bridge_port *port, 68 + static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx, 69 + struct net_bridge_mcast_port *pmctx, 70 70 const struct in6_addr *group, 71 71 __u16 vid, const unsigned char *src); 72 72 #endif 73 73 static struct net_bridge_port_group * 74 - __br_multicast_add_group(struct net_bridge *br, 75 - struct net_bridge_port *port, 74 + __br_multicast_add_group(struct net_bridge_mcast *brmctx, 75 + struct net_bridge_mcast_port *pmctx, 76 76 struct br_ip *group, 77 77 const unsigned char *src, 78 78 u8 filter_mode, ··· 140 140 } 141 141 #endif 142 142 143 - struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, 143 + struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge_mcast *brmctx, 144 144 struct sk_buff *skb, u16 vid) 145 145 { 146 + struct net_bridge *br = brmctx->br; 146 147 struct br_ip ip; 147 148 148 149 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) ··· 159 158 switch (skb->protocol) { 160 159 case htons(ETH_P_IP): 161 160 ip.dst.ip4 = ip_hdr(skb)->daddr; 162 - if (br->multicast_ctx.multicast_igmp_version == 3) { 161 + if (brmctx->multicast_igmp_version == 3) { 163 162 struct net_bridge_mdb_entry *mdb; 164 163 165 164 ip.src.ip4 = ip_hdr(skb)->saddr; ··· 172 171 #if IS_ENABLED(CONFIG_IPV6) 173 172 case htons(ETH_P_IPV6): 174 173 ip.dst.ip6 = ipv6_hdr(skb)->daddr; 175 - if (br->multicast_ctx.multicast_mld_version == 2) { 174 + if (brmctx->multicast_mld_version == 2) { 176 175 struct net_bridge_mdb_entry *mdb; 177 176 178 177 ip.src.ip6 = ipv6_hdr(skb)->saddr; ··· 204 203 return ether_addr_equal(src, p->eth_addr); 205 204 } 206 205 207 - static void __fwd_add_star_excl(struct net_bridge_port_group *pg, 206 + static void __fwd_add_star_excl(struct net_bridge_mcast_port *pmctx, 207 + struct net_bridge_port_group *pg, 208 208 struct br_ip *sg_ip) 209 209 { 210 210 struct net_bridge_port_group_sg_key sg_key; 211 - struct net_bridge *br = pg->key.port->br; 212 211 struct net_bridge_port_group *src_pg; 212 + struct net_bridge_mcast *brmctx; 213 213 214 214 memset(&sg_key, 0, sizeof(sg_key)); 215 + brmctx = &pg->key.port->br->multicast_ctx; 215 216 sg_key.port = pg->key.port; 216 217 sg_key.addr = *sg_ip; 217 - if (br_sg_port_find(br, &sg_key)) 218 + if (br_sg_port_find(brmctx->br, &sg_key)) 218 219 return; 219 220 220 - src_pg = __br_multicast_add_group(br, pg->key.port, sg_ip, pg->eth_addr, 221 + src_pg = __br_multicast_add_group(brmctx, pmctx, 222 + sg_ip, pg->eth_addr, 221 223 MCAST_INCLUDE, false, false); 222 224 if (IS_ERR_OR_NULL(src_pg) || 223 225 src_pg->rt_protocol != RTPROT_KERNEL) ··· 260 256 { 261 257 struct net_bridge *br = pg->key.port->br; 262 258 struct net_bridge_port_group *pg_lst; 259 + struct net_bridge_mcast_port *pmctx; 263 260 struct net_bridge_mdb_entry *mp; 264 261 struct br_ip sg_ip; 265 262 ··· 270 265 mp = br_mdb_ip_get(br, &pg->key.addr); 271 266 if (!mp) 272 267 return; 268 + pmctx = &pg->key.port->multicast_ctx; 273 269 274 270 memset(&sg_ip, 0, sizeof(sg_ip)); 275 271 sg_ip = pg->key.addr; ··· 290 284 __fwd_del_star_excl(pg, &sg_ip); 291 285 break; 292 286 case MCAST_EXCLUDE: 293 - __fwd_add_star_excl(pg, &sg_ip); 287 + __fwd_add_star_excl(pmctx, pg, &sg_ip); 294 288 break; 295 289 } 296 290 } ··· 383 377 { 384 378 struct net_bridge_port_group_sg_key sg_key; 385 379 struct net_bridge *br = star_mp->br; 380 + struct net_bridge_mcast_port *pmctx; 386 381 struct net_bridge_port_group *pg; 382 + struct net_bridge_mcast *brmctx; 387 383 388 384 if (WARN_ON(br_multicast_is_star_g(&sg->key.addr))) 389 385 return; ··· 395 387 br_multicast_sg_host_state(star_mp, sg); 396 388 memset(&sg_key, 0, sizeof(sg_key)); 397 389 sg_key.addr = sg->key.addr; 390 + brmctx = &br->multicast_ctx; 398 391 /* we need to add all exclude ports to the S,G */ 399 392 for (pg = mlock_dereference(star_mp->ports, br); 400 393 pg; ··· 409 400 if (br_sg_port_find(br, &sg_key)) 410 401 continue; 411 402 412 - src_pg = __br_multicast_add_group(br, pg->key.port, 403 + pmctx = &pg->key.port->multicast_ctx; 404 + src_pg = __br_multicast_add_group(brmctx, pmctx, 413 405 &sg->key.addr, 414 406 sg->eth_addr, 415 407 MCAST_INCLUDE, false, false); ··· 424 414 static void br_multicast_fwd_src_add(struct net_bridge_group_src *src) 425 415 { 426 416 struct net_bridge_mdb_entry *star_mp; 417 + struct net_bridge_mcast_port *pmctx; 427 418 struct net_bridge_port_group *sg; 419 + struct net_bridge_mcast *brmctx; 428 420 struct br_ip sg_ip; 429 421 430 422 if (src->flags & BR_SGRP_F_INSTALLED) 431 423 return; 432 424 433 425 memset(&sg_ip, 0, sizeof(sg_ip)); 426 + pmctx = &src->pg->key.port->multicast_ctx; 427 + brmctx = &src->br->multicast_ctx; 434 428 sg_ip = src->pg->key.addr; 435 429 sg_ip.src = src->addr.src; 436 - sg = __br_multicast_add_group(src->br, src->pg->key.port, &sg_ip, 430 + 431 + sg = __br_multicast_add_group(brmctx, pmctx, &sg_ip, 437 432 src->pg->eth_addr, MCAST_INCLUDE, false, 438 433 !timer_pending(&src->timer)); 439 434 if (IS_ERR_OR_NULL(sg)) ··· 707 692 } 708 693 } 709 694 710 - static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br, 695 + static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge_mcast *brmctx, 711 696 struct net_bridge_port_group *pg, 712 697 __be32 ip_dst, __be32 group, 713 698 bool with_srcs, bool over_lmqt, 714 699 u8 sflag, u8 *igmp_type, 715 700 bool *need_rexmit) 716 701 { 717 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 718 702 struct net_bridge_port *p = pg ? pg->key.port : NULL; 719 703 struct net_bridge_group_src *ent; 720 704 size_t pkt_size, igmp_hdr_size; ··· 749 735 750 736 pkt_size = sizeof(*eth) + sizeof(*iph) + 4 + igmp_hdr_size; 751 737 if ((p && pkt_size > p->dev->mtu) || 752 - pkt_size > br->dev->mtu) 738 + pkt_size > brmctx->br->dev->mtu) 753 739 return NULL; 754 740 755 - skb = netdev_alloc_skb_ip_align(br->dev, pkt_size); 741 + skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size); 756 742 if (!skb) 757 743 goto out; 758 744 ··· 761 747 skb_reset_mac_header(skb); 762 748 eth = eth_hdr(skb); 763 749 764 - ether_addr_copy(eth->h_source, br->dev->dev_addr); 750 + ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr); 765 751 ip_eth_mc_map(ip_dst, eth->h_dest); 766 752 eth->h_proto = htons(ETH_P_IP); 767 753 skb_put(skb, sizeof(*eth)); ··· 777 763 iph->frag_off = htons(IP_DF); 778 764 iph->ttl = 1; 779 765 iph->protocol = IPPROTO_IGMP; 780 - iph->saddr = br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR) ? 781 - inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0; 766 + iph->saddr = br_opt_get(brmctx->br, BROPT_MULTICAST_QUERY_USE_IFADDR) ? 767 + inet_select_addr(brmctx->br->dev, 0, RT_SCOPE_LINK) : 0; 782 768 iph->daddr = ip_dst; 783 769 ((u8 *)&iph[1])[0] = IPOPT_RA; 784 770 ((u8 *)&iph[1])[1] = 4; ··· 852 838 } 853 839 854 840 #if IS_ENABLED(CONFIG_IPV6) 855 - static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, 841 + static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brmctx, 856 842 struct net_bridge_port_group *pg, 857 843 const struct in6_addr *ip6_dst, 858 844 const struct in6_addr *group, ··· 860 846 u8 sflag, u8 *igmp_type, 861 847 bool *need_rexmit) 862 848 { 863 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 864 849 struct net_bridge_port *p = pg ? pg->key.port : NULL; 865 850 struct net_bridge_group_src *ent; 866 851 size_t pkt_size, mld_hdr_size; ··· 897 884 898 885 pkt_size = sizeof(*eth) + sizeof(*ip6h) + 8 + mld_hdr_size; 899 886 if ((p && pkt_size > p->dev->mtu) || 900 - pkt_size > br->dev->mtu) 887 + pkt_size > brmctx->br->dev->mtu) 901 888 return NULL; 902 889 903 - skb = netdev_alloc_skb_ip_align(br->dev, pkt_size); 890 + skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size); 904 891 if (!skb) 905 892 goto out; 906 893 ··· 910 897 skb_reset_mac_header(skb); 911 898 eth = eth_hdr(skb); 912 899 913 - ether_addr_copy(eth->h_source, br->dev->dev_addr); 900 + ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr); 914 901 eth->h_proto = htons(ETH_P_IPV6); 915 902 skb_put(skb, sizeof(*eth)); 916 903 ··· 923 910 ip6h->nexthdr = IPPROTO_HOPOPTS; 924 911 ip6h->hop_limit = 1; 925 912 ip6h->daddr = *ip6_dst; 926 - if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, 927 - &ip6h->saddr)) { 913 + if (ipv6_dev_get_saddr(dev_net(brmctx->br->dev), brmctx->br->dev, 914 + &ip6h->daddr, 0, &ip6h->saddr)) { 928 915 kfree_skb(skb); 929 - br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, false); 916 + br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, false); 930 917 return NULL; 931 918 } 932 919 933 - br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true); 920 + br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, true); 934 921 ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest); 935 922 936 923 hopopt = (u8 *)(ip6h + 1); ··· 1015 1002 } 1016 1003 #endif 1017 1004 1018 - static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br, 1005 + static struct sk_buff *br_multicast_alloc_query(struct net_bridge_mcast *brmctx, 1019 1006 struct net_bridge_port_group *pg, 1020 1007 struct br_ip *ip_dst, 1021 1008 struct br_ip *group, ··· 1028 1015 switch (group->proto) { 1029 1016 case htons(ETH_P_IP): 1030 1017 ip4_dst = ip_dst ? ip_dst->dst.ip4 : htonl(INADDR_ALLHOSTS_GROUP); 1031 - return br_ip4_multicast_alloc_query(br, pg, 1018 + return br_ip4_multicast_alloc_query(brmctx, pg, 1032 1019 ip4_dst, group->dst.ip4, 1033 1020 with_srcs, over_lmqt, 1034 1021 sflag, igmp_type, ··· 1043 1030 ipv6_addr_set(&ip6_dst, htonl(0xff020000), 0, 0, 1044 1031 htonl(1)); 1045 1032 1046 - return br_ip6_multicast_alloc_query(br, pg, 1033 + return br_ip6_multicast_alloc_query(brmctx, pg, 1047 1034 &ip6_dst, &group->dst.ip6, 1048 1035 with_srcs, over_lmqt, 1049 1036 sflag, igmp_type, ··· 1251 1238 } 1252 1239 1253 1240 static struct net_bridge_port_group * 1254 - __br_multicast_add_group(struct net_bridge *br, 1255 - struct net_bridge_port *port, 1241 + __br_multicast_add_group(struct net_bridge_mcast *brmctx, 1242 + struct net_bridge_mcast_port *pmctx, 1256 1243 struct br_ip *group, 1257 1244 const unsigned char *src, 1258 1245 u8 filter_mode, ··· 1264 1251 struct net_bridge_mdb_entry *mp; 1265 1252 unsigned long now = jiffies; 1266 1253 1267 - if (!netif_running(br->dev) || 1268 - (port && port->state == BR_STATE_DISABLED)) 1254 + if (!netif_running(brmctx->br->dev) || 1255 + (pmctx && pmctx->port->state == BR_STATE_DISABLED)) 1269 1256 goto out; 1270 1257 1271 - mp = br_multicast_new_group(br, group); 1258 + mp = br_multicast_new_group(brmctx->br, group); 1272 1259 if (IS_ERR(mp)) 1273 1260 return ERR_CAST(mp); 1274 1261 1275 - if (!port) { 1262 + if (!pmctx) { 1276 1263 br_multicast_host_join(mp, true); 1277 1264 goto out; 1278 1265 } 1279 1266 1280 1267 for (pp = &mp->ports; 1281 - (p = mlock_dereference(*pp, br)) != NULL; 1268 + (p = mlock_dereference(*pp, brmctx->br)) != NULL; 1282 1269 pp = &p->next) { 1283 - if (br_port_group_equal(p, port, src)) 1270 + if (br_port_group_equal(p, pmctx->port, src)) 1284 1271 goto found; 1285 - if ((unsigned long)p->key.port < (unsigned long)port) 1272 + if ((unsigned long)p->key.port < (unsigned long)pmctx->port) 1286 1273 break; 1287 1274 } 1288 1275 1289 - p = br_multicast_new_port_group(port, group, *pp, 0, src, 1276 + p = br_multicast_new_port_group(pmctx->port, group, *pp, 0, src, 1290 1277 filter_mode, RTPROT_KERNEL); 1291 1278 if (unlikely(!p)) { 1292 1279 p = ERR_PTR(-ENOMEM); ··· 1295 1282 rcu_assign_pointer(*pp, p); 1296 1283 if (blocked) 1297 1284 p->flags |= MDB_PG_FLAGS_BLOCKED; 1298 - br_mdb_notify(br->dev, mp, p, RTM_NEWMDB); 1285 + br_mdb_notify(brmctx->br->dev, mp, p, RTM_NEWMDB); 1299 1286 1300 1287 found: 1301 1288 if (igmpv2_mldv1) 1302 1289 mod_timer(&p->timer, 1303 - now + br->multicast_ctx.multicast_membership_interval); 1290 + now + brmctx->multicast_membership_interval); 1304 1291 1305 1292 out: 1306 1293 return p; 1307 1294 } 1308 1295 1309 - static int br_multicast_add_group(struct net_bridge *br, 1310 - struct net_bridge_port *port, 1296 + static int br_multicast_add_group(struct net_bridge_mcast *brmctx, 1297 + struct net_bridge_mcast_port *pmctx, 1311 1298 struct br_ip *group, 1312 1299 const unsigned char *src, 1313 1300 u8 filter_mode, ··· 1316 1303 struct net_bridge_port_group *pg; 1317 1304 int err; 1318 1305 1319 - spin_lock(&br->multicast_lock); 1320 - pg = __br_multicast_add_group(br, port, group, src, filter_mode, 1306 + spin_lock(&brmctx->br->multicast_lock); 1307 + pg = __br_multicast_add_group(brmctx, pmctx, group, src, filter_mode, 1321 1308 igmpv2_mldv1, false); 1322 1309 /* NULL is considered valid for host joined groups */ 1323 1310 err = PTR_ERR_OR_ZERO(pg); 1324 - spin_unlock(&br->multicast_lock); 1311 + spin_unlock(&brmctx->br->multicast_lock); 1325 1312 1326 1313 return err; 1327 1314 } 1328 1315 1329 - static int br_ip4_multicast_add_group(struct net_bridge *br, 1330 - struct net_bridge_port *port, 1316 + static int br_ip4_multicast_add_group(struct net_bridge_mcast *brmctx, 1317 + struct net_bridge_mcast_port *pmctx, 1331 1318 __be32 group, 1332 1319 __u16 vid, 1333 1320 const unsigned char *src, ··· 1345 1332 br_group.vid = vid; 1346 1333 filter_mode = igmpv2 ? MCAST_EXCLUDE : MCAST_INCLUDE; 1347 1334 1348 - return br_multicast_add_group(br, port, &br_group, src, filter_mode, 1349 - igmpv2); 1335 + return br_multicast_add_group(brmctx, pmctx, &br_group, src, 1336 + filter_mode, igmpv2); 1350 1337 } 1351 1338 1352 1339 #if IS_ENABLED(CONFIG_IPV6) 1353 - static int br_ip6_multicast_add_group(struct net_bridge *br, 1354 - struct net_bridge_port *port, 1340 + static int br_ip6_multicast_add_group(struct net_bridge_mcast *brmctx, 1341 + struct net_bridge_mcast_port *pmctx, 1355 1342 const struct in6_addr *group, 1356 1343 __u16 vid, 1357 1344 const unsigned char *src, ··· 1369 1356 br_group.vid = vid; 1370 1357 filter_mode = mldv1 ? MCAST_EXCLUDE : MCAST_INCLUDE; 1371 1358 1372 - return br_multicast_add_group(br, port, &br_group, src, filter_mode, 1373 - mldv1); 1359 + return br_multicast_add_group(brmctx, pmctx, &br_group, src, 1360 + filter_mode, mldv1); 1374 1361 } 1375 1362 #endif 1376 1363 ··· 1383 1370 return true; 1384 1371 } 1385 1372 1386 - static bool br_ip4_multicast_rport_del(struct net_bridge_port *p) 1373 + static bool br_ip4_multicast_rport_del(struct net_bridge_mcast_port *pmctx) 1387 1374 { 1388 - return br_multicast_rport_del(&p->multicast_ctx.ip4_rlist); 1375 + return br_multicast_rport_del(&pmctx->ip4_rlist); 1389 1376 } 1390 1377 1391 - static bool br_ip6_multicast_rport_del(struct net_bridge_port *p) 1378 + static bool br_ip6_multicast_rport_del(struct net_bridge_mcast_port *pmctx) 1392 1379 { 1393 1380 #if IS_ENABLED(CONFIG_IPV6) 1394 - return br_multicast_rport_del(&p->multicast_ctx.ip6_rlist); 1381 + return br_multicast_rport_del(&pmctx->ip6_rlist); 1395 1382 #else 1396 1383 return false; 1397 1384 #endif ··· 1411 1398 goto out; 1412 1399 1413 1400 del = br_multicast_rport_del(rlist); 1414 - br_multicast_rport_del_notify(pmctx->port, del); 1401 + br_multicast_rport_del_notify(pmctx, del); 1415 1402 out: 1416 1403 spin_unlock(&br->multicast_lock); 1417 1404 } ··· 1488 1475 !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) 1489 1476 goto out; 1490 1477 1491 - br_multicast_start_querier(brmctx->br, query); 1478 + br_multicast_start_querier(brmctx, query); 1492 1479 1493 1480 out: 1494 1481 spin_unlock(&brmctx->br->multicast_lock); ··· 1512 1499 } 1513 1500 #endif 1514 1501 1515 - static void br_multicast_select_own_querier(struct net_bridge *br, 1502 + static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx, 1516 1503 struct br_ip *ip, 1517 1504 struct sk_buff *skb) 1518 1505 { 1519 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1520 - 1521 1506 if (ip->proto == htons(ETH_P_IP)) 1522 1507 brmctx->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr; 1523 1508 #if IS_ENABLED(CONFIG_IPV6) ··· 1524 1513 #endif 1525 1514 } 1526 1515 1527 - static void __br_multicast_send_query(struct net_bridge *br, 1528 - struct net_bridge_port *port, 1516 + static void __br_multicast_send_query(struct net_bridge_mcast *brmctx, 1517 + struct net_bridge_mcast_port *pmctx, 1529 1518 struct net_bridge_port_group *pg, 1530 1519 struct br_ip *ip_dst, 1531 1520 struct br_ip *group, ··· 1538 1527 u8 igmp_type; 1539 1528 1540 1529 again_under_lmqt: 1541 - skb = br_multicast_alloc_query(br, pg, ip_dst, group, with_srcs, 1530 + skb = br_multicast_alloc_query(brmctx, pg, ip_dst, group, with_srcs, 1542 1531 over_lmqt, sflag, &igmp_type, 1543 1532 need_rexmit); 1544 1533 if (!skb) 1545 1534 return; 1546 1535 1547 - if (port) { 1548 - skb->dev = port->dev; 1549 - br_multicast_count(br, port, skb, igmp_type, 1536 + if (pmctx) { 1537 + skb->dev = pmctx->port->dev; 1538 + br_multicast_count(brmctx->br, pmctx->port, skb, igmp_type, 1550 1539 BR_MCAST_DIR_TX); 1551 1540 NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, 1552 - dev_net(port->dev), NULL, skb, NULL, skb->dev, 1541 + dev_net(pmctx->port->dev), NULL, skb, NULL, skb->dev, 1553 1542 br_dev_queue_push_xmit); 1554 1543 1555 1544 if (over_lmqt && with_srcs && sflag) { ··· 1557 1546 goto again_under_lmqt; 1558 1547 } 1559 1548 } else { 1560 - br_multicast_select_own_querier(br, group, skb); 1561 - br_multicast_count(br, port, skb, igmp_type, 1549 + br_multicast_select_own_querier(brmctx, group, skb); 1550 + br_multicast_count(brmctx->br, NULL, skb, igmp_type, 1562 1551 BR_MCAST_DIR_RX); 1563 1552 netif_rx(skb); 1564 1553 } 1565 1554 } 1566 1555 1567 - static void br_multicast_send_query(struct net_bridge *br, 1568 - struct net_bridge_port *port, 1556 + static void br_multicast_send_query(struct net_bridge_mcast *brmctx, 1557 + struct net_bridge_mcast_port *pmctx, 1569 1558 struct bridge_mcast_own_query *own_query) 1570 1559 { 1571 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1572 1560 struct bridge_mcast_other_query *other_query = NULL; 1573 1561 struct br_ip br_group; 1574 1562 unsigned long time; 1575 1563 1576 - if (!netif_running(br->dev) || 1577 - !br_opt_get(br, BROPT_MULTICAST_ENABLED) || 1578 - !br_opt_get(br, BROPT_MULTICAST_QUERIER)) 1564 + if (!netif_running(brmctx->br->dev) || 1565 + !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) || 1566 + !br_opt_get(brmctx->br, BROPT_MULTICAST_QUERIER)) 1579 1567 return; 1580 1568 1581 1569 memset(&br_group.dst, 0, sizeof(br_group.dst)); 1582 1570 1583 - if (port ? (own_query == &port->multicast_ctx.ip4_own_query) : 1584 - (own_query == &brmctx->ip4_own_query)) { 1571 + if (pmctx ? (own_query == &pmctx->ip4_own_query) : 1572 + (own_query == &brmctx->ip4_own_query)) { 1585 1573 other_query = &brmctx->ip4_other_query; 1586 1574 br_group.proto = htons(ETH_P_IP); 1587 1575 #if IS_ENABLED(CONFIG_IPV6) ··· 1593 1583 if (!other_query || timer_pending(&other_query->timer)) 1594 1584 return; 1595 1585 1596 - __br_multicast_send_query(br, port, NULL, NULL, &br_group, false, 0, 1597 - NULL); 1586 + __br_multicast_send_query(brmctx, pmctx, NULL, NULL, &br_group, false, 1587 + 0, NULL); 1598 1588 1599 1589 time = jiffies; 1600 1590 time += own_query->startup_sent < brmctx->multicast_startup_query_count ? ··· 1617 1607 if (query->startup_sent < br->multicast_ctx.multicast_startup_query_count) 1618 1608 query->startup_sent++; 1619 1609 1620 - br_multicast_send_query(pmctx->port->br, pmctx->port, query); 1610 + br_multicast_send_query(&br->multicast_ctx, pmctx, query); 1621 1611 1622 1612 out: 1623 1613 spin_unlock(&br->multicast_lock); ··· 1646 1636 struct net_bridge_port_group *pg = from_timer(pg, t, rexmit_timer); 1647 1637 struct bridge_mcast_other_query *other_query = NULL; 1648 1638 struct net_bridge *br = pg->key.port->br; 1649 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1639 + struct net_bridge_mcast_port *pmctx; 1640 + struct net_bridge_mcast *brmctx; 1650 1641 bool need_rexmit = false; 1651 1642 1652 1643 spin_lock(&br->multicast_lock); ··· 1656 1645 !br_opt_get(br, BROPT_MULTICAST_QUERIER)) 1657 1646 goto out; 1658 1647 1648 + brmctx = &br->multicast_ctx; 1649 + pmctx = &pg->key.port->multicast_ctx; 1659 1650 if (pg->key.addr.proto == htons(ETH_P_IP)) 1660 1651 other_query = &brmctx->ip4_other_query; 1661 1652 #if IS_ENABLED(CONFIG_IPV6) ··· 1670 1657 1671 1658 if (pg->grp_query_rexmit_cnt) { 1672 1659 pg->grp_query_rexmit_cnt--; 1673 - __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, 1660 + __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, 1674 1661 &pg->key.addr, false, 1, NULL); 1675 1662 } 1676 - __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, 1663 + __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, 1677 1664 &pg->key.addr, true, 0, &need_rexmit); 1678 1665 1679 1666 if (pg->grp_query_rexmit_cnt || need_rexmit) ··· 1769 1756 mod_timer(&query->timer, jiffies); 1770 1757 } 1771 1758 1772 - static void __br_multicast_enable_port(struct net_bridge_port *port) 1759 + static void __br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx) 1773 1760 { 1774 - struct net_bridge *br = port->br; 1761 + struct net_bridge *br = pmctx->port->br; 1762 + struct net_bridge_mcast *brmctx = &pmctx->port->br->multicast_ctx; 1775 1763 1776 1764 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) || !netif_running(br->dev)) 1777 1765 return; 1778 1766 1779 - br_multicast_enable(&port->multicast_ctx.ip4_own_query); 1767 + br_multicast_enable(&pmctx->ip4_own_query); 1780 1768 #if IS_ENABLED(CONFIG_IPV6) 1781 - br_multicast_enable(&port->multicast_ctx.ip6_own_query); 1769 + br_multicast_enable(&pmctx->ip6_own_query); 1782 1770 #endif 1783 - if (port->multicast_ctx.multicast_router == MDB_RTR_TYPE_PERM) { 1784 - br_ip4_multicast_add_router(br, port); 1785 - br_ip6_multicast_add_router(br, port); 1771 + if (pmctx->multicast_router == MDB_RTR_TYPE_PERM) { 1772 + br_ip4_multicast_add_router(brmctx, pmctx); 1773 + br_ip6_multicast_add_router(brmctx, pmctx); 1786 1774 } 1787 1775 } 1788 1776 ··· 1792 1778 struct net_bridge *br = port->br; 1793 1779 1794 1780 spin_lock(&br->multicast_lock); 1795 - __br_multicast_enable_port(port); 1781 + __br_multicast_enable_port_ctx(&port->multicast_ctx); 1796 1782 spin_unlock(&br->multicast_lock); 1797 1783 } 1798 1784 1799 1785 void br_multicast_disable_port(struct net_bridge_port *port) 1800 1786 { 1787 + struct net_bridge_mcast_port *pmctx = &port->multicast_ctx; 1801 1788 struct net_bridge *br = port->br; 1802 1789 struct net_bridge_port_group *pg; 1803 1790 struct hlist_node *n; ··· 1809 1794 if (!(pg->flags & MDB_PG_FLAGS_PERMANENT)) 1810 1795 br_multicast_find_del_pg(br, pg); 1811 1796 1812 - del |= br_ip4_multicast_rport_del(port); 1813 - del_timer(&port->multicast_ctx.ip4_mc_router_timer); 1814 - del_timer(&port->multicast_ctx.ip4_own_query.timer); 1815 - del |= br_ip6_multicast_rport_del(port); 1797 + del |= br_ip4_multicast_rport_del(pmctx); 1798 + del_timer(&pmctx->ip4_mc_router_timer); 1799 + del_timer(&pmctx->ip4_own_query.timer); 1800 + del |= br_ip6_multicast_rport_del(pmctx); 1816 1801 #if IS_ENABLED(CONFIG_IPV6) 1817 - del_timer(&port->multicast_ctx.ip6_mc_router_timer); 1818 - del_timer(&port->multicast_ctx.ip6_own_query.timer); 1802 + del_timer(&pmctx->ip6_mc_router_timer); 1803 + del_timer(&pmctx->ip6_own_query.timer); 1819 1804 #endif 1820 - br_multicast_rport_del_notify(port, del); 1805 + br_multicast_rport_del_notify(pmctx, del); 1821 1806 spin_unlock(&br->multicast_lock); 1822 1807 } 1823 1808 ··· 1843 1828 br_multicast_fwd_src_handle(src); 1844 1829 } 1845 1830 1846 - static void __grp_src_query_marked_and_rexmit(struct net_bridge_port_group *pg) 1831 + static void __grp_src_query_marked_and_rexmit(struct net_bridge_mcast *brmctx, 1832 + struct net_bridge_mcast_port *pmctx, 1833 + struct net_bridge_port_group *pg) 1847 1834 { 1848 1835 struct bridge_mcast_other_query *other_query = NULL; 1849 - struct net_bridge *br = pg->key.port->br; 1850 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1851 1836 u32 lmqc = brmctx->multicast_last_member_count; 1852 1837 unsigned long lmqt, lmi, now = jiffies; 1853 1838 struct net_bridge_group_src *ent; 1854 1839 1855 - if (!netif_running(br->dev) || 1856 - !br_opt_get(br, BROPT_MULTICAST_ENABLED)) 1840 + if (!netif_running(brmctx->br->dev) || 1841 + !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) 1857 1842 return; 1858 1843 1859 1844 if (pg->key.addr.proto == htons(ETH_P_IP)) ··· 1863 1848 other_query = &brmctx->ip6_other_query; 1864 1849 #endif 1865 1850 1866 - lmqt = now + br_multicast_lmqt(br); 1851 + lmqt = now + br_multicast_lmqt(brmctx); 1867 1852 hlist_for_each_entry(ent, &pg->src_list, node) { 1868 1853 if (ent->flags & BR_SGRP_F_SEND) { 1869 1854 ent->flags &= ~BR_SGRP_F_SEND; 1870 1855 if (ent->timer.expires > lmqt) { 1871 - if (br_opt_get(br, BROPT_MULTICAST_QUERIER) && 1856 + if (br_opt_get(brmctx->br, 1857 + BROPT_MULTICAST_QUERIER) && 1872 1858 other_query && 1873 1859 !timer_pending(&other_query->timer)) 1874 1860 ent->src_query_rexmit_cnt = lmqc; ··· 1878 1862 } 1879 1863 } 1880 1864 1881 - if (!br_opt_get(br, BROPT_MULTICAST_QUERIER) || 1865 + if (!br_opt_get(brmctx->br, BROPT_MULTICAST_QUERIER) || 1882 1866 !other_query || timer_pending(&other_query->timer)) 1883 1867 return; 1884 1868 1885 - __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, 1869 + __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, 1886 1870 &pg->key.addr, true, 1, NULL); 1887 1871 1888 1872 lmi = now + brmctx->multicast_last_member_interval; ··· 1891 1875 mod_timer(&pg->rexmit_timer, lmi); 1892 1876 } 1893 1877 1894 - static void __grp_send_query_and_rexmit(struct net_bridge_port_group *pg) 1878 + static void __grp_send_query_and_rexmit(struct net_bridge_mcast *brmctx, 1879 + struct net_bridge_mcast_port *pmctx, 1880 + struct net_bridge_port_group *pg) 1895 1881 { 1896 1882 struct bridge_mcast_other_query *other_query = NULL; 1897 - struct net_bridge *br = pg->key.port->br; 1898 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1899 1883 unsigned long now = jiffies, lmi; 1900 1884 1901 - if (!netif_running(br->dev) || 1902 - !br_opt_get(br, BROPT_MULTICAST_ENABLED)) 1885 + if (!netif_running(brmctx->br->dev) || 1886 + !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) 1903 1887 return; 1904 1888 1905 1889 if (pg->key.addr.proto == htons(ETH_P_IP)) ··· 1909 1893 other_query = &brmctx->ip6_other_query; 1910 1894 #endif 1911 1895 1912 - if (br_opt_get(br, BROPT_MULTICAST_QUERIER) && 1896 + if (br_opt_get(brmctx->br, BROPT_MULTICAST_QUERIER) && 1913 1897 other_query && !timer_pending(&other_query->timer)) { 1914 1898 lmi = now + brmctx->multicast_last_member_interval; 1915 1899 pg->grp_query_rexmit_cnt = brmctx->multicast_last_member_count - 1; 1916 - __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, 1900 + __br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr, 1917 1901 &pg->key.addr, false, 0, NULL); 1918 1902 if (!timer_pending(&pg->rexmit_timer) || 1919 1903 time_after(pg->rexmit_timer.expires, lmi)) ··· 1922 1906 1923 1907 if (pg->filter_mode == MCAST_EXCLUDE && 1924 1908 (!timer_pending(&pg->timer) || 1925 - time_after(pg->timer.expires, now + br_multicast_lmqt(br)))) 1926 - mod_timer(&pg->timer, now + br_multicast_lmqt(br)); 1909 + time_after(pg->timer.expires, now + br_multicast_lmqt(brmctx)))) 1910 + mod_timer(&pg->timer, now + br_multicast_lmqt(brmctx)); 1927 1911 } 1928 1912 1929 1913 /* State Msg type New state Actions ··· 1931 1915 * INCLUDE (A) ALLOW (B) INCLUDE (A+B) (B)=GMI 1932 1916 * EXCLUDE (X,Y) ALLOW (A) EXCLUDE (X+A,Y-A) (A)=GMI 1933 1917 */ 1934 - static bool br_multicast_isinc_allow(struct net_bridge_port_group *pg, void *h_addr, 1918 + static bool br_multicast_isinc_allow(const struct net_bridge_mcast *brmctx, 1919 + struct net_bridge_port_group *pg, void *h_addr, 1935 1920 void *srcs, u32 nsrcs, size_t addr_size, 1936 1921 int grec_type) 1937 1922 { 1938 - struct net_bridge *br = pg->key.port->br; 1939 1923 struct net_bridge_group_src *ent; 1940 1924 unsigned long now = jiffies; 1941 1925 bool changed = false; ··· 1954 1938 } 1955 1939 1956 1940 if (ent) 1957 - __grp_src_mod_timer(ent, now + br_multicast_gmi(br)); 1941 + __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx)); 1958 1942 } 1959 1943 1960 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 1944 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 1945 + grec_type)) 1961 1946 changed = true; 1962 1947 1963 1948 return changed; ··· 1969 1952 * Delete (A-B) 1970 1953 * Group Timer=GMI 1971 1954 */ 1972 - static void __grp_src_isexc_incl(struct net_bridge_port_group *pg, void *h_addr, 1955 + static void __grp_src_isexc_incl(const struct net_bridge_mcast *brmctx, 1956 + struct net_bridge_port_group *pg, void *h_addr, 1973 1957 void *srcs, u32 nsrcs, size_t addr_size, 1974 1958 int grec_type) 1975 1959 { ··· 1994 1976 br_multicast_fwd_src_handle(ent); 1995 1977 } 1996 1978 1997 - br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type); 1979 + br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 1980 + grec_type); 1998 1981 1999 1982 __grp_src_delete_marked(pg); 2000 1983 } ··· 2006 1987 * Delete (Y-A) 2007 1988 * Group Timer=GMI 2008 1989 */ 2009 - static bool __grp_src_isexc_excl(struct net_bridge_port_group *pg, void *h_addr, 1990 + static bool __grp_src_isexc_excl(const struct net_bridge_mcast *brmctx, 1991 + struct net_bridge_port_group *pg, void *h_addr, 2010 1992 void *srcs, u32 nsrcs, size_t addr_size, 2011 1993 int grec_type) 2012 1994 { 2013 - struct net_bridge *br = pg->key.port->br; 2014 1995 struct net_bridge_group_src *ent; 2015 1996 unsigned long now = jiffies; 2016 1997 bool changed = false; ··· 2031 2012 ent = br_multicast_new_group_src(pg, &src_ip); 2032 2013 if (ent) { 2033 2014 __grp_src_mod_timer(ent, 2034 - now + br_multicast_gmi(br)); 2015 + now + br_multicast_gmi(brmctx)); 2035 2016 changed = true; 2036 2017 } 2037 2018 } 2038 2019 } 2039 2020 2040 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 2021 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2022 + grec_type)) 2041 2023 changed = true; 2042 2024 2043 2025 if (__grp_src_delete_marked(pg)) ··· 2047 2027 return changed; 2048 2028 } 2049 2029 2050 - static bool br_multicast_isexc(struct net_bridge_port_group *pg, void *h_addr, 2030 + static bool br_multicast_isexc(const struct net_bridge_mcast *brmctx, 2031 + struct net_bridge_port_group *pg, void *h_addr, 2051 2032 void *srcs, u32 nsrcs, size_t addr_size, 2052 2033 int grec_type) 2053 2034 { 2054 - struct net_bridge *br = pg->key.port->br; 2055 2035 bool changed = false; 2056 2036 2057 2037 switch (pg->filter_mode) { 2058 2038 case MCAST_INCLUDE: 2059 - __grp_src_isexc_incl(pg, h_addr, srcs, nsrcs, addr_size, 2039 + __grp_src_isexc_incl(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2060 2040 grec_type); 2061 2041 br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE); 2062 2042 changed = true; 2063 2043 break; 2064 2044 case MCAST_EXCLUDE: 2065 - changed = __grp_src_isexc_excl(pg, h_addr, srcs, nsrcs, addr_size, 2066 - grec_type); 2045 + changed = __grp_src_isexc_excl(brmctx, pg, h_addr, srcs, nsrcs, 2046 + addr_size, grec_type); 2067 2047 break; 2068 2048 } 2069 2049 2070 2050 pg->filter_mode = MCAST_EXCLUDE; 2071 - mod_timer(&pg->timer, jiffies + br_multicast_gmi(br)); 2051 + mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx)); 2072 2052 2073 2053 return changed; 2074 2054 } ··· 2077 2057 * INCLUDE (A) TO_IN (B) INCLUDE (A+B) (B)=GMI 2078 2058 * Send Q(G,A-B) 2079 2059 */ 2080 - static bool __grp_src_toin_incl(struct net_bridge_port_group *pg, void *h_addr, 2060 + static bool __grp_src_toin_incl(struct net_bridge_mcast *brmctx, 2061 + struct net_bridge_mcast_port *pmctx, 2062 + struct net_bridge_port_group *pg, void *h_addr, 2081 2063 void *srcs, u32 nsrcs, size_t addr_size, 2082 2064 int grec_type) 2083 2065 { 2084 - struct net_bridge *br = pg->key.port->br; 2085 2066 u32 src_idx, to_send = pg->src_ents; 2086 2067 struct net_bridge_group_src *ent; 2087 2068 unsigned long now = jiffies; ··· 2106 2085 changed = true; 2107 2086 } 2108 2087 if (ent) 2109 - __grp_src_mod_timer(ent, now + br_multicast_gmi(br)); 2088 + __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx)); 2110 2089 } 2111 2090 2112 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 2091 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2092 + grec_type)) 2113 2093 changed = true; 2114 2094 2115 2095 if (to_send) 2116 - __grp_src_query_marked_and_rexmit(pg); 2096 + __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); 2117 2097 2118 2098 return changed; 2119 2099 } ··· 2124 2102 * Send Q(G,X-A) 2125 2103 * Send Q(G) 2126 2104 */ 2127 - static bool __grp_src_toin_excl(struct net_bridge_port_group *pg, void *h_addr, 2105 + static bool __grp_src_toin_excl(struct net_bridge_mcast *brmctx, 2106 + struct net_bridge_mcast_port *pmctx, 2107 + struct net_bridge_port_group *pg, void *h_addr, 2128 2108 void *srcs, u32 nsrcs, size_t addr_size, 2129 2109 int grec_type) 2130 2110 { 2131 - struct net_bridge *br = pg->key.port->br; 2132 2111 u32 src_idx, to_send = pg->src_ents; 2133 2112 struct net_bridge_group_src *ent; 2134 2113 unsigned long now = jiffies; ··· 2156 2133 changed = true; 2157 2134 } 2158 2135 if (ent) 2159 - __grp_src_mod_timer(ent, now + br_multicast_gmi(br)); 2136 + __grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx)); 2160 2137 } 2161 2138 2162 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 2139 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2140 + grec_type)) 2163 2141 changed = true; 2164 2142 2165 2143 if (to_send) 2166 - __grp_src_query_marked_and_rexmit(pg); 2144 + __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); 2167 2145 2168 - __grp_send_query_and_rexmit(pg); 2146 + __grp_send_query_and_rexmit(brmctx, pmctx, pg); 2169 2147 2170 2148 return changed; 2171 2149 } 2172 2150 2173 - static bool br_multicast_toin(struct net_bridge_port_group *pg, void *h_addr, 2151 + static bool br_multicast_toin(struct net_bridge_mcast *brmctx, 2152 + struct net_bridge_mcast_port *pmctx, 2153 + struct net_bridge_port_group *pg, void *h_addr, 2174 2154 void *srcs, u32 nsrcs, size_t addr_size, 2175 2155 int grec_type) 2176 2156 { ··· 2181 2155 2182 2156 switch (pg->filter_mode) { 2183 2157 case MCAST_INCLUDE: 2184 - changed = __grp_src_toin_incl(pg, h_addr, srcs, nsrcs, addr_size, 2185 - grec_type); 2158 + changed = __grp_src_toin_incl(brmctx, pmctx, pg, h_addr, srcs, 2159 + nsrcs, addr_size, grec_type); 2186 2160 break; 2187 2161 case MCAST_EXCLUDE: 2188 - changed = __grp_src_toin_excl(pg, h_addr, srcs, nsrcs, addr_size, 2189 - grec_type); 2162 + changed = __grp_src_toin_excl(brmctx, pmctx, pg, h_addr, srcs, 2163 + nsrcs, addr_size, grec_type); 2190 2164 break; 2191 2165 } 2192 2166 ··· 2208 2182 * Send Q(G,A*B) 2209 2183 * Group Timer=GMI 2210 2184 */ 2211 - static void __grp_src_toex_incl(struct net_bridge_port_group *pg, void *h_addr, 2185 + static void __grp_src_toex_incl(struct net_bridge_mcast *brmctx, 2186 + struct net_bridge_mcast_port *pmctx, 2187 + struct net_bridge_port_group *pg, void *h_addr, 2212 2188 void *srcs, u32 nsrcs, size_t addr_size, 2213 2189 int grec_type) 2214 2190 { ··· 2237 2209 br_multicast_fwd_src_handle(ent); 2238 2210 } 2239 2211 2240 - br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type); 2212 + br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2213 + grec_type); 2241 2214 2242 2215 __grp_src_delete_marked(pg); 2243 2216 if (to_send) 2244 - __grp_src_query_marked_and_rexmit(pg); 2217 + __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); 2245 2218 } 2246 2219 2247 2220 /* State Msg type New state Actions ··· 2252 2223 * Send Q(G,A-Y) 2253 2224 * Group Timer=GMI 2254 2225 */ 2255 - static bool __grp_src_toex_excl(struct net_bridge_port_group *pg, void *h_addr, 2226 + static bool __grp_src_toex_excl(struct net_bridge_mcast *brmctx, 2227 + struct net_bridge_mcast_port *pmctx, 2228 + struct net_bridge_port_group *pg, void *h_addr, 2256 2229 void *srcs, u32 nsrcs, size_t addr_size, 2257 2230 int grec_type) 2258 2231 { ··· 2286 2255 } 2287 2256 } 2288 2257 2289 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 2258 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2259 + grec_type)) 2290 2260 changed = true; 2291 2261 2292 2262 if (__grp_src_delete_marked(pg)) 2293 2263 changed = true; 2294 2264 if (to_send) 2295 - __grp_src_query_marked_and_rexmit(pg); 2265 + __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); 2296 2266 2297 2267 return changed; 2298 2268 } 2299 2269 2300 - static bool br_multicast_toex(struct net_bridge_port_group *pg, void *h_addr, 2270 + static bool br_multicast_toex(struct net_bridge_mcast *brmctx, 2271 + struct net_bridge_mcast_port *pmctx, 2272 + struct net_bridge_port_group *pg, void *h_addr, 2301 2273 void *srcs, u32 nsrcs, size_t addr_size, 2302 2274 int grec_type) 2303 2275 { 2304 - struct net_bridge *br = pg->key.port->br; 2305 2276 bool changed = false; 2306 2277 2307 2278 switch (pg->filter_mode) { 2308 2279 case MCAST_INCLUDE: 2309 - __grp_src_toex_incl(pg, h_addr, srcs, nsrcs, addr_size, 2310 - grec_type); 2280 + __grp_src_toex_incl(brmctx, pmctx, pg, h_addr, srcs, nsrcs, 2281 + addr_size, grec_type); 2311 2282 br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE); 2312 2283 changed = true; 2313 2284 break; 2314 2285 case MCAST_EXCLUDE: 2315 - changed = __grp_src_toex_excl(pg, h_addr, srcs, nsrcs, addr_size, 2316 - grec_type); 2286 + changed = __grp_src_toex_excl(brmctx, pmctx, pg, h_addr, srcs, 2287 + nsrcs, addr_size, grec_type); 2317 2288 break; 2318 2289 } 2319 2290 2320 2291 pg->filter_mode = MCAST_EXCLUDE; 2321 - mod_timer(&pg->timer, jiffies + br_multicast_gmi(br)); 2292 + mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx)); 2322 2293 2323 2294 return changed; 2324 2295 } ··· 2328 2295 /* State Msg type New state Actions 2329 2296 * INCLUDE (A) BLOCK (B) INCLUDE (A) Send Q(G,A*B) 2330 2297 */ 2331 - static bool __grp_src_block_incl(struct net_bridge_port_group *pg, void *h_addr, 2298 + static bool __grp_src_block_incl(struct net_bridge_mcast *brmctx, 2299 + struct net_bridge_mcast_port *pmctx, 2300 + struct net_bridge_port_group *pg, void *h_addr, 2332 2301 void *srcs, u32 nsrcs, size_t addr_size, int grec_type) 2333 2302 { 2334 2303 struct net_bridge_group_src *ent; ··· 2352 2317 } 2353 2318 } 2354 2319 2355 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 2320 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2321 + grec_type)) 2356 2322 changed = true; 2357 2323 2358 2324 if (to_send) 2359 - __grp_src_query_marked_and_rexmit(pg); 2325 + __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); 2360 2326 2361 2327 return changed; 2362 2328 } ··· 2366 2330 * EXCLUDE (X,Y) BLOCK (A) EXCLUDE (X+(A-Y),Y) (A-X-Y)=Group Timer 2367 2331 * Send Q(G,A-Y) 2368 2332 */ 2369 - static bool __grp_src_block_excl(struct net_bridge_port_group *pg, void *h_addr, 2333 + static bool __grp_src_block_excl(struct net_bridge_mcast *brmctx, 2334 + struct net_bridge_mcast_port *pmctx, 2335 + struct net_bridge_port_group *pg, void *h_addr, 2370 2336 void *srcs, u32 nsrcs, size_t addr_size, int grec_type) 2371 2337 { 2372 2338 struct net_bridge_group_src *ent; ··· 2397 2359 } 2398 2360 } 2399 2361 2400 - if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type)) 2362 + if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 2363 + grec_type)) 2401 2364 changed = true; 2402 2365 2403 2366 if (to_send) 2404 - __grp_src_query_marked_and_rexmit(pg); 2367 + __grp_src_query_marked_and_rexmit(brmctx, pmctx, pg); 2405 2368 2406 2369 return changed; 2407 2370 } 2408 2371 2409 - static bool br_multicast_block(struct net_bridge_port_group *pg, void *h_addr, 2372 + static bool br_multicast_block(struct net_bridge_mcast *brmctx, 2373 + struct net_bridge_mcast_port *pmctx, 2374 + struct net_bridge_port_group *pg, void *h_addr, 2410 2375 void *srcs, u32 nsrcs, size_t addr_size, int grec_type) 2411 2376 { 2412 2377 bool changed = false; 2413 2378 2414 2379 switch (pg->filter_mode) { 2415 2380 case MCAST_INCLUDE: 2416 - changed = __grp_src_block_incl(pg, h_addr, srcs, nsrcs, addr_size, 2417 - grec_type); 2381 + changed = __grp_src_block_incl(brmctx, pmctx, pg, h_addr, srcs, 2382 + nsrcs, addr_size, grec_type); 2418 2383 break; 2419 2384 case MCAST_EXCLUDE: 2420 - changed = __grp_src_block_excl(pg, h_addr, srcs, nsrcs, addr_size, 2421 - grec_type); 2385 + changed = __grp_src_block_excl(brmctx, pmctx, pg, h_addr, srcs, 2386 + nsrcs, addr_size, grec_type); 2422 2387 break; 2423 2388 } 2424 2389 ··· 2456 2415 return NULL; 2457 2416 } 2458 2417 2459 - static int br_ip4_multicast_igmp3_report(struct net_bridge *br, 2460 - struct net_bridge_port *port, 2418 + static int br_ip4_multicast_igmp3_report(struct net_bridge_mcast *brmctx, 2419 + struct net_bridge_mcast_port *pmctx, 2461 2420 struct sk_buff *skb, 2462 2421 u16 vid) 2463 2422 { 2464 - bool igmpv2 = br->multicast_ctx.multicast_igmp_version == 2; 2423 + bool igmpv2 = brmctx->multicast_igmp_version == 2; 2465 2424 struct net_bridge_mdb_entry *mdst; 2466 2425 struct net_bridge_port_group *pg; 2467 2426 const unsigned char *src; ··· 2508 2467 if (nsrcs == 0 && 2509 2468 (type == IGMPV3_CHANGE_TO_INCLUDE || 2510 2469 type == IGMPV3_MODE_IS_INCLUDE)) { 2511 - if (!port || igmpv2) { 2512 - br_ip4_multicast_leave_group(br, port, group, vid, src); 2470 + if (!pmctx || igmpv2) { 2471 + br_ip4_multicast_leave_group(brmctx, pmctx, 2472 + group, vid, src); 2513 2473 continue; 2514 2474 } 2515 2475 } else { 2516 - err = br_ip4_multicast_add_group(br, port, group, vid, 2517 - src, igmpv2); 2476 + err = br_ip4_multicast_add_group(brmctx, pmctx, group, 2477 + vid, src, igmpv2); 2518 2478 if (err) 2519 2479 break; 2520 2480 } 2521 2481 2522 - if (!port || igmpv2) 2482 + if (!pmctx || igmpv2) 2523 2483 continue; 2524 2484 2525 - spin_lock_bh(&br->multicast_lock); 2526 - mdst = br_mdb_ip4_get(br, group, vid); 2485 + spin_lock_bh(&brmctx->br->multicast_lock); 2486 + mdst = br_mdb_ip4_get(brmctx->br, group, vid); 2527 2487 if (!mdst) 2528 2488 goto unlock_continue; 2529 - pg = br_multicast_find_port(mdst, port, src); 2489 + pg = br_multicast_find_port(mdst, pmctx->port, src); 2530 2490 if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT)) 2531 2491 goto unlock_continue; 2532 2492 /* reload grec and host addr */ ··· 2535 2493 h_addr = &ip_hdr(skb)->saddr; 2536 2494 switch (type) { 2537 2495 case IGMPV3_ALLOW_NEW_SOURCES: 2538 - changed = br_multicast_isinc_allow(pg, h_addr, grec->grec_src, 2496 + changed = br_multicast_isinc_allow(brmctx, pg, h_addr, 2497 + grec->grec_src, 2539 2498 nsrcs, sizeof(__be32), type); 2540 2499 break; 2541 2500 case IGMPV3_MODE_IS_INCLUDE: 2542 - changed = br_multicast_isinc_allow(pg, h_addr, grec->grec_src, 2501 + changed = br_multicast_isinc_allow(brmctx, pg, h_addr, 2502 + grec->grec_src, 2543 2503 nsrcs, sizeof(__be32), type); 2544 2504 break; 2545 2505 case IGMPV3_MODE_IS_EXCLUDE: 2546 - changed = br_multicast_isexc(pg, h_addr, grec->grec_src, 2506 + changed = br_multicast_isexc(brmctx, pg, h_addr, 2507 + grec->grec_src, 2547 2508 nsrcs, sizeof(__be32), type); 2548 2509 break; 2549 2510 case IGMPV3_CHANGE_TO_INCLUDE: 2550 - changed = br_multicast_toin(pg, h_addr, grec->grec_src, 2511 + changed = br_multicast_toin(brmctx, pmctx, pg, h_addr, 2512 + grec->grec_src, 2551 2513 nsrcs, sizeof(__be32), type); 2552 2514 break; 2553 2515 case IGMPV3_CHANGE_TO_EXCLUDE: 2554 - changed = br_multicast_toex(pg, h_addr, grec->grec_src, 2516 + changed = br_multicast_toex(brmctx, pmctx, pg, h_addr, 2517 + grec->grec_src, 2555 2518 nsrcs, sizeof(__be32), type); 2556 2519 break; 2557 2520 case IGMPV3_BLOCK_OLD_SOURCES: 2558 - changed = br_multicast_block(pg, h_addr, grec->grec_src, 2521 + changed = br_multicast_block(brmctx, pmctx, pg, h_addr, 2522 + grec->grec_src, 2559 2523 nsrcs, sizeof(__be32), type); 2560 2524 break; 2561 2525 } 2562 2526 if (changed) 2563 - br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB); 2527 + br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB); 2564 2528 unlock_continue: 2565 - spin_unlock_bh(&br->multicast_lock); 2529 + spin_unlock_bh(&brmctx->br->multicast_lock); 2566 2530 } 2567 2531 2568 2532 return err; 2569 2533 } 2570 2534 2571 2535 #if IS_ENABLED(CONFIG_IPV6) 2572 - static int br_ip6_multicast_mld2_report(struct net_bridge *br, 2573 - struct net_bridge_port *port, 2536 + static int br_ip6_multicast_mld2_report(struct net_bridge_mcast *brmctx, 2537 + struct net_bridge_mcast_port *pmctx, 2574 2538 struct sk_buff *skb, 2575 2539 u16 vid) 2576 2540 { 2577 - bool mldv1 = br->multicast_ctx.multicast_mld_version == 1; 2541 + bool mldv1 = brmctx->multicast_mld_version == 1; 2578 2542 struct net_bridge_mdb_entry *mdst; 2579 2543 struct net_bridge_port_group *pg; 2580 2544 unsigned int nsrcs_offset; ··· 2641 2593 if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE || 2642 2594 grec->grec_type == MLD2_MODE_IS_INCLUDE) && 2643 2595 nsrcs == 0) { 2644 - if (!port || mldv1) { 2645 - br_ip6_multicast_leave_group(br, port, 2596 + if (!pmctx || mldv1) { 2597 + br_ip6_multicast_leave_group(brmctx, pmctx, 2646 2598 &grec->grec_mca, 2647 2599 vid, src); 2648 2600 continue; 2649 2601 } 2650 2602 } else { 2651 - err = br_ip6_multicast_add_group(br, port, 2603 + err = br_ip6_multicast_add_group(brmctx, pmctx, 2652 2604 &grec->grec_mca, vid, 2653 2605 src, mldv1); 2654 2606 if (err) 2655 2607 break; 2656 2608 } 2657 2609 2658 - if (!port || mldv1) 2610 + if (!pmctx || mldv1) 2659 2611 continue; 2660 2612 2661 - spin_lock_bh(&br->multicast_lock); 2662 - mdst = br_mdb_ip6_get(br, &grec->grec_mca, vid); 2613 + spin_lock_bh(&brmctx->br->multicast_lock); 2614 + mdst = br_mdb_ip6_get(brmctx->br, &grec->grec_mca, vid); 2663 2615 if (!mdst) 2664 2616 goto unlock_continue; 2665 - pg = br_multicast_find_port(mdst, port, src); 2617 + pg = br_multicast_find_port(mdst, pmctx->port, src); 2666 2618 if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT)) 2667 2619 goto unlock_continue; 2668 2620 h_addr = &ipv6_hdr(skb)->saddr; 2669 2621 switch (grec->grec_type) { 2670 2622 case MLD2_ALLOW_NEW_SOURCES: 2671 - changed = br_multicast_isinc_allow(pg, h_addr, 2623 + changed = br_multicast_isinc_allow(brmctx, pg, h_addr, 2672 2624 grec->grec_src, nsrcs, 2673 2625 sizeof(struct in6_addr), 2674 2626 grec->grec_type); 2675 2627 break; 2676 2628 case MLD2_MODE_IS_INCLUDE: 2677 - changed = br_multicast_isinc_allow(pg, h_addr, 2629 + changed = br_multicast_isinc_allow(brmctx, pg, h_addr, 2678 2630 grec->grec_src, nsrcs, 2679 2631 sizeof(struct in6_addr), 2680 2632 grec->grec_type); 2681 2633 break; 2682 2634 case MLD2_MODE_IS_EXCLUDE: 2683 - changed = br_multicast_isexc(pg, h_addr, 2635 + changed = br_multicast_isexc(brmctx, pg, h_addr, 2684 2636 grec->grec_src, nsrcs, 2685 2637 sizeof(struct in6_addr), 2686 2638 grec->grec_type); 2687 2639 break; 2688 2640 case MLD2_CHANGE_TO_INCLUDE: 2689 - changed = br_multicast_toin(pg, h_addr, 2641 + changed = br_multicast_toin(brmctx, pmctx, pg, h_addr, 2690 2642 grec->grec_src, nsrcs, 2691 2643 sizeof(struct in6_addr), 2692 2644 grec->grec_type); 2693 2645 break; 2694 2646 case MLD2_CHANGE_TO_EXCLUDE: 2695 - changed = br_multicast_toex(pg, h_addr, 2647 + changed = br_multicast_toex(brmctx, pmctx, pg, h_addr, 2696 2648 grec->grec_src, nsrcs, 2697 2649 sizeof(struct in6_addr), 2698 2650 grec->grec_type); 2699 2651 break; 2700 2652 case MLD2_BLOCK_OLD_SOURCES: 2701 - changed = br_multicast_block(pg, h_addr, 2653 + changed = br_multicast_block(brmctx, pmctx, pg, h_addr, 2702 2654 grec->grec_src, nsrcs, 2703 2655 sizeof(struct in6_addr), 2704 2656 grec->grec_type); 2705 2657 break; 2706 2658 } 2707 2659 if (changed) 2708 - br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB); 2660 + br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB); 2709 2661 unlock_continue: 2710 - spin_unlock_bh(&br->multicast_lock); 2662 + spin_unlock_bh(&brmctx->br->multicast_lock); 2711 2663 } 2712 2664 2713 2665 return err; 2714 2666 } 2715 2667 #endif 2716 2668 2717 - static bool br_ip4_multicast_select_querier(struct net_bridge *br, 2669 + static bool br_ip4_multicast_select_querier(struct net_bridge_mcast *brmctx, 2718 2670 struct net_bridge_port *port, 2719 2671 __be32 saddr) 2720 2672 { 2721 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2722 - 2723 2673 if (!timer_pending(&brmctx->ip4_own_query.timer) && 2724 2674 !timer_pending(&brmctx->ip4_other_query.timer)) 2725 2675 goto update; ··· 2740 2694 } 2741 2695 2742 2696 #if IS_ENABLED(CONFIG_IPV6) 2743 - static bool br_ip6_multicast_select_querier(struct net_bridge *br, 2697 + static bool br_ip6_multicast_select_querier(struct net_bridge_mcast *brmctx, 2744 2698 struct net_bridge_port *port, 2745 2699 struct in6_addr *saddr) 2746 2700 { 2747 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2748 - 2749 2701 if (!timer_pending(&brmctx->ip6_own_query.timer) && 2750 2702 !timer_pending(&brmctx->ip6_other_query.timer)) 2751 2703 goto update; ··· 2764 2720 #endif 2765 2721 2766 2722 static void 2767 - br_multicast_update_query_timer(struct net_bridge *br, 2723 + br_multicast_update_query_timer(struct net_bridge_mcast *brmctx, 2768 2724 struct bridge_mcast_other_query *query, 2769 2725 unsigned long max_delay) 2770 2726 { 2771 2727 if (!timer_pending(&query->timer)) 2772 2728 query->delay_time = jiffies + max_delay; 2773 2729 2774 - mod_timer(&query->timer, jiffies + 2775 - br->multicast_ctx.multicast_querier_interval); 2730 + mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval); 2776 2731 } 2777 2732 2778 2733 static void br_port_mc_router_state_change(struct net_bridge_port *p, ··· 2828 2785 return slot; 2829 2786 } 2830 2787 2831 - static bool br_multicast_no_router_otherpf(struct net_bridge_port *port, 2788 + static bool br_multicast_no_router_otherpf(struct net_bridge_mcast_port *pmctx, 2832 2789 struct hlist_node *rnode) 2833 2790 { 2834 2791 #if IS_ENABLED(CONFIG_IPV6) 2835 - if (rnode != &port->multicast_ctx.ip6_rlist) 2836 - return hlist_unhashed(&port->multicast_ctx.ip6_rlist); 2792 + if (rnode != &pmctx->ip6_rlist) 2793 + return hlist_unhashed(&pmctx->ip6_rlist); 2837 2794 else 2838 - return hlist_unhashed(&port->multicast_ctx.ip4_rlist); 2795 + return hlist_unhashed(&pmctx->ip4_rlist); 2839 2796 #else 2840 2797 return true; 2841 2798 #endif ··· 2846 2803 * and locked by br->multicast_lock and RCU 2847 2804 */ 2848 2805 static void br_multicast_add_router(struct net_bridge_mcast *brmctx, 2849 - struct net_bridge_port *port, 2806 + struct net_bridge_mcast_port *pmctx, 2850 2807 struct hlist_node *rlist, 2851 2808 struct hlist_head *mc_router_list) 2852 2809 { ··· 2855 2812 if (!hlist_unhashed(rlist)) 2856 2813 return; 2857 2814 2858 - slot = br_multicast_get_rport_slot(brmctx, port, mc_router_list); 2815 + slot = br_multicast_get_rport_slot(brmctx, pmctx->port, mc_router_list); 2859 2816 2860 2817 if (slot) 2861 2818 hlist_add_behind_rcu(rlist, slot); ··· 2866 2823 * switched from no IPv4/IPv6 multicast router to a new 2867 2824 * IPv4 or IPv6 multicast router. 2868 2825 */ 2869 - if (br_multicast_no_router_otherpf(port, rlist)) { 2870 - br_rtr_notify(port->br->dev, port, RTM_NEWMDB); 2871 - br_port_mc_router_state_change(port, true); 2826 + if (br_multicast_no_router_otherpf(pmctx, rlist)) { 2827 + br_rtr_notify(pmctx->port->br->dev, pmctx->port, RTM_NEWMDB); 2828 + br_port_mc_router_state_change(pmctx->port, true); 2872 2829 } 2873 2830 } 2874 2831 ··· 2876 2833 * list is maintained ordered by pointer value 2877 2834 * and locked by br->multicast_lock and RCU 2878 2835 */ 2879 - static void br_ip4_multicast_add_router(struct net_bridge *br, 2880 - struct net_bridge_port *port) 2836 + static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx, 2837 + struct net_bridge_mcast_port *pmctx) 2881 2838 { 2882 - br_multicast_add_router(&br->multicast_ctx, port, 2883 - &port->multicast_ctx.ip4_rlist, 2884 - &br->multicast_ctx.ip4_mc_router_list); 2839 + br_multicast_add_router(brmctx, pmctx, &pmctx->ip4_rlist, 2840 + &brmctx->ip4_mc_router_list); 2885 2841 } 2886 2842 2887 2843 /* Add port to router_list 2888 2844 * list is maintained ordered by pointer value 2889 2845 * and locked by br->multicast_lock and RCU 2890 2846 */ 2891 - static void br_ip6_multicast_add_router(struct net_bridge *br, 2892 - struct net_bridge_port *port) 2847 + static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx, 2848 + struct net_bridge_mcast_port *pmctx) 2893 2849 { 2894 2850 #if IS_ENABLED(CONFIG_IPV6) 2895 - br_multicast_add_router(&br->multicast_ctx, port, 2896 - &port->multicast_ctx.ip6_rlist, 2897 - &br->multicast_ctx.ip6_mc_router_list); 2851 + br_multicast_add_router(brmctx, pmctx, &pmctx->ip6_rlist, 2852 + &brmctx->ip6_mc_router_list); 2898 2853 #endif 2899 2854 } 2900 2855 2901 - static void br_multicast_mark_router(struct net_bridge *br, 2902 - struct net_bridge_port *port, 2856 + static void br_multicast_mark_router(struct net_bridge_mcast *brmctx, 2857 + struct net_bridge_mcast_port *pmctx, 2903 2858 struct timer_list *timer, 2904 2859 struct hlist_node *rlist, 2905 2860 struct hlist_head *mc_router_list) 2906 2861 { 2907 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2908 2862 unsigned long now = jiffies; 2909 2863 2910 - if (!port) { 2864 + if (!pmctx) { 2911 2865 if (brmctx->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { 2912 2866 if (!br_ip4_multicast_is_router(brmctx) && 2913 2867 !br_ip6_multicast_is_router(brmctx)) 2914 - br_mc_router_state_change(br, true); 2868 + br_mc_router_state_change(brmctx->br, true); 2915 2869 mod_timer(timer, now + brmctx->multicast_querier_interval); 2916 2870 } 2917 2871 return; 2918 2872 } 2919 2873 2920 - if (port->multicast_ctx.multicast_router == MDB_RTR_TYPE_DISABLED || 2921 - port->multicast_ctx.multicast_router == MDB_RTR_TYPE_PERM) 2874 + if (pmctx->multicast_router == MDB_RTR_TYPE_DISABLED || 2875 + pmctx->multicast_router == MDB_RTR_TYPE_PERM) 2922 2876 return; 2923 2877 2924 - br_multicast_add_router(brmctx, port, rlist, mc_router_list); 2878 + br_multicast_add_router(brmctx, pmctx, rlist, mc_router_list); 2925 2879 mod_timer(timer, now + brmctx->multicast_querier_interval); 2926 2880 } 2927 2881 2928 - static void br_ip4_multicast_mark_router(struct net_bridge *br, 2929 - struct net_bridge_port *port) 2882 + static void br_ip4_multicast_mark_router(struct net_bridge_mcast *brmctx, 2883 + struct net_bridge_mcast_port *pmctx) 2930 2884 { 2931 - struct timer_list *timer = &br->multicast_ctx.ip4_mc_router_timer; 2885 + struct timer_list *timer = &brmctx->ip4_mc_router_timer; 2932 2886 struct hlist_node *rlist = NULL; 2933 2887 2934 - if (port) { 2935 - timer = &port->multicast_ctx.ip4_mc_router_timer; 2936 - rlist = &port->multicast_ctx.ip4_rlist; 2888 + if (pmctx) { 2889 + timer = &pmctx->ip4_mc_router_timer; 2890 + rlist = &pmctx->ip4_rlist; 2937 2891 } 2938 2892 2939 - br_multicast_mark_router(br, port, timer, rlist, 2940 - &br->multicast_ctx.ip4_mc_router_list); 2893 + br_multicast_mark_router(brmctx, pmctx, timer, rlist, 2894 + &brmctx->ip4_mc_router_list); 2941 2895 } 2942 2896 2943 - static void br_ip6_multicast_mark_router(struct net_bridge *br, 2944 - struct net_bridge_port *port) 2897 + static void br_ip6_multicast_mark_router(struct net_bridge_mcast *brmctx, 2898 + struct net_bridge_mcast_port *pmctx) 2945 2899 { 2946 2900 #if IS_ENABLED(CONFIG_IPV6) 2947 - struct timer_list *timer = &br->multicast_ctx.ip6_mc_router_timer; 2901 + struct timer_list *timer = &brmctx->ip6_mc_router_timer; 2948 2902 struct hlist_node *rlist = NULL; 2949 2903 2950 - if (port) { 2951 - timer = &port->multicast_ctx.ip6_mc_router_timer; 2952 - rlist = &port->multicast_ctx.ip6_rlist; 2904 + if (pmctx) { 2905 + timer = &pmctx->ip6_mc_router_timer; 2906 + rlist = &pmctx->ip6_rlist; 2953 2907 } 2954 2908 2955 - br_multicast_mark_router(br, port, timer, rlist, 2956 - &br->multicast_ctx.ip6_mc_router_list); 2909 + br_multicast_mark_router(brmctx, pmctx, timer, rlist, 2910 + &brmctx->ip6_mc_router_list); 2957 2911 #endif 2958 2912 } 2959 2913 2960 2914 static void 2961 - br_ip4_multicast_query_received(struct net_bridge *br, 2962 - struct net_bridge_port *port, 2915 + br_ip4_multicast_query_received(struct net_bridge_mcast *brmctx, 2916 + struct net_bridge_mcast_port *pmctx, 2963 2917 struct bridge_mcast_other_query *query, 2964 2918 struct br_ip *saddr, 2965 2919 unsigned long max_delay) 2966 2920 { 2967 - if (!br_ip4_multicast_select_querier(br, port, saddr->src.ip4)) 2921 + if (!br_ip4_multicast_select_querier(brmctx, pmctx->port, saddr->src.ip4)) 2968 2922 return; 2969 2923 2970 - br_multicast_update_query_timer(br, query, max_delay); 2971 - br_ip4_multicast_mark_router(br, port); 2924 + br_multicast_update_query_timer(brmctx, query, max_delay); 2925 + br_ip4_multicast_mark_router(brmctx, pmctx); 2972 2926 } 2973 2927 2974 2928 #if IS_ENABLED(CONFIG_IPV6) 2975 2929 static void 2976 - br_ip6_multicast_query_received(struct net_bridge *br, 2977 - struct net_bridge_port *port, 2930 + br_ip6_multicast_query_received(struct net_bridge_mcast *brmctx, 2931 + struct net_bridge_mcast_port *pmctx, 2978 2932 struct bridge_mcast_other_query *query, 2979 2933 struct br_ip *saddr, 2980 2934 unsigned long max_delay) 2981 2935 { 2982 - if (!br_ip6_multicast_select_querier(br, port, &saddr->src.ip6)) 2936 + if (!br_ip6_multicast_select_querier(brmctx, pmctx->port, &saddr->src.ip6)) 2983 2937 return; 2984 2938 2985 - br_multicast_update_query_timer(br, query, max_delay); 2986 - br_ip6_multicast_mark_router(br, port); 2939 + br_multicast_update_query_timer(brmctx, query, max_delay); 2940 + br_ip6_multicast_mark_router(brmctx, pmctx); 2987 2941 } 2988 2942 #endif 2989 2943 2990 - static void br_ip4_multicast_query(struct net_bridge *br, 2991 - struct net_bridge_port *port, 2944 + static void br_ip4_multicast_query(struct net_bridge_mcast *brmctx, 2945 + struct net_bridge_mcast_port *pmctx, 2992 2946 struct sk_buff *skb, 2993 2947 u16 vid) 2994 2948 { 2995 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2996 2949 unsigned int transport_len = ip_transport_len(skb); 2997 2950 const struct iphdr *iph = ip_hdr(skb); 2998 2951 struct igmphdr *ih = igmp_hdr(skb); ··· 3001 2962 unsigned long now = jiffies; 3002 2963 __be32 group; 3003 2964 3004 - spin_lock(&br->multicast_lock); 3005 - if (!netif_running(br->dev) || 3006 - (port && port->state == BR_STATE_DISABLED)) 2965 + spin_lock(&brmctx->br->multicast_lock); 2966 + if (!netif_running(brmctx->br->dev) || 2967 + (pmctx && pmctx->port->state == BR_STATE_DISABLED)) 3007 2968 goto out; 3008 2969 3009 2970 group = ih->group; ··· 3032 2993 saddr.proto = htons(ETH_P_IP); 3033 2994 saddr.src.ip4 = iph->saddr; 3034 2995 3035 - br_ip4_multicast_query_received(br, port, 2996 + br_ip4_multicast_query_received(brmctx, pmctx, 3036 2997 &brmctx->ip4_other_query, 3037 2998 &saddr, max_delay); 3038 2999 goto out; 3039 3000 } 3040 3001 3041 - mp = br_mdb_ip4_get(br, group, vid); 3002 + mp = br_mdb_ip4_get(brmctx->br, group, vid); 3042 3003 if (!mp) 3043 3004 goto out; 3044 3005 ··· 3051 3012 mod_timer(&mp->timer, now + max_delay); 3052 3013 3053 3014 for (pp = &mp->ports; 3054 - (p = mlock_dereference(*pp, br)) != NULL; 3015 + (p = mlock_dereference(*pp, brmctx->br)) != NULL; 3055 3016 pp = &p->next) { 3056 3017 if (timer_pending(&p->timer) ? 3057 3018 time_after(p->timer.expires, now + max_delay) : ··· 3062 3023 } 3063 3024 3064 3025 out: 3065 - spin_unlock(&br->multicast_lock); 3026 + spin_unlock(&brmctx->br->multicast_lock); 3066 3027 } 3067 3028 3068 3029 #if IS_ENABLED(CONFIG_IPV6) 3069 - static int br_ip6_multicast_query(struct net_bridge *br, 3070 - struct net_bridge_port *port, 3030 + static int br_ip6_multicast_query(struct net_bridge_mcast *brmctx, 3031 + struct net_bridge_mcast_port *pmctx, 3071 3032 struct sk_buff *skb, 3072 3033 u16 vid) 3073 3034 { 3074 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 3075 3035 unsigned int transport_len = ipv6_transport_len(skb); 3076 3036 struct mld_msg *mld; 3077 3037 struct net_bridge_mdb_entry *mp; ··· 3085 3047 bool is_general_query; 3086 3048 int err = 0; 3087 3049 3088 - spin_lock(&br->multicast_lock); 3089 - if (!netif_running(br->dev) || 3090 - (port && port->state == BR_STATE_DISABLED)) 3050 + spin_lock(&brmctx->br->multicast_lock); 3051 + if (!netif_running(brmctx->br->dev) || 3052 + (pmctx && pmctx->port->state == BR_STATE_DISABLED)) 3091 3053 goto out; 3092 3054 3093 3055 if (transport_len == sizeof(*mld)) { ··· 3121 3083 saddr.proto = htons(ETH_P_IPV6); 3122 3084 saddr.src.ip6 = ipv6_hdr(skb)->saddr; 3123 3085 3124 - br_ip6_multicast_query_received(br, port, 3086 + br_ip6_multicast_query_received(brmctx, pmctx, 3125 3087 &brmctx->ip6_other_query, 3126 3088 &saddr, max_delay); 3127 3089 goto out; ··· 3129 3091 goto out; 3130 3092 } 3131 3093 3132 - mp = br_mdb_ip6_get(br, group, vid); 3094 + mp = br_mdb_ip6_get(brmctx->br, group, vid); 3133 3095 if (!mp) 3134 3096 goto out; 3135 3097 ··· 3141 3103 mod_timer(&mp->timer, now + max_delay); 3142 3104 3143 3105 for (pp = &mp->ports; 3144 - (p = mlock_dereference(*pp, br)) != NULL; 3106 + (p = mlock_dereference(*pp, brmctx->br)) != NULL; 3145 3107 pp = &p->next) { 3146 3108 if (timer_pending(&p->timer) ? 3147 3109 time_after(p->timer.expires, now + max_delay) : ··· 3152 3114 } 3153 3115 3154 3116 out: 3155 - spin_unlock(&br->multicast_lock); 3117 + spin_unlock(&brmctx->br->multicast_lock); 3156 3118 return err; 3157 3119 } 3158 3120 #endif 3159 3121 3160 3122 static void 3161 - br_multicast_leave_group(struct net_bridge *br, 3162 - struct net_bridge_port *port, 3123 + br_multicast_leave_group(struct net_bridge_mcast *brmctx, 3124 + struct net_bridge_mcast_port *pmctx, 3163 3125 struct br_ip *group, 3164 3126 struct bridge_mcast_other_query *other_query, 3165 3127 struct bridge_mcast_own_query *own_query, 3166 3128 const unsigned char *src) 3167 3129 { 3168 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 3169 3130 struct net_bridge_mdb_entry *mp; 3170 3131 struct net_bridge_port_group *p; 3171 3132 unsigned long now; 3172 3133 unsigned long time; 3173 3134 3174 - spin_lock(&br->multicast_lock); 3175 - if (!netif_running(br->dev) || 3176 - (port && port->state == BR_STATE_DISABLED)) 3135 + spin_lock(&brmctx->br->multicast_lock); 3136 + if (!netif_running(brmctx->br->dev) || 3137 + (pmctx && pmctx->port->state == BR_STATE_DISABLED)) 3177 3138 goto out; 3178 3139 3179 - mp = br_mdb_ip_get(br, group); 3140 + mp = br_mdb_ip_get(brmctx->br, group); 3180 3141 if (!mp) 3181 3142 goto out; 3182 3143 3183 - if (port && (port->flags & BR_MULTICAST_FAST_LEAVE)) { 3144 + if (pmctx && (pmctx->port->flags & BR_MULTICAST_FAST_LEAVE)) { 3184 3145 struct net_bridge_port_group __rcu **pp; 3185 3146 3186 3147 for (pp = &mp->ports; 3187 - (p = mlock_dereference(*pp, br)) != NULL; 3148 + (p = mlock_dereference(*pp, brmctx->br)) != NULL; 3188 3149 pp = &p->next) { 3189 - if (!br_port_group_equal(p, port, src)) 3150 + if (!br_port_group_equal(p, pmctx->port, src)) 3190 3151 continue; 3191 3152 3192 3153 if (p->flags & MDB_PG_FLAGS_PERMANENT) ··· 3200 3163 if (timer_pending(&other_query->timer)) 3201 3164 goto out; 3202 3165 3203 - if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) { 3204 - __br_multicast_send_query(br, port, NULL, NULL, &mp->addr, 3166 + if (br_opt_get(brmctx->br, BROPT_MULTICAST_QUERIER)) { 3167 + __br_multicast_send_query(brmctx, pmctx, NULL, NULL, &mp->addr, 3205 3168 false, 0, NULL); 3206 3169 3207 3170 time = jiffies + brmctx->multicast_last_member_count * ··· 3209 3172 3210 3173 mod_timer(&own_query->timer, time); 3211 3174 3212 - for (p = mlock_dereference(mp->ports, br); 3175 + for (p = mlock_dereference(mp->ports, brmctx->br); 3213 3176 p != NULL; 3214 - p = mlock_dereference(p->next, br)) { 3215 - if (!br_port_group_equal(p, port, src)) 3177 + p = mlock_dereference(p->next, brmctx->br)) { 3178 + if (!br_port_group_equal(p, pmctx->port, src)) 3216 3179 continue; 3217 3180 3218 3181 if (!hlist_unhashed(&p->mglist) && ··· 3230 3193 time = now + brmctx->multicast_last_member_count * 3231 3194 brmctx->multicast_last_member_interval; 3232 3195 3233 - if (!port) { 3196 + if (!pmctx) { 3234 3197 if (mp->host_joined && 3235 3198 (timer_pending(&mp->timer) ? 3236 3199 time_after(mp->timer.expires, time) : ··· 3241 3204 goto out; 3242 3205 } 3243 3206 3244 - for (p = mlock_dereference(mp->ports, br); 3207 + for (p = mlock_dereference(mp->ports, brmctx->br); 3245 3208 p != NULL; 3246 - p = mlock_dereference(p->next, br)) { 3247 - if (p->key.port != port) 3209 + p = mlock_dereference(p->next, brmctx->br)) { 3210 + if (p->key.port != pmctx->port) 3248 3211 continue; 3249 3212 3250 3213 if (!hlist_unhashed(&p->mglist) && ··· 3257 3220 break; 3258 3221 } 3259 3222 out: 3260 - spin_unlock(&br->multicast_lock); 3223 + spin_unlock(&brmctx->br->multicast_lock); 3261 3224 } 3262 3225 3263 - static void br_ip4_multicast_leave_group(struct net_bridge *br, 3264 - struct net_bridge_port *port, 3226 + static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx, 3227 + struct net_bridge_mcast_port *pmctx, 3265 3228 __be32 group, 3266 3229 __u16 vid, 3267 3230 const unsigned char *src) ··· 3272 3235 if (ipv4_is_local_multicast(group)) 3273 3236 return; 3274 3237 3275 - own_query = port ? &port->multicast_ctx.ip4_own_query : 3276 - &br->multicast_ctx.ip4_own_query; 3238 + own_query = pmctx ? &pmctx->ip4_own_query : &brmctx->ip4_own_query; 3277 3239 3278 3240 memset(&br_group, 0, sizeof(br_group)); 3279 3241 br_group.dst.ip4 = group; 3280 3242 br_group.proto = htons(ETH_P_IP); 3281 3243 br_group.vid = vid; 3282 3244 3283 - br_multicast_leave_group(br, port, &br_group, 3284 - &br->multicast_ctx.ip4_other_query, 3245 + br_multicast_leave_group(brmctx, pmctx, &br_group, 3246 + &brmctx->ip4_other_query, 3285 3247 own_query, src); 3286 3248 } 3287 3249 3288 3250 #if IS_ENABLED(CONFIG_IPV6) 3289 - static void br_ip6_multicast_leave_group(struct net_bridge *br, 3290 - struct net_bridge_port *port, 3251 + static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx, 3252 + struct net_bridge_mcast_port *pmctx, 3291 3253 const struct in6_addr *group, 3292 3254 __u16 vid, 3293 3255 const unsigned char *src) ··· 3297 3261 if (ipv6_addr_is_ll_all_nodes(group)) 3298 3262 return; 3299 3263 3300 - own_query = port ? &port->multicast_ctx.ip6_own_query : 3301 - &br->multicast_ctx.ip6_own_query; 3264 + own_query = pmctx ? &pmctx->ip6_own_query : &brmctx->ip6_own_query; 3302 3265 3303 3266 memset(&br_group, 0, sizeof(br_group)); 3304 3267 br_group.dst.ip6 = *group; 3305 3268 br_group.proto = htons(ETH_P_IPV6); 3306 3269 br_group.vid = vid; 3307 3270 3308 - br_multicast_leave_group(br, port, &br_group, 3309 - &br->multicast_ctx.ip6_other_query, 3271 + br_multicast_leave_group(brmctx, pmctx, &br_group, 3272 + &brmctx->ip6_other_query, 3310 3273 own_query, src); 3311 3274 } 3312 3275 #endif ··· 3343 3308 u64_stats_update_end(&pstats->syncp); 3344 3309 } 3345 3310 3346 - static void br_multicast_pim(struct net_bridge *br, 3347 - struct net_bridge_port *port, 3311 + static void br_multicast_pim(struct net_bridge_mcast *brmctx, 3312 + struct net_bridge_mcast_port *pmctx, 3348 3313 const struct sk_buff *skb) 3349 3314 { 3350 3315 unsigned int offset = skb_transport_offset(skb); ··· 3355 3320 pim_hdr_type(pimhdr) != PIM_TYPE_HELLO) 3356 3321 return; 3357 3322 3358 - spin_lock(&br->multicast_lock); 3359 - br_ip4_multicast_mark_router(br, port); 3360 - spin_unlock(&br->multicast_lock); 3323 + spin_lock(&brmctx->br->multicast_lock); 3324 + br_ip4_multicast_mark_router(brmctx, pmctx); 3325 + spin_unlock(&brmctx->br->multicast_lock); 3361 3326 } 3362 3327 3363 - static int br_ip4_multicast_mrd_rcv(struct net_bridge *br, 3364 - struct net_bridge_port *port, 3328 + static int br_ip4_multicast_mrd_rcv(struct net_bridge_mcast *brmctx, 3329 + struct net_bridge_mcast_port *pmctx, 3365 3330 struct sk_buff *skb) 3366 3331 { 3367 3332 if (ip_hdr(skb)->protocol != IPPROTO_IGMP || 3368 3333 igmp_hdr(skb)->type != IGMP_MRDISC_ADV) 3369 3334 return -ENOMSG; 3370 3335 3371 - spin_lock(&br->multicast_lock); 3372 - br_ip4_multicast_mark_router(br, port); 3373 - spin_unlock(&br->multicast_lock); 3336 + spin_lock(&brmctx->br->multicast_lock); 3337 + br_ip4_multicast_mark_router(brmctx, pmctx); 3338 + spin_unlock(&brmctx->br->multicast_lock); 3374 3339 3375 3340 return 0; 3376 3341 } 3377 3342 3378 - static int br_multicast_ipv4_rcv(struct net_bridge *br, 3379 - struct net_bridge_port *port, 3343 + static int br_multicast_ipv4_rcv(struct net_bridge_mcast *brmctx, 3344 + struct net_bridge_mcast_port *pmctx, 3380 3345 struct sk_buff *skb, 3381 3346 u16 vid) 3382 3347 { 3348 + struct net_bridge_port *p = pmctx ? pmctx->port : NULL; 3383 3349 const unsigned char *src; 3384 3350 struct igmphdr *ih; 3385 3351 int err; ··· 3392 3356 BR_INPUT_SKB_CB(skb)->mrouters_only = 1; 3393 3357 } else if (pim_ipv4_all_pim_routers(ip_hdr(skb)->daddr)) { 3394 3358 if (ip_hdr(skb)->protocol == IPPROTO_PIM) 3395 - br_multicast_pim(br, port, skb); 3359 + br_multicast_pim(brmctx, pmctx, skb); 3396 3360 } else if (ipv4_is_all_snoopers(ip_hdr(skb)->daddr)) { 3397 - br_ip4_multicast_mrd_rcv(br, port, skb); 3361 + br_ip4_multicast_mrd_rcv(brmctx, pmctx, skb); 3398 3362 } 3399 3363 3400 3364 return 0; 3401 3365 } else if (err < 0) { 3402 - br_multicast_err_count(br, port, skb->protocol); 3366 + br_multicast_err_count(brmctx->br, p, skb->protocol); 3403 3367 return err; 3404 3368 } 3405 3369 ··· 3411 3375 case IGMP_HOST_MEMBERSHIP_REPORT: 3412 3376 case IGMPV2_HOST_MEMBERSHIP_REPORT: 3413 3377 BR_INPUT_SKB_CB(skb)->mrouters_only = 1; 3414 - err = br_ip4_multicast_add_group(br, port, ih->group, vid, src, 3415 - true); 3378 + err = br_ip4_multicast_add_group(brmctx, pmctx, ih->group, vid, 3379 + src, true); 3416 3380 break; 3417 3381 case IGMPV3_HOST_MEMBERSHIP_REPORT: 3418 - err = br_ip4_multicast_igmp3_report(br, port, skb, vid); 3382 + err = br_ip4_multicast_igmp3_report(brmctx, pmctx, skb, vid); 3419 3383 break; 3420 3384 case IGMP_HOST_MEMBERSHIP_QUERY: 3421 - br_ip4_multicast_query(br, port, skb, vid); 3385 + br_ip4_multicast_query(brmctx, pmctx, skb, vid); 3422 3386 break; 3423 3387 case IGMP_HOST_LEAVE_MESSAGE: 3424 - br_ip4_multicast_leave_group(br, port, ih->group, vid, src); 3388 + br_ip4_multicast_leave_group(brmctx, pmctx, ih->group, vid, src); 3425 3389 break; 3426 3390 } 3427 3391 3428 - br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, 3392 + br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp, 3429 3393 BR_MCAST_DIR_RX); 3430 3394 3431 3395 return err; 3432 3396 } 3433 3397 3434 3398 #if IS_ENABLED(CONFIG_IPV6) 3435 - static void br_ip6_multicast_mrd_rcv(struct net_bridge *br, 3436 - struct net_bridge_port *port, 3399 + static void br_ip6_multicast_mrd_rcv(struct net_bridge_mcast *brmctx, 3400 + struct net_bridge_mcast_port *pmctx, 3437 3401 struct sk_buff *skb) 3438 3402 { 3439 3403 if (icmp6_hdr(skb)->icmp6_type != ICMPV6_MRDISC_ADV) 3440 3404 return; 3441 3405 3442 - spin_lock(&br->multicast_lock); 3443 - br_ip6_multicast_mark_router(br, port); 3444 - spin_unlock(&br->multicast_lock); 3406 + spin_lock(&brmctx->br->multicast_lock); 3407 + br_ip6_multicast_mark_router(brmctx, pmctx); 3408 + spin_unlock(&brmctx->br->multicast_lock); 3445 3409 } 3446 3410 3447 - static int br_multicast_ipv6_rcv(struct net_bridge *br, 3448 - struct net_bridge_port *port, 3411 + static int br_multicast_ipv6_rcv(struct net_bridge_mcast *brmctx, 3412 + struct net_bridge_mcast_port *pmctx, 3449 3413 struct sk_buff *skb, 3450 3414 u16 vid) 3451 3415 { 3416 + struct net_bridge_port *p = pmctx ? pmctx->port : NULL; 3452 3417 const unsigned char *src; 3453 3418 struct mld_msg *mld; 3454 3419 int err; ··· 3461 3424 BR_INPUT_SKB_CB(skb)->mrouters_only = 1; 3462 3425 if (err == -ENODATA && 3463 3426 ipv6_addr_is_all_snoopers(&ipv6_hdr(skb)->daddr)) 3464 - br_ip6_multicast_mrd_rcv(br, port, skb); 3427 + br_ip6_multicast_mrd_rcv(brmctx, pmctx, skb); 3465 3428 3466 3429 return 0; 3467 3430 } else if (err < 0) { 3468 - br_multicast_err_count(br, port, skb->protocol); 3431 + br_multicast_err_count(brmctx->br, p, skb->protocol); 3469 3432 return err; 3470 3433 } 3471 3434 ··· 3476 3439 case ICMPV6_MGM_REPORT: 3477 3440 src = eth_hdr(skb)->h_source; 3478 3441 BR_INPUT_SKB_CB(skb)->mrouters_only = 1; 3479 - err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid, 3480 - src, true); 3442 + err = br_ip6_multicast_add_group(brmctx, pmctx, &mld->mld_mca, 3443 + vid, src, true); 3481 3444 break; 3482 3445 case ICMPV6_MLD2_REPORT: 3483 - err = br_ip6_multicast_mld2_report(br, port, skb, vid); 3446 + err = br_ip6_multicast_mld2_report(brmctx, pmctx, skb, vid); 3484 3447 break; 3485 3448 case ICMPV6_MGM_QUERY: 3486 - err = br_ip6_multicast_query(br, port, skb, vid); 3449 + err = br_ip6_multicast_query(brmctx, pmctx, skb, vid); 3487 3450 break; 3488 3451 case ICMPV6_MGM_REDUCTION: 3489 3452 src = eth_hdr(skb)->h_source; 3490 - br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src); 3453 + br_ip6_multicast_leave_group(brmctx, pmctx, &mld->mld_mca, vid, 3454 + src); 3491 3455 break; 3492 3456 } 3493 3457 3494 - br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp, 3458 + br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp, 3495 3459 BR_MCAST_DIR_RX); 3496 3460 3497 3461 return err; 3498 3462 } 3499 3463 #endif 3500 3464 3501 - int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, 3465 + int br_multicast_rcv(struct net_bridge_mcast *brmctx, 3466 + struct net_bridge_mcast_port *pmctx, 3502 3467 struct sk_buff *skb, u16 vid) 3503 3468 { 3504 3469 int ret = 0; ··· 3508 3469 BR_INPUT_SKB_CB(skb)->igmp = 0; 3509 3470 BR_INPUT_SKB_CB(skb)->mrouters_only = 0; 3510 3471 3511 - if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) 3472 + if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) 3512 3473 return 0; 3513 3474 3514 3475 switch (skb->protocol) { 3515 3476 case htons(ETH_P_IP): 3516 - ret = br_multicast_ipv4_rcv(br, port, skb, vid); 3477 + ret = br_multicast_ipv4_rcv(brmctx, pmctx, skb, vid); 3517 3478 break; 3518 3479 #if IS_ENABLED(CONFIG_IPV6) 3519 3480 case htons(ETH_P_IPV6): 3520 - ret = br_multicast_ipv6_rcv(br, port, skb, vid); 3481 + ret = br_multicast_ipv6_rcv(brmctx, pmctx, skb, vid); 3521 3482 break; 3522 3483 #endif 3523 3484 } ··· 3525 3486 return ret; 3526 3487 } 3527 3488 3528 - static void br_multicast_query_expired(struct net_bridge *br, 3489 + static void br_multicast_query_expired(struct net_bridge_mcast *brmctx, 3529 3490 struct bridge_mcast_own_query *query, 3530 3491 struct bridge_mcast_querier *querier) 3531 3492 { 3532 - spin_lock(&br->multicast_lock); 3533 - if (query->startup_sent < br->multicast_ctx.multicast_startup_query_count) 3493 + spin_lock(&brmctx->br->multicast_lock); 3494 + if (query->startup_sent < brmctx->multicast_startup_query_count) 3534 3495 query->startup_sent++; 3535 3496 3536 3497 RCU_INIT_POINTER(querier->port, NULL); 3537 - br_multicast_send_query(br, NULL, query); 3538 - spin_unlock(&br->multicast_lock); 3498 + br_multicast_send_query(brmctx, NULL, query); 3499 + spin_unlock(&brmctx->br->multicast_lock); 3539 3500 } 3540 3501 3541 3502 static void br_ip4_multicast_query_expired(struct timer_list *t) ··· 3543 3504 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 3544 3505 ip4_own_query.timer); 3545 3506 3546 - br_multicast_query_expired(brmctx->br, &brmctx->ip4_own_query, 3507 + br_multicast_query_expired(brmctx, &brmctx->ip4_own_query, 3547 3508 &brmctx->ip4_querier); 3548 3509 } 3549 3510 ··· 3553 3514 struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 3554 3515 ip6_own_query.timer); 3555 3516 3556 - br_multicast_query_expired(brmctx->br, &brmctx->ip6_own_query, 3517 + br_multicast_query_expired(brmctx, &brmctx->ip6_own_query, 3557 3518 &brmctx->ip6_querier); 3558 3519 } 3559 3520 #endif ··· 3761 3722 } 3762 3723 3763 3724 static void 3764 - br_multicast_rport_del_notify(struct net_bridge_port *p, bool deleted) 3725 + br_multicast_rport_del_notify(struct net_bridge_mcast_port *pmctx, bool deleted) 3765 3726 { 3766 3727 if (!deleted) 3767 3728 return; ··· 3769 3730 /* For backwards compatibility for now, only notify if there is 3770 3731 * no multicast router anymore for both IPv4 and IPv6. 3771 3732 */ 3772 - if (!hlist_unhashed(&p->multicast_ctx.ip4_rlist)) 3733 + if (!hlist_unhashed(&pmctx->ip4_rlist)) 3773 3734 return; 3774 3735 #if IS_ENABLED(CONFIG_IPV6) 3775 - if (!hlist_unhashed(&p->multicast_ctx.ip6_rlist)) 3736 + if (!hlist_unhashed(&pmctx->ip6_rlist)) 3776 3737 return; 3777 3738 #endif 3778 3739 3779 - br_rtr_notify(p->br->dev, p, RTM_DELMDB); 3780 - br_port_mc_router_state_change(p, false); 3740 + br_rtr_notify(pmctx->port->br->dev, pmctx->port, RTM_DELMDB); 3741 + br_port_mc_router_state_change(pmctx->port, false); 3781 3742 3782 3743 /* don't allow timer refresh */ 3783 - if (p->multicast_ctx.multicast_router == MDB_RTR_TYPE_TEMP) 3784 - p->multicast_ctx.multicast_router = MDB_RTR_TYPE_TEMP_QUERY; 3744 + if (pmctx->multicast_router == MDB_RTR_TYPE_TEMP) 3745 + pmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; 3785 3746 } 3786 3747 3787 3748 int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val) 3788 3749 { 3789 3750 struct net_bridge_mcast *brmctx = &p->br->multicast_ctx; 3751 + struct net_bridge_mcast_port *pmctx = &p->multicast_ctx; 3790 3752 unsigned long now = jiffies; 3791 3753 int err = -EINVAL; 3792 3754 bool del = false; 3793 3755 3794 3756 spin_lock(&p->br->multicast_lock); 3795 - if (p->multicast_ctx.multicast_router == val) { 3757 + if (pmctx->multicast_router == val) { 3796 3758 /* Refresh the temp router port timer */ 3797 - if (p->multicast_ctx.multicast_router == MDB_RTR_TYPE_TEMP) { 3798 - mod_timer(&p->multicast_ctx.ip4_mc_router_timer, 3759 + if (pmctx->multicast_router == MDB_RTR_TYPE_TEMP) { 3760 + mod_timer(&pmctx->ip4_mc_router_timer, 3799 3761 now + brmctx->multicast_querier_interval); 3800 3762 #if IS_ENABLED(CONFIG_IPV6) 3801 - mod_timer(&p->multicast_ctx.ip6_mc_router_timer, 3763 + mod_timer(&pmctx->ip6_mc_router_timer, 3802 3764 now + brmctx->multicast_querier_interval); 3803 3765 #endif 3804 3766 } ··· 3808 3768 } 3809 3769 switch (val) { 3810 3770 case MDB_RTR_TYPE_DISABLED: 3811 - p->multicast_ctx.multicast_router = MDB_RTR_TYPE_DISABLED; 3812 - del |= br_ip4_multicast_rport_del(p); 3813 - del_timer(&p->multicast_ctx.ip4_mc_router_timer); 3814 - del |= br_ip6_multicast_rport_del(p); 3771 + pmctx->multicast_router = MDB_RTR_TYPE_DISABLED; 3772 + del |= br_ip4_multicast_rport_del(pmctx); 3773 + del_timer(&pmctx->ip4_mc_router_timer); 3774 + del |= br_ip6_multicast_rport_del(pmctx); 3815 3775 #if IS_ENABLED(CONFIG_IPV6) 3816 - del_timer(&p->multicast_ctx.ip6_mc_router_timer); 3776 + del_timer(&pmctx->ip6_mc_router_timer); 3817 3777 #endif 3818 - br_multicast_rport_del_notify(p, del); 3778 + br_multicast_rport_del_notify(pmctx, del); 3819 3779 break; 3820 3780 case MDB_RTR_TYPE_TEMP_QUERY: 3821 - p->multicast_ctx.multicast_router = MDB_RTR_TYPE_TEMP_QUERY; 3822 - del |= br_ip4_multicast_rport_del(p); 3823 - del |= br_ip6_multicast_rport_del(p); 3824 - br_multicast_rport_del_notify(p, del); 3781 + pmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; 3782 + del |= br_ip4_multicast_rport_del(pmctx); 3783 + del |= br_ip6_multicast_rport_del(pmctx); 3784 + br_multicast_rport_del_notify(pmctx, del); 3825 3785 break; 3826 3786 case MDB_RTR_TYPE_PERM: 3827 - p->multicast_ctx.multicast_router = MDB_RTR_TYPE_PERM; 3828 - del_timer(&p->multicast_ctx.ip4_mc_router_timer); 3829 - br_ip4_multicast_add_router(p->br, p); 3787 + pmctx->multicast_router = MDB_RTR_TYPE_PERM; 3788 + del_timer(&pmctx->ip4_mc_router_timer); 3789 + br_ip4_multicast_add_router(brmctx, pmctx); 3830 3790 #if IS_ENABLED(CONFIG_IPV6) 3831 - del_timer(&p->multicast_ctx.ip6_mc_router_timer); 3791 + del_timer(&pmctx->ip6_mc_router_timer); 3832 3792 #endif 3833 - br_ip6_multicast_add_router(p->br, p); 3793 + br_ip6_multicast_add_router(brmctx, pmctx); 3834 3794 break; 3835 3795 case MDB_RTR_TYPE_TEMP: 3836 - p->multicast_ctx.multicast_router = MDB_RTR_TYPE_TEMP; 3837 - br_ip4_multicast_mark_router(p->br, p); 3838 - br_ip6_multicast_mark_router(p->br, p); 3796 + pmctx->multicast_router = MDB_RTR_TYPE_TEMP; 3797 + br_ip4_multicast_mark_router(brmctx, pmctx); 3798 + br_ip6_multicast_mark_router(brmctx, pmctx); 3839 3799 break; 3840 3800 default: 3841 3801 goto unlock; ··· 3847 3807 return err; 3848 3808 } 3849 3809 3850 - static void br_multicast_start_querier(struct net_bridge *br, 3810 + static void br_multicast_start_querier(struct net_bridge_mcast *brmctx, 3851 3811 struct bridge_mcast_own_query *query) 3852 3812 { 3853 3813 struct net_bridge_port *port; 3854 3814 3855 - __br_multicast_open(br, query); 3815 + __br_multicast_open(brmctx->br, query); 3856 3816 3857 3817 rcu_read_lock(); 3858 - list_for_each_entry_rcu(port, &br->port_list, list) { 3818 + list_for_each_entry_rcu(port, &brmctx->br->port_list, list) { 3859 3819 if (port->state == BR_STATE_DISABLED || 3860 3820 port->state == BR_STATE_BLOCKING) 3861 3821 continue; 3862 3822 3863 - if (query == &br->multicast_ctx.ip4_own_query) 3823 + if (query == &brmctx->ip4_own_query) 3864 3824 br_multicast_enable(&port->multicast_ctx.ip4_own_query); 3865 3825 #if IS_ENABLED(CONFIG_IPV6) 3866 3826 else ··· 3898 3858 3899 3859 br_multicast_open(br); 3900 3860 list_for_each_entry(port, &br->port_list, list) 3901 - __br_multicast_enable_port(port); 3861 + __br_multicast_enable_port_ctx(&port->multicast_ctx); 3902 3862 3903 3863 change_snoopers = true; 3904 3864 ··· 3941 3901 bool is_router; 3942 3902 3943 3903 spin_lock_bh(&br->multicast_lock); 3944 - is_router = br_multicast_is_router(br, NULL); 3904 + is_router = br_multicast_is_router(&br->multicast_ctx, NULL); 3945 3905 spin_unlock_bh(&br->multicast_lock); 3946 3906 return is_router; 3947 3907 } ··· 3967 3927 if (!timer_pending(&brmctx->ip4_other_query.timer)) 3968 3928 brmctx->ip4_other_query.delay_time = jiffies + max_delay; 3969 3929 3970 - br_multicast_start_querier(br, &brmctx->ip4_own_query); 3930 + br_multicast_start_querier(brmctx, &brmctx->ip4_own_query); 3971 3931 3972 3932 #if IS_ENABLED(CONFIG_IPV6) 3973 3933 if (!timer_pending(&brmctx->ip6_other_query.timer)) 3974 3934 brmctx->ip6_other_query.delay_time = jiffies + max_delay; 3975 3935 3976 - br_multicast_start_querier(br, &brmctx->ip6_own_query); 3936 + br_multicast_start_querier(brmctx, &brmctx->ip6_own_query); 3977 3937 #endif 3978 3938 3979 3939 unlock: ··· 4106 4066 memset(&eth, 0, sizeof(eth)); 4107 4067 eth.h_proto = htons(proto); 4108 4068 4109 - ret = br_multicast_querier_exists(br, &eth, NULL); 4069 + ret = br_multicast_querier_exists(&br->multicast_ctx, &eth, NULL); 4110 4070 4111 4071 unlock: 4112 4072 rcu_read_unlock(); ··· 4294 4254 u64_stats_update_end(&pstats->syncp); 4295 4255 } 4296 4256 4297 - void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, 4257 + void br_multicast_count(struct net_bridge *br, 4258 + const struct net_bridge_port *p, 4298 4259 const struct sk_buff *skb, u8 type, u8 dir) 4299 4260 { 4300 4261 struct bridge_mcast_stats __percpu *stats;
+52 -40
net/bridge/br_multicast_eht.c
··· 33 33 static bool br_multicast_del_eht_set_entry(struct net_bridge_port_group *pg, 34 34 union net_bridge_eht_addr *src_addr, 35 35 union net_bridge_eht_addr *h_addr); 36 - static void br_multicast_create_eht_set_entry(struct net_bridge_port_group *pg, 36 + static void br_multicast_create_eht_set_entry(const struct net_bridge_mcast *brmctx, 37 + struct net_bridge_port_group *pg, 37 38 union net_bridge_eht_addr *src_addr, 38 39 union net_bridge_eht_addr *h_addr, 39 40 int filter_mode, ··· 389 388 } 390 389 } 391 390 392 - static void br_eht_convert_host_filter_mode(struct net_bridge_port_group *pg, 391 + static void br_eht_convert_host_filter_mode(const struct net_bridge_mcast *brmctx, 392 + struct net_bridge_port_group *pg, 393 393 union net_bridge_eht_addr *h_addr, 394 394 int filter_mode) 395 395 { ··· 407 405 br_multicast_del_eht_set_entry(pg, &zero_addr, h_addr); 408 406 break; 409 407 case MCAST_EXCLUDE: 410 - br_multicast_create_eht_set_entry(pg, &zero_addr, h_addr, 411 - MCAST_EXCLUDE, 408 + br_multicast_create_eht_set_entry(brmctx, pg, &zero_addr, 409 + h_addr, MCAST_EXCLUDE, 412 410 true); 413 411 break; 414 412 } 415 413 } 416 414 417 - static void br_multicast_create_eht_set_entry(struct net_bridge_port_group *pg, 415 + static void br_multicast_create_eht_set_entry(const struct net_bridge_mcast *brmctx, 416 + struct net_bridge_port_group *pg, 418 417 union net_bridge_eht_addr *src_addr, 419 418 union net_bridge_eht_addr *h_addr, 420 419 int filter_mode, ··· 444 441 if (!set_h) 445 442 goto fail_set_entry; 446 443 447 - mod_timer(&set_h->timer, jiffies + br_multicast_gmi(br)); 448 - mod_timer(&eht_set->timer, jiffies + br_multicast_gmi(br)); 444 + mod_timer(&set_h->timer, jiffies + br_multicast_gmi(brmctx)); 445 + mod_timer(&eht_set->timer, jiffies + br_multicast_gmi(brmctx)); 449 446 450 447 return; 451 448 ··· 502 499 } 503 500 504 501 /* create new set entries from reports */ 505 - static void __eht_create_set_entries(struct net_bridge_port_group *pg, 502 + static void __eht_create_set_entries(const struct net_bridge_mcast *brmctx, 503 + struct net_bridge_port_group *pg, 506 504 union net_bridge_eht_addr *h_addr, 507 505 void *srcs, 508 506 u32 nsrcs, ··· 516 512 memset(&eht_src_addr, 0, sizeof(eht_src_addr)); 517 513 for (src_idx = 0; src_idx < nsrcs; src_idx++) { 518 514 memcpy(&eht_src_addr, srcs + (src_idx * addr_size), addr_size); 519 - br_multicast_create_eht_set_entry(pg, &eht_src_addr, h_addr, 520 - filter_mode, 515 + br_multicast_create_eht_set_entry(brmctx, pg, &eht_src_addr, 516 + h_addr, filter_mode, 521 517 false); 522 518 } 523 519 } ··· 553 549 return changed; 554 550 } 555 551 556 - static bool br_multicast_eht_allow(struct net_bridge_port_group *pg, 552 + static bool br_multicast_eht_allow(const struct net_bridge_mcast *brmctx, 553 + struct net_bridge_port_group *pg, 557 554 union net_bridge_eht_addr *h_addr, 558 555 void *srcs, 559 556 u32 nsrcs, ··· 564 559 565 560 switch (br_multicast_eht_host_filter_mode(pg, h_addr)) { 566 561 case MCAST_INCLUDE: 567 - __eht_create_set_entries(pg, h_addr, srcs, nsrcs, addr_size, 568 - MCAST_INCLUDE); 562 + __eht_create_set_entries(brmctx, pg, h_addr, srcs, nsrcs, 563 + addr_size, MCAST_INCLUDE); 569 564 break; 570 565 case MCAST_EXCLUDE: 571 566 changed = __eht_del_set_entries(pg, h_addr, srcs, nsrcs, ··· 576 571 return changed; 577 572 } 578 573 579 - static bool br_multicast_eht_block(struct net_bridge_port_group *pg, 574 + static bool br_multicast_eht_block(const struct net_bridge_mcast *brmctx, 575 + struct net_bridge_port_group *pg, 580 576 union net_bridge_eht_addr *h_addr, 581 577 void *srcs, 582 578 u32 nsrcs, ··· 591 585 addr_size); 592 586 break; 593 587 case MCAST_EXCLUDE: 594 - __eht_create_set_entries(pg, h_addr, srcs, nsrcs, addr_size, 588 + __eht_create_set_entries(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 595 589 MCAST_EXCLUDE); 596 590 break; 597 591 } ··· 600 594 } 601 595 602 596 /* flush_entries is true when changing mode */ 603 - static bool __eht_inc_exc(struct net_bridge_port_group *pg, 597 + static bool __eht_inc_exc(const struct net_bridge_mcast *brmctx, 598 + struct net_bridge_port_group *pg, 604 599 union net_bridge_eht_addr *h_addr, 605 600 void *srcs, 606 601 u32 nsrcs, ··· 619 612 /* if we're changing mode del host and its entries */ 620 613 if (flush_entries) 621 614 br_multicast_del_eht_host(pg, h_addr); 622 - __eht_create_set_entries(pg, h_addr, srcs, nsrcs, addr_size, 615 + __eht_create_set_entries(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 623 616 filter_mode); 624 617 /* we can be missing sets only if we've deleted some entries */ 625 618 if (flush_entries) { 626 - struct net_bridge *br = pg->key.port->br; 627 619 struct net_bridge_group_eht_set *eht_set; 628 620 struct net_bridge_group_src *src_ent; 629 621 struct hlist_node *tmp; ··· 653 647 &eht_src_addr); 654 648 if (!eht_set) 655 649 continue; 656 - mod_timer(&eht_set->timer, jiffies + br_multicast_lmqt(br)); 650 + mod_timer(&eht_set->timer, jiffies + br_multicast_lmqt(brmctx)); 657 651 } 658 652 } 659 653 660 654 return changed; 661 655 } 662 656 663 - static bool br_multicast_eht_inc(struct net_bridge_port_group *pg, 657 + static bool br_multicast_eht_inc(const struct net_bridge_mcast *brmctx, 658 + struct net_bridge_port_group *pg, 664 659 union net_bridge_eht_addr *h_addr, 665 660 void *srcs, 666 661 u32 nsrcs, ··· 670 663 { 671 664 bool changed; 672 665 673 - changed = __eht_inc_exc(pg, h_addr, srcs, nsrcs, addr_size, 666 + changed = __eht_inc_exc(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 674 667 MCAST_INCLUDE, to_report); 675 - br_eht_convert_host_filter_mode(pg, h_addr, MCAST_INCLUDE); 668 + br_eht_convert_host_filter_mode(brmctx, pg, h_addr, MCAST_INCLUDE); 676 669 677 670 return changed; 678 671 } 679 672 680 - static bool br_multicast_eht_exc(struct net_bridge_port_group *pg, 673 + static bool br_multicast_eht_exc(const struct net_bridge_mcast *brmctx, 674 + struct net_bridge_port_group *pg, 681 675 union net_bridge_eht_addr *h_addr, 682 676 void *srcs, 683 677 u32 nsrcs, ··· 687 679 { 688 680 bool changed; 689 681 690 - changed = __eht_inc_exc(pg, h_addr, srcs, nsrcs, addr_size, 682 + changed = __eht_inc_exc(brmctx, pg, h_addr, srcs, nsrcs, addr_size, 691 683 MCAST_EXCLUDE, to_report); 692 - br_eht_convert_host_filter_mode(pg, h_addr, MCAST_EXCLUDE); 684 + br_eht_convert_host_filter_mode(brmctx, pg, h_addr, MCAST_EXCLUDE); 693 685 694 686 return changed; 695 687 } 696 688 697 - static bool __eht_ip4_handle(struct net_bridge_port_group *pg, 689 + static bool __eht_ip4_handle(const struct net_bridge_mcast *brmctx, 690 + struct net_bridge_port_group *pg, 698 691 union net_bridge_eht_addr *h_addr, 699 692 void *srcs, 700 693 u32 nsrcs, ··· 705 696 706 697 switch (grec_type) { 707 698 case IGMPV3_ALLOW_NEW_SOURCES: 708 - br_multicast_eht_allow(pg, h_addr, srcs, nsrcs, sizeof(__be32)); 699 + br_multicast_eht_allow(brmctx, pg, h_addr, srcs, nsrcs, 700 + sizeof(__be32)); 709 701 break; 710 702 case IGMPV3_BLOCK_OLD_SOURCES: 711 - changed = br_multicast_eht_block(pg, h_addr, srcs, nsrcs, 703 + changed = br_multicast_eht_block(brmctx, pg, h_addr, srcs, nsrcs, 712 704 sizeof(__be32)); 713 705 break; 714 706 case IGMPV3_CHANGE_TO_INCLUDE: 715 707 to_report = true; 716 708 fallthrough; 717 709 case IGMPV3_MODE_IS_INCLUDE: 718 - changed = br_multicast_eht_inc(pg, h_addr, srcs, nsrcs, 710 + changed = br_multicast_eht_inc(brmctx, pg, h_addr, srcs, nsrcs, 719 711 sizeof(__be32), to_report); 720 712 break; 721 713 case IGMPV3_CHANGE_TO_EXCLUDE: 722 714 to_report = true; 723 715 fallthrough; 724 716 case IGMPV3_MODE_IS_EXCLUDE: 725 - changed = br_multicast_eht_exc(pg, h_addr, srcs, nsrcs, 717 + changed = br_multicast_eht_exc(brmctx, pg, h_addr, srcs, nsrcs, 726 718 sizeof(__be32), to_report); 727 719 break; 728 720 } ··· 732 722 } 733 723 734 724 #if IS_ENABLED(CONFIG_IPV6) 735 - static bool __eht_ip6_handle(struct net_bridge_port_group *pg, 725 + static bool __eht_ip6_handle(const struct net_bridge_mcast *brmctx, 726 + struct net_bridge_port_group *pg, 736 727 union net_bridge_eht_addr *h_addr, 737 728 void *srcs, 738 729 u32 nsrcs, ··· 743 732 744 733 switch (grec_type) { 745 734 case MLD2_ALLOW_NEW_SOURCES: 746 - br_multicast_eht_allow(pg, h_addr, srcs, nsrcs, 735 + br_multicast_eht_allow(brmctx, pg, h_addr, srcs, nsrcs, 747 736 sizeof(struct in6_addr)); 748 737 break; 749 738 case MLD2_BLOCK_OLD_SOURCES: 750 - changed = br_multicast_eht_block(pg, h_addr, srcs, nsrcs, 739 + changed = br_multicast_eht_block(brmctx, pg, h_addr, srcs, nsrcs, 751 740 sizeof(struct in6_addr)); 752 741 break; 753 742 case MLD2_CHANGE_TO_INCLUDE: 754 743 to_report = true; 755 744 fallthrough; 756 745 case MLD2_MODE_IS_INCLUDE: 757 - changed = br_multicast_eht_inc(pg, h_addr, srcs, nsrcs, 746 + changed = br_multicast_eht_inc(brmctx, pg, h_addr, srcs, nsrcs, 758 747 sizeof(struct in6_addr), 759 748 to_report); 760 749 break; ··· 762 751 to_report = true; 763 752 fallthrough; 764 753 case MLD2_MODE_IS_EXCLUDE: 765 - changed = br_multicast_eht_exc(pg, h_addr, srcs, nsrcs, 754 + changed = br_multicast_eht_exc(brmctx, pg, h_addr, srcs, nsrcs, 766 755 sizeof(struct in6_addr), 767 756 to_report); 768 757 break; ··· 773 762 #endif 774 763 775 764 /* true means an entry was deleted */ 776 - bool br_multicast_eht_handle(struct net_bridge_port_group *pg, 765 + bool br_multicast_eht_handle(const struct net_bridge_mcast *brmctx, 766 + struct net_bridge_port_group *pg, 777 767 void *h_addr, 778 768 void *srcs, 779 769 u32 nsrcs, ··· 791 779 memset(&eht_host_addr, 0, sizeof(eht_host_addr)); 792 780 memcpy(&eht_host_addr, h_addr, addr_size); 793 781 if (addr_size == sizeof(__be32)) 794 - changed = __eht_ip4_handle(pg, &eht_host_addr, srcs, nsrcs, 795 - grec_type); 782 + changed = __eht_ip4_handle(brmctx, pg, &eht_host_addr, srcs, 783 + nsrcs, grec_type); 796 784 #if IS_ENABLED(CONFIG_IPV6) 797 785 else 798 - changed = __eht_ip6_handle(pg, &eht_host_addr, srcs, nsrcs, 799 - grec_type); 786 + changed = __eht_ip6_handle(brmctx, pg, &eht_host_addr, srcs, 787 + nsrcs, grec_type); 800 788 #endif 801 789 802 790 out:
+38 -36
net/bridge/br_private.h
··· 817 817 818 818 /* br_multicast.c */ 819 819 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 820 - int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, 820 + int br_multicast_rcv(struct net_bridge_mcast *brmctx, 821 + struct net_bridge_mcast_port *pmctx, 821 822 struct sk_buff *skb, u16 vid); 822 - struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, 823 + struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge_mcast *brmctx, 823 824 struct sk_buff *skb, u16 vid); 824 825 int br_multicast_add_port(struct net_bridge_port *port); 825 826 void br_multicast_del_port(struct net_bridge_port *port); ··· 832 831 void br_multicast_open(struct net_bridge *br); 833 832 void br_multicast_stop(struct net_bridge *br); 834 833 void br_multicast_dev_del(struct net_bridge *br); 835 - void br_multicast_flood(struct net_bridge_mdb_entry *mdst, 836 - struct sk_buff *skb, bool local_rcv, bool local_orig); 834 + void br_multicast_flood(struct net_bridge_mdb_entry *mdst, struct sk_buff *skb, 835 + struct net_bridge_mcast *brmctx, 836 + bool local_rcv, bool local_orig); 837 837 int br_multicast_set_router(struct net_bridge *br, unsigned long val); 838 838 int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val); 839 839 int br_multicast_toggle(struct net_bridge *br, unsigned long val, ··· 863 861 void br_multicast_del_pg(struct net_bridge_mdb_entry *mp, 864 862 struct net_bridge_port_group *pg, 865 863 struct net_bridge_port_group __rcu **pp); 866 - void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, 864 + void br_multicast_count(struct net_bridge *br, 865 + const struct net_bridge_port *p, 867 866 const struct sk_buff *skb, u8 type, u8 dir); 868 867 int br_multicast_init_stats(struct net_bridge *br); 869 868 void br_multicast_uninit_stats(struct net_bridge *br); ··· 893 890 rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock)) 894 891 895 892 static inline struct hlist_node * 896 - br_multicast_get_first_rport_node(struct net_bridge *br, struct sk_buff *skb) 893 + br_multicast_get_first_rport_node(struct net_bridge_mcast *brmctx, 894 + struct sk_buff *skb) 897 895 { 898 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 899 - 900 896 #if IS_ENABLED(CONFIG_IPV6) 901 897 if (skb->protocol == htons(ETH_P_IPV6)) 902 898 return rcu_dereference(hlist_first_rcu(&brmctx->ip6_mc_router_list)); ··· 938 936 } 939 937 940 938 static inline bool 941 - br_multicast_is_router(struct net_bridge *br, struct sk_buff *skb) 939 + br_multicast_is_router(struct net_bridge_mcast *brmctx, struct sk_buff *skb) 942 940 { 943 - struct net_bridge_mcast *brmctx = &br->multicast_ctx; 944 - 945 941 switch (brmctx->multicast_router) { 946 942 case MDB_RTR_TYPE_PERM: 947 943 return true; ··· 960 960 } 961 961 962 962 static inline bool 963 - __br_multicast_querier_exists(struct net_bridge *br, 964 - struct bridge_mcast_other_query *querier, 965 - const bool is_ipv6) 963 + __br_multicast_querier_exists(struct net_bridge_mcast *brmctx, 964 + struct bridge_mcast_other_query *querier, 965 + const bool is_ipv6) 966 966 { 967 967 bool own_querier_enabled; 968 968 969 - if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) { 970 - if (is_ipv6 && !br_opt_get(br, BROPT_HAS_IPV6_ADDR)) 969 + if (br_opt_get(brmctx->br, BROPT_MULTICAST_QUERIER)) { 970 + if (is_ipv6 && !br_opt_get(brmctx->br, BROPT_HAS_IPV6_ADDR)) 971 971 own_querier_enabled = false; 972 972 else 973 973 own_querier_enabled = true; ··· 979 979 (own_querier_enabled || timer_pending(&querier->timer)); 980 980 } 981 981 982 - static inline bool br_multicast_querier_exists(struct net_bridge *br, 982 + static inline bool br_multicast_querier_exists(struct net_bridge_mcast *brmctx, 983 983 struct ethhdr *eth, 984 984 const struct net_bridge_mdb_entry *mdb) 985 985 { 986 986 switch (eth->h_proto) { 987 987 case (htons(ETH_P_IP)): 988 - return __br_multicast_querier_exists(br, 989 - &br->multicast_ctx.ip4_other_query, false); 988 + return __br_multicast_querier_exists(brmctx, 989 + &brmctx->ip4_other_query, false); 990 990 #if IS_ENABLED(CONFIG_IPV6) 991 991 case (htons(ETH_P_IPV6)): 992 - return __br_multicast_querier_exists(br, 993 - &br->multicast_ctx.ip6_other_query, true); 992 + return __br_multicast_querier_exists(brmctx, 993 + &brmctx->ip6_other_query, true); 994 994 #endif 995 995 default: 996 996 return !!mdb && br_group_is_l2(&mdb->addr); ··· 1011 1011 } 1012 1012 } 1013 1013 1014 - static inline bool br_multicast_should_handle_mode(const struct net_bridge *br, 1015 - __be16 proto) 1014 + static inline bool 1015 + br_multicast_should_handle_mode(const struct net_bridge_mcast *brmctx, 1016 + __be16 proto) 1016 1017 { 1017 1018 switch (proto) { 1018 1019 case htons(ETH_P_IP): 1019 - return !!(br->multicast_ctx.multicast_igmp_version == 3); 1020 + return !!(brmctx->multicast_igmp_version == 3); 1020 1021 #if IS_ENABLED(CONFIG_IPV6) 1021 1022 case htons(ETH_P_IPV6): 1022 - return !!(br->multicast_ctx.multicast_mld_version == 2); 1023 + return !!(brmctx->multicast_mld_version == 2); 1023 1024 #endif 1024 1025 default: 1025 1026 return false; ··· 1032 1031 return BR_INPUT_SKB_CB(skb)->igmp; 1033 1032 } 1034 1033 1035 - static inline unsigned long br_multicast_lmqt(const struct net_bridge *br) 1034 + static inline unsigned long br_multicast_lmqt(const struct net_bridge_mcast *brmctx) 1036 1035 { 1037 - return br->multicast_ctx.multicast_last_member_interval * 1038 - br->multicast_ctx.multicast_last_member_count; 1036 + return brmctx->multicast_last_member_interval * 1037 + brmctx->multicast_last_member_count; 1039 1038 } 1040 1039 1041 - static inline unsigned long br_multicast_gmi(const struct net_bridge *br) 1040 + static inline unsigned long br_multicast_gmi(const struct net_bridge_mcast *brmctx) 1042 1041 { 1043 1042 /* use the RFC default of 2 for QRV */ 1044 - return 2 * br->multicast_ctx.multicast_query_interval + 1045 - br->multicast_ctx.multicast_query_response_interval; 1043 + return 2 * brmctx->multicast_query_interval + 1044 + brmctx->multicast_query_response_interval; 1046 1045 } 1047 1046 #else 1048 - static inline int br_multicast_rcv(struct net_bridge *br, 1049 - struct net_bridge_port *port, 1047 + static inline int br_multicast_rcv(struct net_bridge_mcast *brmctx, 1048 + struct net_bridge_mcast_port *pmctx, 1050 1049 struct sk_buff *skb, 1051 1050 u16 vid) 1052 1051 { 1053 1052 return 0; 1054 1053 } 1055 1054 1056 - static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, 1055 + static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge_mcast *brmctx, 1057 1056 struct sk_buff *skb, u16 vid) 1058 1057 { 1059 1058 return NULL; ··· 1102 1101 1103 1102 static inline void br_multicast_flood(struct net_bridge_mdb_entry *mdst, 1104 1103 struct sk_buff *skb, 1104 + struct net_bridge_mcast *brmctx, 1105 1105 bool local_rcv, bool local_orig) 1106 1106 { 1107 1107 } 1108 1108 1109 - static inline bool br_multicast_is_router(struct net_bridge *br, 1109 + static inline bool br_multicast_is_router(struct net_bridge_mcast *brmctx, 1110 1110 struct sk_buff *skb) 1111 1111 { 1112 1112 return false; 1113 1113 } 1114 1114 1115 - static inline bool br_multicast_querier_exists(struct net_bridge *br, 1115 + static inline bool br_multicast_querier_exists(struct net_bridge_mcast *brmctx, 1116 1116 struct ethhdr *eth, 1117 1117 const struct net_bridge_mdb_entry *mdb) 1118 1118 {
+2 -1
net/bridge/br_private_mcast_eht.h
··· 51 51 52 52 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 53 53 void br_multicast_eht_clean_sets(struct net_bridge_port_group *pg); 54 - bool br_multicast_eht_handle(struct net_bridge_port_group *pg, 54 + bool br_multicast_eht_handle(const struct net_bridge_mcast *brmctx, 55 + struct net_bridge_port_group *pg, 55 56 void *h_addr, 56 57 void *srcs, 57 58 u32 nsrcs,