xref: /linux/net/bridge/br_multicast.c (revision 546b928da0427b0d6c663cbb992bd7bfa9ac7971)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Bridge multicast support.
4  *
5  * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
6  */
7 
8 #include <linux/err.h>
9 #include <linux/export.h>
10 #include <linux/if_ether.h>
11 #include <linux/igmp.h>
12 #include <linux/in.h>
13 #include <linux/jhash.h>
14 #include <linux/kernel.h>
15 #include <linux/log2.h>
16 #include <linux/netdevice.h>
17 #include <linux/netfilter_bridge.h>
18 #include <linux/random.h>
19 #include <linux/rculist.h>
20 #include <linux/skbuff.h>
21 #include <linux/slab.h>
22 #include <linux/timer.h>
23 #include <linux/inetdevice.h>
24 #include <linux/mroute.h>
25 #include <net/ip.h>
26 #include <net/switchdev.h>
27 #if IS_ENABLED(CONFIG_IPV6)
28 #include <linux/icmpv6.h>
29 #include <net/ipv6.h>
30 #include <net/mld.h>
31 #include <net/ip6_checksum.h>
32 #include <net/addrconf.h>
33 #endif
34 #include <trace/events/bridge.h>
35 
36 #include "br_private.h"
37 #include "br_private_mcast_eht.h"
38 
39 static const struct rhashtable_params br_mdb_rht_params = {
40 	.head_offset = offsetof(struct net_bridge_mdb_entry, rhnode),
41 	.key_offset = offsetof(struct net_bridge_mdb_entry, addr),
42 	.key_len = sizeof(struct br_ip),
43 	.automatic_shrinking = true,
44 };
45 
46 static const struct rhashtable_params br_sg_port_rht_params = {
47 	.head_offset = offsetof(struct net_bridge_port_group, rhnode),
48 	.key_offset = offsetof(struct net_bridge_port_group, key),
49 	.key_len = sizeof(struct net_bridge_port_group_sg_key),
50 	.automatic_shrinking = true,
51 };
52 
53 static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
54 				       struct bridge_mcast_own_query *query);
55 static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx,
56 					struct net_bridge_mcast_port *pmctx);
57 static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx,
58 					 struct net_bridge_mcast_port *pmctx,
59 					 __be32 group,
60 					 __u16 vid,
61 					 const unsigned char *src);
62 static void br_multicast_port_group_rexmit(struct timer_list *t);
63 
64 static void
65 br_multicast_rport_del_notify(struct net_bridge_mcast_port *pmctx, bool deleted);
66 static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx,
67 					struct net_bridge_mcast_port *pmctx);
68 #if IS_ENABLED(CONFIG_IPV6)
69 static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx,
70 					 struct net_bridge_mcast_port *pmctx,
71 					 const struct in6_addr *group,
72 					 __u16 vid, const unsigned char *src);
73 #endif
74 static struct net_bridge_port_group *
75 __br_multicast_add_group(struct net_bridge_mcast *brmctx,
76 			 struct net_bridge_mcast_port *pmctx,
77 			 struct br_ip *group,
78 			 const unsigned char *src,
79 			 u8 filter_mode,
80 			 bool igmpv2_mldv1,
81 			 bool blocked);
82 static void br_multicast_find_del_pg(struct net_bridge *br,
83 				     struct net_bridge_port_group *pg);
84 static void __br_multicast_stop(struct net_bridge_mcast *brmctx);
85 
86 static int br_mc_disabled_update(struct net_device *dev, bool value,
87 				 struct netlink_ext_ack *extack);
88 
89 static struct net_bridge_port_group *
br_sg_port_find(struct net_bridge * br,struct net_bridge_port_group_sg_key * sg_p)90 br_sg_port_find(struct net_bridge *br,
91 		struct net_bridge_port_group_sg_key *sg_p)
92 {
93 	lockdep_assert_held_once(&br->multicast_lock);
94 
95 	return rhashtable_lookup_fast(&br->sg_port_tbl, sg_p,
96 				      br_sg_port_rht_params);
97 }
98 
br_mdb_ip_get_rcu(struct net_bridge * br,struct br_ip * dst)99 static struct net_bridge_mdb_entry *br_mdb_ip_get_rcu(struct net_bridge *br,
100 						      struct br_ip *dst)
101 {
102 	return rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params);
103 }
104 
br_mdb_ip_get(struct net_bridge * br,struct br_ip * dst)105 struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge *br,
106 					   struct br_ip *dst)
107 {
108 	struct net_bridge_mdb_entry *ent;
109 
110 	lockdep_assert_held_once(&br->multicast_lock);
111 
112 	rcu_read_lock();
113 	ent = rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params);
114 	rcu_read_unlock();
115 
116 	return ent;
117 }
118 
br_mdb_ip4_get(struct net_bridge * br,__be32 dst,__u16 vid)119 static struct net_bridge_mdb_entry *br_mdb_ip4_get(struct net_bridge *br,
120 						   __be32 dst, __u16 vid)
121 {
122 	struct br_ip br_dst;
123 
124 	memset(&br_dst, 0, sizeof(br_dst));
125 	br_dst.dst.ip4 = dst;
126 	br_dst.proto = htons(ETH_P_IP);
127 	br_dst.vid = vid;
128 
129 	return br_mdb_ip_get(br, &br_dst);
130 }
131 
132 #if IS_ENABLED(CONFIG_IPV6)
br_mdb_ip6_get(struct net_bridge * br,const struct in6_addr * dst,__u16 vid)133 static struct net_bridge_mdb_entry *br_mdb_ip6_get(struct net_bridge *br,
134 						   const struct in6_addr *dst,
135 						   __u16 vid)
136 {
137 	struct br_ip br_dst;
138 
139 	memset(&br_dst, 0, sizeof(br_dst));
140 	br_dst.dst.ip6 = *dst;
141 	br_dst.proto = htons(ETH_P_IPV6);
142 	br_dst.vid = vid;
143 
144 	return br_mdb_ip_get(br, &br_dst);
145 }
146 #endif
147 
148 struct net_bridge_mdb_entry *
br_mdb_entry_skb_get(struct net_bridge_mcast * brmctx,struct sk_buff * skb,u16 vid)149 br_mdb_entry_skb_get(struct net_bridge_mcast *brmctx, struct sk_buff *skb,
150 		     u16 vid)
151 {
152 	struct net_bridge *br = brmctx->br;
153 	struct br_ip ip;
154 
155 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
156 	    br_multicast_ctx_vlan_global_disabled(brmctx))
157 		return NULL;
158 
159 	if (BR_INPUT_SKB_CB(skb)->igmp)
160 		return NULL;
161 
162 	memset(&ip, 0, sizeof(ip));
163 	ip.proto = skb->protocol;
164 	ip.vid = vid;
165 
166 	switch (skb->protocol) {
167 	case htons(ETH_P_IP):
168 		ip.dst.ip4 = ip_hdr(skb)->daddr;
169 		if (brmctx->multicast_igmp_version == 3) {
170 			struct net_bridge_mdb_entry *mdb;
171 
172 			ip.src.ip4 = ip_hdr(skb)->saddr;
173 			mdb = br_mdb_ip_get_rcu(br, &ip);
174 			if (mdb)
175 				return mdb;
176 			ip.src.ip4 = 0;
177 		}
178 		break;
179 #if IS_ENABLED(CONFIG_IPV6)
180 	case htons(ETH_P_IPV6):
181 		ip.dst.ip6 = ipv6_hdr(skb)->daddr;
182 		if (brmctx->multicast_mld_version == 2) {
183 			struct net_bridge_mdb_entry *mdb;
184 
185 			ip.src.ip6 = ipv6_hdr(skb)->saddr;
186 			mdb = br_mdb_ip_get_rcu(br, &ip);
187 			if (mdb)
188 				return mdb;
189 			memset(&ip.src.ip6, 0, sizeof(ip.src.ip6));
190 		}
191 		break;
192 #endif
193 	default:
194 		ip.proto = 0;
195 		ether_addr_copy(ip.dst.mac_addr, eth_hdr(skb)->h_dest);
196 	}
197 
198 	return br_mdb_ip_get_rcu(br, &ip);
199 }
200 
201 /* IMPORTANT: this function must be used only when the contexts cannot be
202  * passed down (e.g. timer) and must be used for read-only purposes because
203  * the vlan snooping option can change, so it can return any context
204  * (non-vlan or vlan). Its initial intended purpose is to read timer values
205  * from the *current* context based on the option. At worst that could lead
206  * to inconsistent timers when the contexts are changed, i.e. src timer
207  * which needs to re-arm with a specific delay taken from the old context
208  */
209 static struct net_bridge_mcast_port *
br_multicast_pg_to_port_ctx(const struct net_bridge_port_group * pg)210 br_multicast_pg_to_port_ctx(const struct net_bridge_port_group *pg)
211 {
212 	struct net_bridge_mcast_port *pmctx = &pg->key.port->multicast_ctx;
213 	struct net_bridge_vlan *vlan;
214 
215 	lockdep_assert_held_once(&pg->key.port->br->multicast_lock);
216 
217 	/* if vlan snooping is disabled use the port's multicast context */
218 	if (!pg->key.addr.vid ||
219 	    !br_opt_get(pg->key.port->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED))
220 		goto out;
221 
222 	/* locking is tricky here, due to different rules for multicast and
223 	 * vlans we need to take rcu to find the vlan and make sure it has
224 	 * the BR_VLFLAG_MCAST_ENABLED flag set, it can only change under
225 	 * multicast_lock which must be already held here, so the vlan's pmctx
226 	 * can safely be used on return
227 	 */
228 	rcu_read_lock();
229 	vlan = br_vlan_find(nbp_vlan_group_rcu(pg->key.port), pg->key.addr.vid);
230 	if (vlan && !br_multicast_port_ctx_vlan_disabled(&vlan->port_mcast_ctx))
231 		pmctx = &vlan->port_mcast_ctx;
232 	else
233 		pmctx = NULL;
234 	rcu_read_unlock();
235 out:
236 	return pmctx;
237 }
238 
239 static struct net_bridge_mcast_port *
br_multicast_port_vid_to_port_ctx(struct net_bridge_port * port,u16 vid)240 br_multicast_port_vid_to_port_ctx(struct net_bridge_port *port, u16 vid)
241 {
242 	struct net_bridge_mcast_port *pmctx = NULL;
243 	struct net_bridge_vlan *vlan;
244 
245 	lockdep_assert_held_once(&port->br->multicast_lock);
246 
247 	/* Take RCU to access the vlan. */
248 	rcu_read_lock();
249 
250 	vlan = br_vlan_find(nbp_vlan_group_rcu(port), vid);
251 	if (vlan)
252 		pmctx = &vlan->port_mcast_ctx;
253 
254 	rcu_read_unlock();
255 
256 	return pmctx;
257 }
258 
259 /* when snooping we need to check if the contexts should be used
260  * in the following order:
261  * - if pmctx is non-NULL (port), check if it should be used
262  * - if pmctx is NULL (bridge), check if brmctx should be used
263  */
264 static bool
br_multicast_ctx_should_use(const struct net_bridge_mcast * brmctx,const struct net_bridge_mcast_port * pmctx)265 br_multicast_ctx_should_use(const struct net_bridge_mcast *brmctx,
266 			    const struct net_bridge_mcast_port *pmctx)
267 {
268 	if (!netif_running(brmctx->br->dev))
269 		return false;
270 
271 	if (pmctx)
272 		return !br_multicast_port_ctx_state_disabled(pmctx);
273 	else
274 		return !br_multicast_ctx_vlan_disabled(brmctx);
275 }
276 
br_port_group_equal(struct net_bridge_port_group * p,struct net_bridge_port * port,const unsigned char * src)277 static bool br_port_group_equal(struct net_bridge_port_group *p,
278 				struct net_bridge_port *port,
279 				const unsigned char *src)
280 {
281 	if (p->key.port != port)
282 		return false;
283 
284 	if (!test_bit(BR_MULTICAST_TO_UNICAST_BIT, &port->flags))
285 		return true;
286 
287 	return ether_addr_equal(src, p->eth_addr);
288 }
289 
__fwd_add_star_excl(struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,struct br_ip * sg_ip)290 static void __fwd_add_star_excl(struct net_bridge_mcast_port *pmctx,
291 				struct net_bridge_port_group *pg,
292 				struct br_ip *sg_ip)
293 {
294 	struct net_bridge_port_group_sg_key sg_key;
295 	struct net_bridge_port_group *src_pg;
296 	struct net_bridge_mcast *brmctx;
297 
298 	memset(&sg_key, 0, sizeof(sg_key));
299 	brmctx = br_multicast_port_ctx_get_global(pmctx);
300 	sg_key.port = pg->key.port;
301 	sg_key.addr = *sg_ip;
302 	if (br_sg_port_find(brmctx->br, &sg_key))
303 		return;
304 
305 	src_pg = __br_multicast_add_group(brmctx, pmctx,
306 					  sg_ip, pg->eth_addr,
307 					  MCAST_INCLUDE, false, false);
308 	if (IS_ERR_OR_NULL(src_pg) ||
309 	    src_pg->rt_protocol != RTPROT_KERNEL)
310 		return;
311 
312 	src_pg->flags |= MDB_PG_FLAGS_STAR_EXCL;
313 }
314 
__fwd_del_star_excl(struct net_bridge_port_group * pg,struct br_ip * sg_ip)315 static void __fwd_del_star_excl(struct net_bridge_port_group *pg,
316 				struct br_ip *sg_ip)
317 {
318 	struct net_bridge_port_group_sg_key sg_key;
319 	struct net_bridge *br = pg->key.port->br;
320 	struct net_bridge_port_group *src_pg;
321 
322 	memset(&sg_key, 0, sizeof(sg_key));
323 	sg_key.port = pg->key.port;
324 	sg_key.addr = *sg_ip;
325 	src_pg = br_sg_port_find(br, &sg_key);
326 	if (!src_pg || !(src_pg->flags & MDB_PG_FLAGS_STAR_EXCL) ||
327 	    src_pg->rt_protocol != RTPROT_KERNEL)
328 		return;
329 
330 	br_multicast_find_del_pg(br, src_pg);
331 }
332 
333 /* When a port group transitions to (or is added as) EXCLUDE we need to add it
334  * to all other ports' S,G entries which are not blocked by the current group
335  * for proper replication, the assumption is that any S,G blocked entries
336  * are already added so the S,G,port lookup should skip them.
337  * When a port group transitions from EXCLUDE -> INCLUDE mode or is being
338  * deleted we need to remove it from all ports' S,G entries where it was
339  * automatically installed before (i.e. where it's MDB_PG_FLAGS_STAR_EXCL).
340  */
br_multicast_star_g_handle_mode(struct net_bridge_port_group * pg,u8 filter_mode)341 void br_multicast_star_g_handle_mode(struct net_bridge_port_group *pg,
342 				     u8 filter_mode)
343 {
344 	struct net_bridge *br = pg->key.port->br;
345 	struct net_bridge_port_group *pg_lst;
346 	struct net_bridge_mcast_port *pmctx;
347 	struct net_bridge_mdb_entry *mp;
348 	struct br_ip sg_ip;
349 
350 	if (WARN_ON(!br_multicast_is_star_g(&pg->key.addr)))
351 		return;
352 
353 	mp = br_mdb_ip_get(br, &pg->key.addr);
354 	if (!mp)
355 		return;
356 	pmctx = br_multicast_pg_to_port_ctx(pg);
357 	if (!pmctx)
358 		return;
359 
360 	memset(&sg_ip, 0, sizeof(sg_ip));
361 	sg_ip = pg->key.addr;
362 
363 	for (pg_lst = mlock_dereference(mp->ports, br);
364 	     pg_lst;
365 	     pg_lst = mlock_dereference(pg_lst->next, br)) {
366 		struct net_bridge_group_src *src_ent;
367 
368 		if (pg_lst == pg)
369 			continue;
370 		hlist_for_each_entry(src_ent, &pg_lst->src_list, node) {
371 			if (!(src_ent->flags & BR_SGRP_F_INSTALLED))
372 				continue;
373 			sg_ip.src = src_ent->addr.src;
374 			switch (filter_mode) {
375 			case MCAST_INCLUDE:
376 				__fwd_del_star_excl(pg, &sg_ip);
377 				break;
378 			case MCAST_EXCLUDE:
379 				__fwd_add_star_excl(pmctx, pg, &sg_ip);
380 				break;
381 			}
382 		}
383 	}
384 }
385 
386 /* called when adding a new S,G with host_joined == false by default */
br_multicast_sg_host_state(struct net_bridge_mdb_entry * star_mp,struct net_bridge_port_group * sg)387 static void br_multicast_sg_host_state(struct net_bridge_mdb_entry *star_mp,
388 				       struct net_bridge_port_group *sg)
389 {
390 	struct net_bridge_mdb_entry *sg_mp;
391 
392 	if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
393 		return;
394 	if (!star_mp->host_joined)
395 		return;
396 
397 	sg_mp = br_mdb_ip_get(star_mp->br, &sg->key.addr);
398 	if (!sg_mp)
399 		return;
400 	sg_mp->host_joined = true;
401 }
402 
403 /* set the host_joined state of all of *,G's S,G entries */
br_multicast_star_g_host_state(struct net_bridge_mdb_entry * star_mp)404 static void br_multicast_star_g_host_state(struct net_bridge_mdb_entry *star_mp)
405 {
406 	struct net_bridge *br = star_mp->br;
407 	struct net_bridge_mdb_entry *sg_mp;
408 	struct net_bridge_port_group *pg;
409 	struct br_ip sg_ip;
410 
411 	if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
412 		return;
413 
414 	memset(&sg_ip, 0, sizeof(sg_ip));
415 	sg_ip = star_mp->addr;
416 	for (pg = mlock_dereference(star_mp->ports, br);
417 	     pg;
418 	     pg = mlock_dereference(pg->next, br)) {
419 		struct net_bridge_group_src *src_ent;
420 
421 		hlist_for_each_entry(src_ent, &pg->src_list, node) {
422 			if (!(src_ent->flags & BR_SGRP_F_INSTALLED))
423 				continue;
424 			sg_ip.src = src_ent->addr.src;
425 			sg_mp = br_mdb_ip_get(br, &sg_ip);
426 			if (!sg_mp)
427 				continue;
428 			sg_mp->host_joined = star_mp->host_joined;
429 		}
430 	}
431 }
432 
br_multicast_sg_del_exclude_ports(struct net_bridge_mdb_entry * sgmp)433 static void br_multicast_sg_del_exclude_ports(struct net_bridge_mdb_entry *sgmp)
434 {
435 	struct net_bridge_port_group __rcu **pp;
436 	struct net_bridge_port_group *p;
437 
438 	/* *,G exclude ports are only added to S,G entries */
439 	if (WARN_ON(br_multicast_is_star_g(&sgmp->addr)))
440 		return;
441 
442 	/* we need the STAR_EXCLUDE ports if there are non-STAR_EXCLUDE ports
443 	 * we should ignore perm entries since they're managed by user-space
444 	 */
445 	for (pp = &sgmp->ports;
446 	     (p = mlock_dereference(*pp, sgmp->br)) != NULL;
447 	     pp = &p->next)
448 		if (!(p->flags & (MDB_PG_FLAGS_STAR_EXCL |
449 				  MDB_PG_FLAGS_PERMANENT)))
450 			return;
451 
452 	/* currently the host can only have joined the *,G which means
453 	 * we treat it as EXCLUDE {}, so for an S,G it's considered a
454 	 * STAR_EXCLUDE entry and we can safely leave it
455 	 */
456 	sgmp->host_joined = false;
457 
458 	for (pp = &sgmp->ports;
459 	     (p = mlock_dereference(*pp, sgmp->br)) != NULL;) {
460 		if (!(p->flags & MDB_PG_FLAGS_PERMANENT))
461 			br_multicast_del_pg(sgmp, p, pp);
462 		else
463 			pp = &p->next;
464 	}
465 }
466 
br_multicast_sg_add_exclude_ports(struct net_bridge_mdb_entry * star_mp,struct net_bridge_port_group * sg)467 void br_multicast_sg_add_exclude_ports(struct net_bridge_mdb_entry *star_mp,
468 				       struct net_bridge_port_group *sg)
469 {
470 	struct net_bridge_port_group_sg_key sg_key;
471 	struct net_bridge *br = star_mp->br;
472 	struct net_bridge_mcast_port *pmctx;
473 	struct net_bridge_port_group *pg;
474 	struct net_bridge_mcast *brmctx;
475 
476 	if (WARN_ON(br_multicast_is_star_g(&sg->key.addr)))
477 		return;
478 	if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
479 		return;
480 
481 	br_multicast_sg_host_state(star_mp, sg);
482 	memset(&sg_key, 0, sizeof(sg_key));
483 	sg_key.addr = sg->key.addr;
484 	/* we need to add all exclude ports to the S,G */
485 	for (pg = mlock_dereference(star_mp->ports, br);
486 	     pg;
487 	     pg = mlock_dereference(pg->next, br)) {
488 		struct net_bridge_port_group *src_pg;
489 
490 		if (pg == sg || pg->filter_mode == MCAST_INCLUDE)
491 			continue;
492 
493 		sg_key.port = pg->key.port;
494 		if (br_sg_port_find(br, &sg_key))
495 			continue;
496 
497 		pmctx = br_multicast_pg_to_port_ctx(pg);
498 		if (!pmctx)
499 			continue;
500 		brmctx = br_multicast_port_ctx_get_global(pmctx);
501 
502 		src_pg = __br_multicast_add_group(brmctx, pmctx,
503 						  &sg->key.addr,
504 						  sg->eth_addr,
505 						  MCAST_INCLUDE, false, false);
506 		if (IS_ERR_OR_NULL(src_pg) ||
507 		    src_pg->rt_protocol != RTPROT_KERNEL)
508 			continue;
509 		src_pg->flags |= MDB_PG_FLAGS_STAR_EXCL;
510 	}
511 }
512 
br_multicast_fwd_src_add(struct net_bridge_group_src * src)513 static void br_multicast_fwd_src_add(struct net_bridge_group_src *src)
514 {
515 	struct net_bridge_mdb_entry *star_mp;
516 	struct net_bridge_mcast_port *pmctx;
517 	struct net_bridge_port_group *sg;
518 	struct net_bridge_mcast *brmctx;
519 	struct br_ip sg_ip;
520 
521 	if (src->flags & BR_SGRP_F_INSTALLED)
522 		return;
523 
524 	memset(&sg_ip, 0, sizeof(sg_ip));
525 	pmctx = br_multicast_pg_to_port_ctx(src->pg);
526 	if (!pmctx)
527 		return;
528 	brmctx = br_multicast_port_ctx_get_global(pmctx);
529 	sg_ip = src->pg->key.addr;
530 	sg_ip.src = src->addr.src;
531 
532 	sg = __br_multicast_add_group(brmctx, pmctx, &sg_ip,
533 				      src->pg->eth_addr, MCAST_INCLUDE, false,
534 				      !timer_pending(&src->timer));
535 	if (IS_ERR_OR_NULL(sg))
536 		return;
537 	src->flags |= BR_SGRP_F_INSTALLED;
538 	sg->flags &= ~MDB_PG_FLAGS_STAR_EXCL;
539 
540 	/* if it was added by user-space as perm we can skip next steps */
541 	if (sg->rt_protocol != RTPROT_KERNEL &&
542 	    (sg->flags & MDB_PG_FLAGS_PERMANENT))
543 		return;
544 
545 	/* the kernel is now responsible for removing this S,G */
546 	timer_delete(&sg->timer);
547 	star_mp = br_mdb_ip_get(src->br, &src->pg->key.addr);
548 	if (!star_mp)
549 		return;
550 
551 	br_multicast_sg_add_exclude_ports(star_mp, sg);
552 }
553 
br_multicast_fwd_src_remove(struct net_bridge_group_src * src,bool fastleave)554 static void br_multicast_fwd_src_remove(struct net_bridge_group_src *src,
555 					bool fastleave)
556 {
557 	struct net_bridge_port_group *p, *pg = src->pg;
558 	struct net_bridge_port_group __rcu **pp;
559 	struct net_bridge_mdb_entry *mp;
560 	struct br_ip sg_ip;
561 
562 	memset(&sg_ip, 0, sizeof(sg_ip));
563 	sg_ip = pg->key.addr;
564 	sg_ip.src = src->addr.src;
565 
566 	mp = br_mdb_ip_get(src->br, &sg_ip);
567 	if (!mp)
568 		return;
569 
570 	for (pp = &mp->ports;
571 	     (p = mlock_dereference(*pp, src->br)) != NULL;
572 	     pp = &p->next) {
573 		if (!br_port_group_equal(p, pg->key.port, pg->eth_addr))
574 			continue;
575 
576 		if (p->rt_protocol != RTPROT_KERNEL &&
577 		    (p->flags & MDB_PG_FLAGS_PERMANENT) &&
578 		    !(src->flags & BR_SGRP_F_USER_ADDED))
579 			break;
580 
581 		if (fastleave)
582 			p->flags |= MDB_PG_FLAGS_FAST_LEAVE;
583 		br_multicast_del_pg(mp, p, pp);
584 		break;
585 	}
586 	src->flags &= ~BR_SGRP_F_INSTALLED;
587 }
588 
589 /* install S,G and based on src's timer enable or disable forwarding */
br_multicast_fwd_src_handle(struct net_bridge_group_src * src)590 static void br_multicast_fwd_src_handle(struct net_bridge_group_src *src)
591 {
592 	struct net_bridge_port_group_sg_key sg_key;
593 	struct net_bridge_port_group *sg;
594 	u8 old_flags;
595 
596 	br_multicast_fwd_src_add(src);
597 
598 	memset(&sg_key, 0, sizeof(sg_key));
599 	sg_key.addr = src->pg->key.addr;
600 	sg_key.addr.src = src->addr.src;
601 	sg_key.port = src->pg->key.port;
602 
603 	sg = br_sg_port_find(src->br, &sg_key);
604 	if (!sg || (sg->flags & MDB_PG_FLAGS_PERMANENT))
605 		return;
606 
607 	old_flags = sg->flags;
608 	if (timer_pending(&src->timer))
609 		sg->flags &= ~MDB_PG_FLAGS_BLOCKED;
610 	else
611 		sg->flags |= MDB_PG_FLAGS_BLOCKED;
612 
613 	if (old_flags != sg->flags) {
614 		struct net_bridge_mdb_entry *sg_mp;
615 
616 		sg_mp = br_mdb_ip_get(src->br, &sg_key.addr);
617 		if (!sg_mp)
618 			return;
619 		br_mdb_notify(src->br->dev, sg_mp, sg, RTM_NEWMDB);
620 	}
621 }
622 
br_multicast_destroy_mdb_entry(struct net_bridge_mcast_gc * gc)623 static void br_multicast_destroy_mdb_entry(struct net_bridge_mcast_gc *gc)
624 {
625 	struct net_bridge_mdb_entry *mp;
626 
627 	mp = container_of(gc, struct net_bridge_mdb_entry, mcast_gc);
628 	WARN_ON(!hlist_unhashed(&mp->mdb_node));
629 	WARN_ON(mp->ports);
630 
631 	timer_shutdown_sync(&mp->timer);
632 	kfree_rcu(mp, rcu);
633 }
634 
br_multicast_del_mdb_entry(struct net_bridge_mdb_entry * mp)635 static void br_multicast_del_mdb_entry(struct net_bridge_mdb_entry *mp)
636 {
637 	struct net_bridge *br = mp->br;
638 
639 	rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode,
640 			       br_mdb_rht_params);
641 	hlist_del_init_rcu(&mp->mdb_node);
642 	hlist_add_head(&mp->mcast_gc.gc_node, &br->mcast_gc_list);
643 	queue_work(system_long_wq, &br->mcast_gc_work);
644 }
645 
br_multicast_group_expired(struct timer_list * t)646 static void br_multicast_group_expired(struct timer_list *t)
647 {
648 	struct net_bridge_mdb_entry *mp = timer_container_of(mp, t, timer);
649 	struct net_bridge *br = mp->br;
650 
651 	spin_lock(&br->multicast_lock);
652 	if (hlist_unhashed(&mp->mdb_node) || !netif_running(br->dev) ||
653 	    timer_pending(&mp->timer))
654 		goto out;
655 
656 	br_multicast_host_leave(mp, true);
657 
658 	if (mp->ports)
659 		goto out;
660 	br_multicast_del_mdb_entry(mp);
661 out:
662 	spin_unlock(&br->multicast_lock);
663 }
664 
br_multicast_destroy_group_src(struct net_bridge_mcast_gc * gc)665 static void br_multicast_destroy_group_src(struct net_bridge_mcast_gc *gc)
666 {
667 	struct net_bridge_group_src *src;
668 
669 	src = container_of(gc, struct net_bridge_group_src, mcast_gc);
670 	WARN_ON(!hlist_unhashed(&src->node));
671 
672 	timer_shutdown_sync(&src->timer);
673 	kfree_rcu(src, rcu);
674 }
675 
__br_multicast_del_group_src(struct net_bridge_group_src * src)676 void __br_multicast_del_group_src(struct net_bridge_group_src *src)
677 {
678 	struct net_bridge *br = src->pg->key.port->br;
679 
680 	hlist_del_init_rcu(&src->node);
681 	src->pg->src_ents--;
682 	hlist_add_head(&src->mcast_gc.gc_node, &br->mcast_gc_list);
683 	queue_work(system_long_wq, &br->mcast_gc_work);
684 }
685 
br_multicast_del_group_src(struct net_bridge_group_src * src,bool fastleave)686 void br_multicast_del_group_src(struct net_bridge_group_src *src,
687 				bool fastleave)
688 {
689 	br_multicast_fwd_src_remove(src, fastleave);
690 	__br_multicast_del_group_src(src);
691 }
692 
693 static int
br_multicast_port_ngroups_inc_one(struct net_bridge_mcast_port * pmctx,struct netlink_ext_ack * extack,const char * what)694 br_multicast_port_ngroups_inc_one(struct net_bridge_mcast_port *pmctx,
695 				  struct netlink_ext_ack *extack,
696 				  const char *what)
697 {
698 	u32 max = READ_ONCE(pmctx->mdb_max_entries);
699 	u32 n = READ_ONCE(pmctx->mdb_n_entries);
700 
701 	/* enforce the max limit when it's a port pmctx or a port-vlan pmctx
702 	 * with snooping enabled
703 	 */
704 	if (!br_multicast_port_ctx_vlan_disabled(pmctx) && max && n >= max) {
705 		NL_SET_ERR_MSG_FMT_MOD(extack, "%s is already in %u groups, and mcast_max_groups=%u",
706 				       what, n, max);
707 		return -E2BIG;
708 	}
709 
710 	WRITE_ONCE(pmctx->mdb_n_entries, n + 1);
711 	return 0;
712 }
713 
br_multicast_port_ngroups_dec_one(struct net_bridge_mcast_port * pmctx)714 static void br_multicast_port_ngroups_dec_one(struct net_bridge_mcast_port *pmctx)
715 {
716 	u32 n = READ_ONCE(pmctx->mdb_n_entries);
717 
718 	WARN_ON_ONCE(n == 0);
719 	WRITE_ONCE(pmctx->mdb_n_entries, n - 1);
720 }
721 
br_multicast_port_ngroups_inc(struct net_bridge_port * port,const struct br_ip * group,struct netlink_ext_ack * extack)722 static int br_multicast_port_ngroups_inc(struct net_bridge_port *port,
723 					 const struct br_ip *group,
724 					 struct netlink_ext_ack *extack)
725 {
726 	struct net_bridge_mcast_port *pmctx;
727 	int err;
728 
729 	lockdep_assert_held_once(&port->br->multicast_lock);
730 
731 	/* Always count on the port context. */
732 	err = br_multicast_port_ngroups_inc_one(&port->multicast_ctx, extack,
733 						"Port");
734 	if (err) {
735 		trace_br_mdb_full(port->dev, group);
736 		return err;
737 	}
738 
739 	/* Only count on the VLAN context if VID is given */
740 	if (!group->vid)
741 		return 0;
742 
743 	pmctx = br_multicast_port_vid_to_port_ctx(port, group->vid);
744 	if (!pmctx)
745 		return 0;
746 
747 	err = br_multicast_port_ngroups_inc_one(pmctx, extack, "Port-VLAN");
748 	if (err) {
749 		trace_br_mdb_full(port->dev, group);
750 		goto dec_one_out;
751 	}
752 
753 	return 0;
754 
755 dec_one_out:
756 	br_multicast_port_ngroups_dec_one(&port->multicast_ctx);
757 	return err;
758 }
759 
br_multicast_port_ngroups_dec(struct net_bridge_port * port,u16 vid)760 static void br_multicast_port_ngroups_dec(struct net_bridge_port *port, u16 vid)
761 {
762 	struct net_bridge_mcast_port *pmctx;
763 
764 	lockdep_assert_held_once(&port->br->multicast_lock);
765 
766 	if (vid) {
767 		pmctx = br_multicast_port_vid_to_port_ctx(port, vid);
768 		if (pmctx)
769 			br_multicast_port_ngroups_dec_one(pmctx);
770 	}
771 	br_multicast_port_ngroups_dec_one(&port->multicast_ctx);
772 }
773 
br_multicast_ngroups_get(const struct net_bridge_mcast_port * pmctx)774 u32 br_multicast_ngroups_get(const struct net_bridge_mcast_port *pmctx)
775 {
776 	return READ_ONCE(pmctx->mdb_n_entries);
777 }
778 
br_multicast_ngroups_set_max(struct net_bridge_mcast_port * pmctx,u32 max)779 void br_multicast_ngroups_set_max(struct net_bridge_mcast_port *pmctx, u32 max)
780 {
781 	WRITE_ONCE(pmctx->mdb_max_entries, max);
782 }
783 
br_multicast_ngroups_get_max(const struct net_bridge_mcast_port * pmctx)784 u32 br_multicast_ngroups_get_max(const struct net_bridge_mcast_port *pmctx)
785 {
786 	return READ_ONCE(pmctx->mdb_max_entries);
787 }
788 
br_multicast_destroy_port_group(struct net_bridge_mcast_gc * gc)789 static void br_multicast_destroy_port_group(struct net_bridge_mcast_gc *gc)
790 {
791 	struct net_bridge_port_group *pg;
792 
793 	pg = container_of(gc, struct net_bridge_port_group, mcast_gc);
794 	WARN_ON(!hlist_unhashed(&pg->mglist));
795 	WARN_ON(!hlist_empty(&pg->src_list));
796 
797 	timer_shutdown_sync(&pg->rexmit_timer);
798 	timer_shutdown_sync(&pg->timer);
799 	kfree_rcu(pg, rcu);
800 }
801 
br_multicast_del_pg(struct net_bridge_mdb_entry * mp,struct net_bridge_port_group * pg,struct net_bridge_port_group __rcu ** pp)802 void br_multicast_del_pg(struct net_bridge_mdb_entry *mp,
803 			 struct net_bridge_port_group *pg,
804 			 struct net_bridge_port_group __rcu **pp)
805 {
806 	struct net_bridge *br = pg->key.port->br;
807 	struct net_bridge_group_src *ent;
808 	struct hlist_node *tmp;
809 
810 	rcu_assign_pointer(*pp, pg->next);
811 	/* Keep ->next (held under multicast_lock, freed later by the GC work):
812 	 * a port->mglist teardown walk may have latched this node as its next,
813 	 * and deleting other groups of the same port must not truncate it.
814 	 */
815 	hlist_del_init_rcu(&pg->mglist);
816 	br_multicast_eht_clean_sets(pg);
817 	hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node)
818 		br_multicast_del_group_src(ent, false);
819 	br_mdb_notify(br->dev, mp, pg, RTM_DELMDB);
820 	if (!br_multicast_is_star_g(&mp->addr)) {
821 		rhashtable_remove_fast(&br->sg_port_tbl, &pg->rhnode,
822 				       br_sg_port_rht_params);
823 		br_multicast_sg_del_exclude_ports(mp);
824 	} else {
825 		br_multicast_star_g_handle_mode(pg, MCAST_INCLUDE);
826 	}
827 	br_multicast_port_ngroups_dec(pg->key.port, pg->key.addr.vid);
828 	hlist_add_head(&pg->mcast_gc.gc_node, &br->mcast_gc_list);
829 	queue_work(system_long_wq, &br->mcast_gc_work);
830 
831 	if (!mp->ports && !mp->host_joined && netif_running(br->dev))
832 		mod_timer(&mp->timer, jiffies);
833 }
834 
br_multicast_find_del_pg(struct net_bridge * br,struct net_bridge_port_group * pg)835 static void br_multicast_find_del_pg(struct net_bridge *br,
836 				     struct net_bridge_port_group *pg)
837 {
838 	struct net_bridge_port_group __rcu **pp;
839 	struct net_bridge_mdb_entry *mp;
840 	struct net_bridge_port_group *p;
841 
842 	/* A teardown walk over port->mglist can reach a group that an earlier
843 	 * iteration already deleted as a side effect. It is off mp->ports by
844 	 * now, so skip it instead of falling through to the WARN_ON() below.
845 	 */
846 	if (hlist_unhashed(&pg->mglist))
847 		return;
848 
849 	mp = br_mdb_ip_get(br, &pg->key.addr);
850 	if (WARN_ON(!mp))
851 		return;
852 
853 	for (pp = &mp->ports;
854 	     (p = mlock_dereference(*pp, br)) != NULL;
855 	     pp = &p->next) {
856 		if (p != pg)
857 			continue;
858 
859 		br_multicast_del_pg(mp, pg, pp);
860 		return;
861 	}
862 
863 	WARN_ON(1);
864 }
865 
br_multicast_port_group_expired(struct timer_list * t)866 static void br_multicast_port_group_expired(struct timer_list *t)
867 {
868 	struct net_bridge_port_group *pg = timer_container_of(pg, t, timer);
869 	struct net_bridge_group_src *src_ent;
870 	struct net_bridge *br = pg->key.port->br;
871 	struct hlist_node *tmp;
872 	bool changed;
873 
874 	spin_lock(&br->multicast_lock);
875 	if (!netif_running(br->dev) || timer_pending(&pg->timer) ||
876 	    hlist_unhashed(&pg->mglist) || pg->flags & MDB_PG_FLAGS_PERMANENT)
877 		goto out;
878 
879 	changed = !!(pg->filter_mode == MCAST_EXCLUDE);
880 	pg->filter_mode = MCAST_INCLUDE;
881 	hlist_for_each_entry_safe(src_ent, tmp, &pg->src_list, node) {
882 		if (!timer_pending(&src_ent->timer)) {
883 			br_multicast_del_group_src(src_ent, false);
884 			changed = true;
885 		}
886 	}
887 
888 	if (hlist_empty(&pg->src_list)) {
889 		br_multicast_find_del_pg(br, pg);
890 	} else if (changed) {
891 		struct net_bridge_mdb_entry *mp = br_mdb_ip_get(br, &pg->key.addr);
892 
893 		if (changed && br_multicast_is_star_g(&pg->key.addr))
894 			br_multicast_star_g_handle_mode(pg, MCAST_INCLUDE);
895 
896 		if (WARN_ON(!mp))
897 			goto out;
898 		br_mdb_notify(br->dev, mp, pg, RTM_NEWMDB);
899 	}
900 out:
901 	spin_unlock(&br->multicast_lock);
902 }
903 
br_multicast_gc(struct hlist_head * head)904 static void br_multicast_gc(struct hlist_head *head)
905 {
906 	struct net_bridge_mcast_gc *gcent;
907 	struct hlist_node *tmp;
908 
909 	hlist_for_each_entry_safe(gcent, tmp, head, gc_node) {
910 		hlist_del_init(&gcent->gc_node);
911 		gcent->destroy(gcent);
912 	}
913 }
914 
__br_multicast_query_handle_vlan(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb)915 static void __br_multicast_query_handle_vlan(struct net_bridge_mcast *brmctx,
916 					     struct net_bridge_mcast_port *pmctx,
917 					     struct sk_buff *skb)
918 {
919 	struct net_bridge_vlan *vlan = NULL;
920 
921 	if (pmctx && br_multicast_port_ctx_is_vlan(pmctx))
922 		vlan = pmctx->vlan;
923 	else if (br_multicast_ctx_is_vlan(brmctx))
924 		vlan = brmctx->vlan;
925 
926 	if (vlan && !(vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED)) {
927 		u16 vlan_proto;
928 
929 		if (br_vlan_get_proto(brmctx->br->dev, &vlan_proto) != 0)
930 			return;
931 		__vlan_hwaccel_put_tag(skb, htons(vlan_proto), vlan->vid);
932 	}
933 }
934 
br_ip4_multicast_alloc_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,__be32 ip_dst,__be32 group,bool with_srcs,bool over_lmqt,u8 sflag,bool * need_rexmit)935 static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge_mcast *brmctx,
936 						    struct net_bridge_mcast_port *pmctx,
937 						    struct net_bridge_port_group *pg,
938 						    __be32 ip_dst, __be32 group,
939 						    bool with_srcs, bool over_lmqt,
940 						    u8 sflag,
941 						    bool *need_rexmit)
942 {
943 	struct net_bridge_port *p = pg ? pg->key.port : NULL;
944 	struct net_bridge_group_src *ent;
945 	size_t pkt_size, igmp_hdr_size;
946 	unsigned long now = jiffies;
947 	struct igmpv3_query *ihv3;
948 	unsigned long lmqt, mrt;
949 	void *csum_start = NULL;
950 	__sum16 *csum = NULL;
951 	struct sk_buff *skb;
952 	struct igmphdr *ih;
953 	struct ethhdr *eth;
954 	struct iphdr *iph;
955 	u16 lmqt_srcs = 0;
956 
957 	igmp_hdr_size = sizeof(*ih);
958 	if (brmctx->multicast_igmp_version == 3) {
959 		igmp_hdr_size = sizeof(*ihv3);
960 		if (pg && with_srcs) {
961 			lmqt = now + (brmctx->multicast_last_member_interval *
962 				      brmctx->multicast_last_member_count);
963 			hlist_for_each_entry(ent, &pg->src_list, node) {
964 				if (over_lmqt == time_after(ent->timer.expires,
965 							    lmqt) &&
966 				    ent->src_query_rexmit_cnt > 0)
967 					lmqt_srcs++;
968 			}
969 
970 			if (!lmqt_srcs)
971 				return NULL;
972 			igmp_hdr_size += lmqt_srcs * sizeof(__be32);
973 		}
974 	}
975 
976 	pkt_size = sizeof(*eth) + sizeof(*iph) + 4 + igmp_hdr_size;
977 	if ((p && pkt_size > p->dev->mtu) ||
978 	    pkt_size > brmctx->br->dev->mtu)
979 		return NULL;
980 
981 	skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size);
982 	if (!skb)
983 		goto out;
984 
985 	__br_multicast_query_handle_vlan(brmctx, pmctx, skb);
986 	skb->protocol = htons(ETH_P_IP);
987 
988 	skb_reset_mac_header(skb);
989 	eth = eth_hdr(skb);
990 
991 	ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr);
992 	ip_eth_mc_map(ip_dst, eth->h_dest);
993 	eth->h_proto = htons(ETH_P_IP);
994 	skb_put(skb, sizeof(*eth));
995 
996 	skb_set_network_header(skb, skb->len);
997 	iph = ip_hdr(skb);
998 	iph->tot_len = htons(pkt_size - sizeof(*eth));
999 
1000 	iph->version = 4;
1001 	iph->ihl = 6;
1002 	iph->tos = 0xc0;
1003 	iph->id = 0;
1004 	iph->frag_off = htons(IP_DF);
1005 	iph->ttl = 1;
1006 	iph->protocol = IPPROTO_IGMP;
1007 	iph->saddr = br_opt_get(brmctx->br, BROPT_MULTICAST_QUERY_USE_IFADDR) ?
1008 		     inet_select_addr(brmctx->br->dev, 0, RT_SCOPE_LINK) : 0;
1009 	iph->daddr = ip_dst;
1010 	((u8 *)&iph[1])[0] = IPOPT_RA;
1011 	((u8 *)&iph[1])[1] = 4;
1012 	((u8 *)&iph[1])[2] = 0;
1013 	((u8 *)&iph[1])[3] = 0;
1014 	ip_send_check(iph);
1015 	skb_put(skb, 24);
1016 
1017 	skb_set_transport_header(skb, skb->len);
1018 	mrt = group ? brmctx->multicast_last_member_interval :
1019 		      brmctx->multicast_query_response_interval;
1020 
1021 	switch (brmctx->multicast_igmp_version) {
1022 	case 2:
1023 		ih = igmp_hdr(skb);
1024 		ih->type = IGMP_HOST_MEMBERSHIP_QUERY;
1025 		ih->code = mrt / (HZ / IGMP_TIMER_SCALE);
1026 		ih->group = group;
1027 		ih->csum = 0;
1028 		csum = &ih->csum;
1029 		csum_start = (void *)ih;
1030 		break;
1031 	case 3:
1032 		ihv3 = igmpv3_query_hdr(skb);
1033 		ihv3->type = IGMP_HOST_MEMBERSHIP_QUERY;
1034 		ihv3->code = igmpv3_mrc(mrt / (HZ / IGMP_TIMER_SCALE));
1035 		ihv3->group = group;
1036 		ihv3->qqic = igmpv3_qqic(brmctx->multicast_query_interval / HZ);
1037 		ihv3->nsrcs = htons(lmqt_srcs);
1038 		ihv3->resv = 0;
1039 		ihv3->suppress = sflag;
1040 		ihv3->qrv = 2;
1041 		ihv3->csum = 0;
1042 		csum = &ihv3->csum;
1043 		csum_start = (void *)ihv3;
1044 		if (!pg || !with_srcs)
1045 			break;
1046 
1047 		lmqt_srcs = 0;
1048 		hlist_for_each_entry(ent, &pg->src_list, node) {
1049 			if (over_lmqt == time_after(ent->timer.expires,
1050 						    lmqt) &&
1051 			    ent->src_query_rexmit_cnt > 0) {
1052 				ihv3->srcs[lmqt_srcs++] = ent->addr.src.ip4;
1053 				ent->src_query_rexmit_cnt--;
1054 				if (need_rexmit && ent->src_query_rexmit_cnt)
1055 					*need_rexmit = true;
1056 			}
1057 		}
1058 		if (WARN_ON(lmqt_srcs != ntohs(ihv3->nsrcs))) {
1059 			kfree_skb(skb);
1060 			return NULL;
1061 		}
1062 		break;
1063 	}
1064 
1065 	if (WARN_ON(!csum || !csum_start)) {
1066 		kfree_skb(skb);
1067 		return NULL;
1068 	}
1069 
1070 	*csum = ip_compute_csum(csum_start, igmp_hdr_size);
1071 	skb_put(skb, igmp_hdr_size);
1072 	__skb_pull(skb, sizeof(*eth));
1073 
1074 out:
1075 	return skb;
1076 }
1077 
1078 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_alloc_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,const struct in6_addr * ip6_dst,const struct in6_addr * group,bool with_srcs,bool over_llqt,u8 sflag,bool * need_rexmit)1079 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge_mcast *brmctx,
1080 						    struct net_bridge_mcast_port *pmctx,
1081 						    struct net_bridge_port_group *pg,
1082 						    const struct in6_addr *ip6_dst,
1083 						    const struct in6_addr *group,
1084 						    bool with_srcs, bool over_llqt,
1085 						    u8 sflag,
1086 						    bool *need_rexmit)
1087 {
1088 	struct net_bridge_port *p = pg ? pg->key.port : NULL;
1089 	struct net_bridge_group_src *ent;
1090 	size_t pkt_size, mld_hdr_size;
1091 	unsigned long now = jiffies;
1092 	struct mld2_query *mld2q;
1093 	void *csum_start = NULL;
1094 	unsigned long interval;
1095 	__sum16 *csum = NULL;
1096 	struct ipv6hdr *ip6h;
1097 	struct mld_msg *mldq;
1098 	struct sk_buff *skb;
1099 	unsigned long llqt;
1100 	struct ethhdr *eth;
1101 	u16 llqt_srcs = 0;
1102 	u8 *hopopt;
1103 
1104 	mld_hdr_size = sizeof(*mldq);
1105 	if (brmctx->multicast_mld_version == 2) {
1106 		mld_hdr_size = sizeof(*mld2q);
1107 		if (pg && with_srcs) {
1108 			llqt = now + (brmctx->multicast_last_member_interval *
1109 				      brmctx->multicast_last_member_count);
1110 			hlist_for_each_entry(ent, &pg->src_list, node) {
1111 				if (over_llqt == time_after(ent->timer.expires,
1112 							    llqt) &&
1113 				    ent->src_query_rexmit_cnt > 0)
1114 					llqt_srcs++;
1115 			}
1116 
1117 			if (!llqt_srcs)
1118 				return NULL;
1119 			mld_hdr_size += llqt_srcs * sizeof(struct in6_addr);
1120 		}
1121 	}
1122 
1123 	pkt_size = sizeof(*eth) + sizeof(*ip6h) + 8 + mld_hdr_size;
1124 	if ((p && pkt_size > p->dev->mtu) ||
1125 	    pkt_size > brmctx->br->dev->mtu)
1126 		return NULL;
1127 
1128 	skb = netdev_alloc_skb_ip_align(brmctx->br->dev, pkt_size);
1129 	if (!skb)
1130 		goto out;
1131 
1132 	__br_multicast_query_handle_vlan(brmctx, pmctx, skb);
1133 	skb->protocol = htons(ETH_P_IPV6);
1134 
1135 	/* Ethernet header */
1136 	skb_reset_mac_header(skb);
1137 	eth = eth_hdr(skb);
1138 
1139 	ether_addr_copy(eth->h_source, brmctx->br->dev->dev_addr);
1140 	eth->h_proto = htons(ETH_P_IPV6);
1141 	skb_put(skb, sizeof(*eth));
1142 
1143 	/* IPv6 header + HbH option */
1144 	skb_set_network_header(skb, skb->len);
1145 	ip6h = ipv6_hdr(skb);
1146 
1147 	*(__force __be32 *)ip6h = htonl(0x60000000);
1148 	ip6h->payload_len = htons(8 + mld_hdr_size);
1149 	ip6h->nexthdr = IPPROTO_HOPOPTS;
1150 	ip6h->hop_limit = 1;
1151 	ip6h->daddr = *ip6_dst;
1152 	if (ipv6_dev_get_saddr(dev_net(brmctx->br->dev), brmctx->br->dev,
1153 			       &ip6h->daddr, 0, &ip6h->saddr)) {
1154 		kfree_skb(skb);
1155 		br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, false);
1156 		return NULL;
1157 	}
1158 
1159 	br_opt_toggle(brmctx->br, BROPT_HAS_IPV6_ADDR, true);
1160 	ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest);
1161 
1162 	hopopt = (u8 *)(ip6h + 1);
1163 	hopopt[0] = IPPROTO_ICMPV6;		/* next hdr */
1164 	hopopt[1] = 0;				/* length of HbH */
1165 	hopopt[2] = IPV6_TLV_ROUTERALERT;	/* Router Alert */
1166 	hopopt[3] = 2;				/* Length of RA Option */
1167 	hopopt[4] = 0;				/* Type = 0x0000 (MLD) */
1168 	hopopt[5] = 0;
1169 	hopopt[6] = IPV6_TLV_PAD1;		/* Pad1 */
1170 	hopopt[7] = IPV6_TLV_PAD1;		/* Pad1 */
1171 
1172 	skb_put(skb, sizeof(*ip6h) + 8);
1173 
1174 	/* ICMPv6 */
1175 	skb_set_transport_header(skb, skb->len);
1176 	interval = ipv6_addr_any(group) ?
1177 			brmctx->multicast_query_response_interval :
1178 			brmctx->multicast_last_member_interval;
1179 	switch (brmctx->multicast_mld_version) {
1180 	case 1:
1181 		mldq = (struct mld_msg *)icmp6_hdr(skb);
1182 		mldq->mld_type = ICMPV6_MGM_QUERY;
1183 		mldq->mld_code = 0;
1184 		mldq->mld_cksum = 0;
1185 		mldq->mld_maxdelay = htons((u16)jiffies_to_msecs(interval));
1186 		mldq->mld_reserved = 0;
1187 		mldq->mld_mca = *group;
1188 		csum = &mldq->mld_cksum;
1189 		csum_start = (void *)mldq;
1190 		break;
1191 	case 2:
1192 		mld2q = (struct mld2_query *)icmp6_hdr(skb);
1193 		mld2q->mld2q_mrc = htons(mldv2_mrc(jiffies_to_msecs(interval)));
1194 		mld2q->mld2q_type = ICMPV6_MGM_QUERY;
1195 		mld2q->mld2q_code = 0;
1196 		mld2q->mld2q_cksum = 0;
1197 		mld2q->mld2q_resv1 = 0;
1198 		mld2q->mld2q_resv2 = 0;
1199 		mld2q->mld2q_suppress = sflag;
1200 		mld2q->mld2q_qrv = 2;
1201 		mld2q->mld2q_nsrcs = htons(llqt_srcs);
1202 		mld2q->mld2q_qqic = mldv2_qqic(brmctx->multicast_query_interval / HZ);
1203 		mld2q->mld2q_mca = *group;
1204 		csum = &mld2q->mld2q_cksum;
1205 		csum_start = (void *)mld2q;
1206 		if (!pg || !with_srcs)
1207 			break;
1208 
1209 		llqt_srcs = 0;
1210 		hlist_for_each_entry(ent, &pg->src_list, node) {
1211 			if (over_llqt == time_after(ent->timer.expires,
1212 						    llqt) &&
1213 			    ent->src_query_rexmit_cnt > 0) {
1214 				mld2q->mld2q_srcs[llqt_srcs++] = ent->addr.src.ip6;
1215 				ent->src_query_rexmit_cnt--;
1216 				if (need_rexmit && ent->src_query_rexmit_cnt)
1217 					*need_rexmit = true;
1218 			}
1219 		}
1220 		if (WARN_ON(llqt_srcs != ntohs(mld2q->mld2q_nsrcs))) {
1221 			kfree_skb(skb);
1222 			return NULL;
1223 		}
1224 		break;
1225 	}
1226 
1227 	if (WARN_ON(!csum || !csum_start)) {
1228 		kfree_skb(skb);
1229 		return NULL;
1230 	}
1231 
1232 	*csum = csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, mld_hdr_size,
1233 				IPPROTO_ICMPV6,
1234 				csum_partial(csum_start, mld_hdr_size, 0));
1235 	skb_put(skb, mld_hdr_size);
1236 	__skb_pull(skb, sizeof(*eth));
1237 
1238 out:
1239 	return skb;
1240 }
1241 #endif
1242 
br_multicast_alloc_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,struct br_ip * ip_dst,struct br_ip * group,bool with_srcs,bool over_lmqt,u8 sflag,bool * need_rexmit)1243 static struct sk_buff *br_multicast_alloc_query(struct net_bridge_mcast *brmctx,
1244 						struct net_bridge_mcast_port *pmctx,
1245 						struct net_bridge_port_group *pg,
1246 						struct br_ip *ip_dst,
1247 						struct br_ip *group,
1248 						bool with_srcs, bool over_lmqt,
1249 						u8 sflag, bool *need_rexmit)
1250 {
1251 	__be32 ip4_dst;
1252 
1253 	switch (group->proto) {
1254 	case htons(ETH_P_IP):
1255 		ip4_dst = ip_dst ? ip_dst->dst.ip4 : htonl(INADDR_ALLHOSTS_GROUP);
1256 		return br_ip4_multicast_alloc_query(brmctx, pmctx, pg,
1257 						    ip4_dst, group->dst.ip4,
1258 						    with_srcs, over_lmqt,
1259 						    sflag, need_rexmit);
1260 #if IS_ENABLED(CONFIG_IPV6)
1261 	case htons(ETH_P_IPV6): {
1262 		struct in6_addr ip6_dst;
1263 
1264 		if (ip_dst)
1265 			ip6_dst = ip_dst->dst.ip6;
1266 		else
1267 			ipv6_addr_set(&ip6_dst, htonl(0xff020000), 0, 0,
1268 				      htonl(1));
1269 
1270 		return br_ip6_multicast_alloc_query(brmctx, pmctx, pg,
1271 						    &ip6_dst, &group->dst.ip6,
1272 						    with_srcs, over_lmqt,
1273 						    sflag, need_rexmit);
1274 	}
1275 #endif
1276 	}
1277 	return NULL;
1278 }
1279 
br_multicast_new_group(struct net_bridge * br,struct br_ip * group)1280 struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
1281 						    struct br_ip *group)
1282 {
1283 	struct net_bridge_mdb_entry *mp;
1284 	int err;
1285 
1286 	mp = br_mdb_ip_get(br, group);
1287 	if (mp)
1288 		return mp;
1289 
1290 	if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) {
1291 		trace_br_mdb_full(br->dev, group);
1292 		br_mc_disabled_update(br->dev, false, NULL);
1293 		br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false);
1294 		return ERR_PTR(-E2BIG);
1295 	}
1296 
1297 	mp = kzalloc_obj(*mp, GFP_ATOMIC);
1298 	if (unlikely(!mp))
1299 		return ERR_PTR(-ENOMEM);
1300 
1301 	mp->br = br;
1302 	mp->addr = *group;
1303 	mp->mcast_gc.destroy = br_multicast_destroy_mdb_entry;
1304 	timer_setup(&mp->timer, br_multicast_group_expired, 0);
1305 	err = rhashtable_lookup_insert_fast(&br->mdb_hash_tbl, &mp->rhnode,
1306 					    br_mdb_rht_params);
1307 	if (err) {
1308 		kfree(mp);
1309 		mp = ERR_PTR(err);
1310 	} else {
1311 		hlist_add_head_rcu(&mp->mdb_node, &br->mdb_list);
1312 	}
1313 
1314 	return mp;
1315 }
1316 
br_multicast_group_src_expired(struct timer_list * t)1317 static void br_multicast_group_src_expired(struct timer_list *t)
1318 {
1319 	struct net_bridge_group_src *src = timer_container_of(src, t, timer);
1320 	struct net_bridge_port_group *pg;
1321 	struct net_bridge *br = src->br;
1322 
1323 	spin_lock(&br->multicast_lock);
1324 	if (hlist_unhashed(&src->node) || !netif_running(br->dev) ||
1325 	    timer_pending(&src->timer))
1326 		goto out;
1327 
1328 	pg = src->pg;
1329 	if (pg->filter_mode == MCAST_INCLUDE) {
1330 		br_multicast_del_group_src(src, false);
1331 		if (!hlist_empty(&pg->src_list))
1332 			goto out;
1333 		br_multicast_find_del_pg(br, pg);
1334 	} else {
1335 		br_multicast_fwd_src_handle(src);
1336 	}
1337 
1338 out:
1339 	spin_unlock(&br->multicast_lock);
1340 }
1341 
1342 struct net_bridge_group_src *
br_multicast_find_group_src(struct net_bridge_port_group * pg,struct br_ip * ip)1343 br_multicast_find_group_src(struct net_bridge_port_group *pg, struct br_ip *ip)
1344 {
1345 	struct net_bridge_group_src *ent;
1346 
1347 	switch (ip->proto) {
1348 	case htons(ETH_P_IP):
1349 		hlist_for_each_entry(ent, &pg->src_list, node)
1350 			if (ip->src.ip4 == ent->addr.src.ip4)
1351 				return ent;
1352 		break;
1353 #if IS_ENABLED(CONFIG_IPV6)
1354 	case htons(ETH_P_IPV6):
1355 		hlist_for_each_entry(ent, &pg->src_list, node)
1356 			if (!ipv6_addr_cmp(&ent->addr.src.ip6, &ip->src.ip6))
1357 				return ent;
1358 		break;
1359 #endif
1360 	}
1361 
1362 	return NULL;
1363 }
1364 
1365 struct net_bridge_group_src *
br_multicast_new_group_src(struct net_bridge_port_group * pg,struct br_ip * src_ip)1366 br_multicast_new_group_src(struct net_bridge_port_group *pg, struct br_ip *src_ip)
1367 {
1368 	struct net_bridge_group_src *grp_src;
1369 
1370 	if (unlikely(pg->src_ents >= PG_SRC_ENT_LIMIT))
1371 		return NULL;
1372 
1373 	switch (src_ip->proto) {
1374 	case htons(ETH_P_IP):
1375 		if (ipv4_is_zeronet(src_ip->src.ip4) ||
1376 		    ipv4_is_multicast(src_ip->src.ip4))
1377 			return NULL;
1378 		break;
1379 #if IS_ENABLED(CONFIG_IPV6)
1380 	case htons(ETH_P_IPV6):
1381 		if (ipv6_addr_any(&src_ip->src.ip6) ||
1382 		    ipv6_addr_is_multicast(&src_ip->src.ip6))
1383 			return NULL;
1384 		break;
1385 #endif
1386 	}
1387 
1388 	grp_src = kzalloc_obj(*grp_src, GFP_ATOMIC);
1389 	if (unlikely(!grp_src))
1390 		return NULL;
1391 
1392 	grp_src->pg = pg;
1393 	grp_src->br = pg->key.port->br;
1394 	grp_src->addr = *src_ip;
1395 	grp_src->mcast_gc.destroy = br_multicast_destroy_group_src;
1396 	timer_setup(&grp_src->timer, br_multicast_group_src_expired, 0);
1397 
1398 	hlist_add_head_rcu(&grp_src->node, &pg->src_list);
1399 	pg->src_ents++;
1400 
1401 	return grp_src;
1402 }
1403 
br_multicast_new_port_group(struct net_bridge_port * port,const struct br_ip * group,struct net_bridge_port_group __rcu * next,unsigned char flags,const unsigned char * src,u8 filter_mode,u8 rt_protocol,struct netlink_ext_ack * extack)1404 struct net_bridge_port_group *br_multicast_new_port_group(
1405 			struct net_bridge_port *port,
1406 			const struct br_ip *group,
1407 			struct net_bridge_port_group __rcu *next,
1408 			unsigned char flags,
1409 			const unsigned char *src,
1410 			u8 filter_mode,
1411 			u8 rt_protocol,
1412 			struct netlink_ext_ack *extack)
1413 {
1414 	struct net_bridge_port_group *p;
1415 	int err;
1416 
1417 	err = br_multicast_port_ngroups_inc(port, group, extack);
1418 	if (err)
1419 		return NULL;
1420 
1421 	p = kzalloc_obj(*p, GFP_ATOMIC);
1422 	if (unlikely(!p)) {
1423 		NL_SET_ERR_MSG_MOD(extack, "Couldn't allocate new port group");
1424 		goto dec_out;
1425 	}
1426 
1427 	p->key.addr = *group;
1428 	p->key.port = port;
1429 	p->flags = flags;
1430 	p->filter_mode = filter_mode;
1431 	p->rt_protocol = rt_protocol;
1432 	p->eht_host_tree = RB_ROOT;
1433 	p->eht_set_tree = RB_ROOT;
1434 	p->mcast_gc.destroy = br_multicast_destroy_port_group;
1435 	INIT_HLIST_HEAD(&p->src_list);
1436 
1437 	if (!br_multicast_is_star_g(group) &&
1438 	    rhashtable_lookup_insert_fast(&port->br->sg_port_tbl, &p->rhnode,
1439 					  br_sg_port_rht_params)) {
1440 		NL_SET_ERR_MSG_MOD(extack, "Couldn't insert new port group");
1441 		goto free_out;
1442 	}
1443 
1444 	timer_setup(&p->timer, br_multicast_port_group_expired, 0);
1445 	timer_setup(&p->rexmit_timer, br_multicast_port_group_rexmit, 0);
1446 
1447 	if (src)
1448 		memcpy(p->eth_addr, src, ETH_ALEN);
1449 	else
1450 		eth_broadcast_addr(p->eth_addr);
1451 
1452 	RCU_INIT_POINTER(p->next, next);
1453 	hlist_add_head_rcu(&p->mglist, &port->mglist);
1454 
1455 	return p;
1456 
1457 free_out:
1458 	kfree(p);
1459 dec_out:
1460 	br_multicast_port_ngroups_dec(port, group->vid);
1461 	return NULL;
1462 }
1463 
br_multicast_del_port_group(struct net_bridge_port_group * p)1464 void br_multicast_del_port_group(struct net_bridge_port_group *p)
1465 {
1466 	struct net_bridge_port *port = p->key.port;
1467 	__u16 vid = p->key.addr.vid;
1468 
1469 	hlist_del_init_rcu(&p->mglist);
1470 	if (!br_multicast_is_star_g(&p->key.addr))
1471 		rhashtable_remove_fast(&port->br->sg_port_tbl, &p->rhnode,
1472 				       br_sg_port_rht_params);
1473 	kfree_rcu(p, rcu);
1474 	br_multicast_port_ngroups_dec(port, vid);
1475 }
1476 
br_multicast_host_join(const struct net_bridge_mcast * brmctx,struct net_bridge_mdb_entry * mp,bool notify)1477 void br_multicast_host_join(const struct net_bridge_mcast *brmctx,
1478 			    struct net_bridge_mdb_entry *mp, bool notify)
1479 {
1480 	if (!mp->host_joined) {
1481 		mp->host_joined = true;
1482 		if (br_multicast_is_star_g(&mp->addr))
1483 			br_multicast_star_g_host_state(mp);
1484 		if (notify)
1485 			br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB);
1486 	}
1487 
1488 	if (br_group_is_l2(&mp->addr))
1489 		return;
1490 
1491 	mod_timer(&mp->timer, jiffies + brmctx->multicast_membership_interval);
1492 }
1493 
br_multicast_host_leave(struct net_bridge_mdb_entry * mp,bool notify)1494 void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify)
1495 {
1496 	if (!mp->host_joined)
1497 		return;
1498 
1499 	mp->host_joined = false;
1500 	if (br_multicast_is_star_g(&mp->addr))
1501 		br_multicast_star_g_host_state(mp);
1502 	if (notify)
1503 		br_mdb_notify(mp->br->dev, mp, NULL, RTM_DELMDB);
1504 }
1505 
1506 static struct net_bridge_port_group *
__br_multicast_add_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct br_ip * group,const unsigned char * src,u8 filter_mode,bool igmpv2_mldv1,bool blocked)1507 __br_multicast_add_group(struct net_bridge_mcast *brmctx,
1508 			 struct net_bridge_mcast_port *pmctx,
1509 			 struct br_ip *group,
1510 			 const unsigned char *src,
1511 			 u8 filter_mode,
1512 			 bool igmpv2_mldv1,
1513 			 bool blocked)
1514 {
1515 	struct net_bridge_port_group __rcu **pp;
1516 	struct net_bridge_port_group *p = NULL;
1517 	struct net_bridge_mdb_entry *mp;
1518 	unsigned long now = jiffies;
1519 
1520 	if (!br_multicast_ctx_should_use(brmctx, pmctx))
1521 		goto out;
1522 
1523 	mp = br_multicast_new_group(brmctx->br, group);
1524 	if (IS_ERR(mp))
1525 		return ERR_CAST(mp);
1526 
1527 	if (!pmctx) {
1528 		br_multicast_host_join(brmctx, mp, true);
1529 		goto out;
1530 	}
1531 
1532 	for (pp = &mp->ports;
1533 	     (p = mlock_dereference(*pp, brmctx->br)) != NULL;
1534 	     pp = &p->next) {
1535 		if (br_port_group_equal(p, pmctx->port, src))
1536 			goto found;
1537 		if ((unsigned long)p->key.port < (unsigned long)pmctx->port)
1538 			break;
1539 	}
1540 
1541 	p = br_multicast_new_port_group(pmctx->port, group, *pp, 0, src,
1542 					filter_mode, RTPROT_KERNEL, NULL);
1543 	if (unlikely(!p)) {
1544 		p = ERR_PTR(-ENOMEM);
1545 		goto out;
1546 	}
1547 	rcu_assign_pointer(*pp, p);
1548 	if (blocked)
1549 		p->flags |= MDB_PG_FLAGS_BLOCKED;
1550 	br_mdb_notify(brmctx->br->dev, mp, p, RTM_NEWMDB);
1551 
1552 found:
1553 	if (igmpv2_mldv1)
1554 		mod_timer(&p->timer,
1555 			  now + brmctx->multicast_membership_interval);
1556 
1557 out:
1558 	return p;
1559 }
1560 
br_multicast_add_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct br_ip * group,const unsigned char * src,u8 filter_mode,bool igmpv2_mldv1)1561 static int br_multicast_add_group(struct net_bridge_mcast *brmctx,
1562 				  struct net_bridge_mcast_port *pmctx,
1563 				  struct br_ip *group,
1564 				  const unsigned char *src,
1565 				  u8 filter_mode,
1566 				  bool igmpv2_mldv1)
1567 {
1568 	struct net_bridge_port_group *pg;
1569 	int err;
1570 
1571 	spin_lock(&brmctx->br->multicast_lock);
1572 	pg = __br_multicast_add_group(brmctx, pmctx, group, src, filter_mode,
1573 				      igmpv2_mldv1, false);
1574 	/* NULL is considered valid for host joined groups */
1575 	err = PTR_ERR_OR_ZERO(pg);
1576 	spin_unlock(&brmctx->br->multicast_lock);
1577 
1578 	return err;
1579 }
1580 
br_ip4_multicast_add_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,__be32 group,__u16 vid,const unsigned char * src,bool igmpv2)1581 static int br_ip4_multicast_add_group(struct net_bridge_mcast *brmctx,
1582 				      struct net_bridge_mcast_port *pmctx,
1583 				      __be32 group,
1584 				      __u16 vid,
1585 				      const unsigned char *src,
1586 				      bool igmpv2)
1587 {
1588 	struct br_ip br_group;
1589 	u8 filter_mode;
1590 
1591 	if (ipv4_is_local_multicast(group))
1592 		return 0;
1593 
1594 	memset(&br_group, 0, sizeof(br_group));
1595 	br_group.dst.ip4 = group;
1596 	br_group.proto = htons(ETH_P_IP);
1597 	br_group.vid = vid;
1598 	filter_mode = igmpv2 ? MCAST_EXCLUDE : MCAST_INCLUDE;
1599 
1600 	return br_multicast_add_group(brmctx, pmctx, &br_group, src,
1601 				      filter_mode, igmpv2);
1602 }
1603 
1604 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_add_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,const struct in6_addr * group,__u16 vid,const unsigned char * src,bool mldv1)1605 static int br_ip6_multicast_add_group(struct net_bridge_mcast *brmctx,
1606 				      struct net_bridge_mcast_port *pmctx,
1607 				      const struct in6_addr *group,
1608 				      __u16 vid,
1609 				      const unsigned char *src,
1610 				      bool mldv1)
1611 {
1612 	struct br_ip br_group;
1613 	u8 filter_mode;
1614 
1615 	if (ipv6_addr_is_ll_all_nodes(group))
1616 		return 0;
1617 
1618 	memset(&br_group, 0, sizeof(br_group));
1619 	br_group.dst.ip6 = *group;
1620 	br_group.proto = htons(ETH_P_IPV6);
1621 	br_group.vid = vid;
1622 	filter_mode = mldv1 ? MCAST_EXCLUDE : MCAST_INCLUDE;
1623 
1624 	return br_multicast_add_group(brmctx, pmctx, &br_group, src,
1625 				      filter_mode, mldv1);
1626 }
1627 #endif
1628 
br_multicast_rport_del(struct hlist_node * rlist)1629 static bool br_multicast_rport_del(struct hlist_node *rlist)
1630 {
1631 	if (hlist_unhashed(rlist))
1632 		return false;
1633 
1634 	hlist_del_init_rcu(rlist);
1635 	return true;
1636 }
1637 
br_ip4_multicast_rport_del(struct net_bridge_mcast_port * pmctx)1638 static bool br_ip4_multicast_rport_del(struct net_bridge_mcast_port *pmctx)
1639 {
1640 	return br_multicast_rport_del(&pmctx->ip4_rlist);
1641 }
1642 
br_ip6_multicast_rport_del(struct net_bridge_mcast_port * pmctx)1643 static bool br_ip6_multicast_rport_del(struct net_bridge_mcast_port *pmctx)
1644 {
1645 #if IS_ENABLED(CONFIG_IPV6)
1646 	return br_multicast_rport_del(&pmctx->ip6_rlist);
1647 #else
1648 	return false;
1649 #endif
1650 }
1651 
br_multicast_router_expired(struct net_bridge_mcast_port * pmctx,struct timer_list * t,struct hlist_node * rlist)1652 static void br_multicast_router_expired(struct net_bridge_mcast_port *pmctx,
1653 					struct timer_list *t,
1654 					struct hlist_node *rlist)
1655 {
1656 	struct net_bridge *br = pmctx->port->br;
1657 	bool del;
1658 
1659 	spin_lock(&br->multicast_lock);
1660 	if (pmctx->multicast_router == MDB_RTR_TYPE_DISABLED ||
1661 	    pmctx->multicast_router == MDB_RTR_TYPE_PERM ||
1662 	    timer_pending(t))
1663 		goto out;
1664 
1665 	del = br_multicast_rport_del(rlist);
1666 	br_multicast_rport_del_notify(pmctx, del);
1667 out:
1668 	spin_unlock(&br->multicast_lock);
1669 }
1670 
br_ip4_multicast_router_expired(struct timer_list * t)1671 static void br_ip4_multicast_router_expired(struct timer_list *t)
1672 {
1673 	struct net_bridge_mcast_port *pmctx = timer_container_of(pmctx, t,
1674 								 ip4_mc_router_timer);
1675 
1676 	br_multicast_router_expired(pmctx, t, &pmctx->ip4_rlist);
1677 }
1678 
1679 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_router_expired(struct timer_list * t)1680 static void br_ip6_multicast_router_expired(struct timer_list *t)
1681 {
1682 	struct net_bridge_mcast_port *pmctx = timer_container_of(pmctx, t,
1683 								 ip6_mc_router_timer);
1684 
1685 	br_multicast_router_expired(pmctx, t, &pmctx->ip6_rlist);
1686 }
1687 #endif
1688 
br_mc_router_state_change(struct net_bridge * p,bool is_mc_router)1689 static void br_mc_router_state_change(struct net_bridge *p,
1690 				      bool is_mc_router)
1691 {
1692 	struct switchdev_attr attr = {
1693 		.orig_dev = p->dev,
1694 		.id = SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
1695 		.flags = SWITCHDEV_F_DEFER,
1696 		.u.mrouter = is_mc_router,
1697 	};
1698 
1699 	switchdev_port_attr_set(p->dev, &attr, NULL);
1700 }
1701 
br_multicast_local_router_expired(struct net_bridge_mcast * brmctx,struct timer_list * timer)1702 static void br_multicast_local_router_expired(struct net_bridge_mcast *brmctx,
1703 					      struct timer_list *timer)
1704 {
1705 	spin_lock(&brmctx->br->multicast_lock);
1706 	if (brmctx->multicast_router == MDB_RTR_TYPE_DISABLED ||
1707 	    brmctx->multicast_router == MDB_RTR_TYPE_PERM ||
1708 	    br_ip4_multicast_is_router(brmctx) ||
1709 	    br_ip6_multicast_is_router(brmctx))
1710 		goto out;
1711 
1712 	br_mc_router_state_change(brmctx->br, false);
1713 out:
1714 	spin_unlock(&brmctx->br->multicast_lock);
1715 }
1716 
br_ip4_multicast_local_router_expired(struct timer_list * t)1717 static void br_ip4_multicast_local_router_expired(struct timer_list *t)
1718 {
1719 	struct net_bridge_mcast *brmctx = timer_container_of(brmctx, t,
1720 							     ip4_mc_router_timer);
1721 
1722 	br_multicast_local_router_expired(brmctx, t);
1723 }
1724 
1725 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_local_router_expired(struct timer_list * t)1726 static void br_ip6_multicast_local_router_expired(struct timer_list *t)
1727 {
1728 	struct net_bridge_mcast *brmctx = timer_container_of(brmctx, t,
1729 							     ip6_mc_router_timer);
1730 
1731 	br_multicast_local_router_expired(brmctx, t);
1732 }
1733 #endif
1734 
br_multicast_querier_expired(struct net_bridge_mcast * brmctx,struct bridge_mcast_own_query * query)1735 static void br_multicast_querier_expired(struct net_bridge_mcast *brmctx,
1736 					 struct bridge_mcast_own_query *query)
1737 {
1738 	spin_lock(&brmctx->br->multicast_lock);
1739 	if (!netif_running(brmctx->br->dev) ||
1740 	    br_multicast_ctx_vlan_global_disabled(brmctx) ||
1741 	    !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
1742 		goto out;
1743 
1744 	br_multicast_start_querier(brmctx, query);
1745 
1746 out:
1747 	spin_unlock(&brmctx->br->multicast_lock);
1748 }
1749 
br_ip4_multicast_querier_expired(struct timer_list * t)1750 static void br_ip4_multicast_querier_expired(struct timer_list *t)
1751 {
1752 	struct net_bridge_mcast *brmctx = timer_container_of(brmctx, t,
1753 							     ip4_other_query.timer);
1754 
1755 	br_multicast_querier_expired(brmctx, &brmctx->ip4_own_query);
1756 }
1757 
1758 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_querier_expired(struct timer_list * t)1759 static void br_ip6_multicast_querier_expired(struct timer_list *t)
1760 {
1761 	struct net_bridge_mcast *brmctx = timer_container_of(brmctx, t,
1762 							     ip6_other_query.timer);
1763 
1764 	br_multicast_querier_expired(brmctx, &brmctx->ip6_own_query);
1765 }
1766 #endif
1767 
br_multicast_query_delay_expired(struct timer_list * t)1768 static void br_multicast_query_delay_expired(struct timer_list *t)
1769 {
1770 }
1771 
br_multicast_select_own_querier(struct net_bridge_mcast * brmctx,struct br_ip * ip,struct sk_buff * skb)1772 static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx,
1773 					    struct br_ip *ip,
1774 					    struct sk_buff *skb)
1775 {
1776 	if (ip->proto == htons(ETH_P_IP))
1777 		brmctx->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr;
1778 #if IS_ENABLED(CONFIG_IPV6)
1779 	else
1780 		brmctx->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr;
1781 #endif
1782 }
1783 
br_multicast_query_type(const struct sk_buff * skb)1784 static u8 br_multicast_query_type(const struct sk_buff *skb)
1785 {
1786 	return skb->protocol == htons(ETH_P_IP) ? IGMP_HOST_MEMBERSHIP_QUERY :
1787 						  ICMPV6_MGM_QUERY;
1788 }
1789 
br_multicast_port_query_queue_work(struct work_struct * work)1790 static void br_multicast_port_query_queue_work(struct work_struct *work)
1791 {
1792 	struct net_bridge_mcast_port *pmctx;
1793 	struct sk_buff_head list;
1794 	struct sk_buff *skb;
1795 
1796 	pmctx = container_of(work, struct net_bridge_mcast_port,
1797 			     query_queue_work);
1798 
1799 	__skb_queue_head_init(&list);
1800 	spin_lock_bh(&pmctx->query_queue.lock);
1801 	skb_queue_splice_tail_init(&pmctx->query_queue, &list);
1802 	spin_unlock_bh(&pmctx->query_queue.lock);
1803 
1804 	while ((skb = __skb_dequeue(&list))) {
1805 		u8 query_type = br_multicast_query_type(skb);
1806 
1807 		local_bh_disable();
1808 		br_multicast_count(pmctx->port->br, pmctx->port, skb,
1809 				   query_type, BR_MCAST_DIR_TX);
1810 		NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, dev_net(skb->dev),
1811 			NULL, skb, NULL, skb->dev, br_dev_queue_push_xmit);
1812 		local_bh_enable();
1813 	}
1814 }
1815 
br_multicast_query_queue_work(struct work_struct * work)1816 static void br_multicast_query_queue_work(struct work_struct *work)
1817 {
1818 	struct net_bridge_mcast *brmctx;
1819 	struct sk_buff_head list;
1820 	struct sk_buff *skb;
1821 
1822 	brmctx = container_of(work, struct net_bridge_mcast, query_queue_work);
1823 
1824 	__skb_queue_head_init(&list);
1825 	spin_lock_bh(&brmctx->query_queue.lock);
1826 	skb_queue_splice_tail_init(&brmctx->query_queue, &list);
1827 	spin_unlock_bh(&brmctx->query_queue.lock);
1828 
1829 	while ((skb = __skb_dequeue(&list))) {
1830 		u8 query_type = br_multicast_query_type(skb);
1831 
1832 		local_bh_disable();
1833 		br_multicast_count(brmctx->br, NULL, skb, query_type,
1834 				   BR_MCAST_DIR_RX);
1835 		netif_rx(skb);
1836 		local_bh_enable();
1837 	}
1838 }
1839 
1840 #define BR_MULTICAST_QUERY_QUEUE_LEN_MAX	1000
1841 
__br_multicast_send_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,struct br_ip * ip_dst,struct br_ip * group,bool with_srcs,u8 sflag,bool * need_rexmit)1842 static void __br_multicast_send_query(struct net_bridge_mcast *brmctx,
1843 				      struct net_bridge_mcast_port *pmctx,
1844 				      struct net_bridge_port_group *pg,
1845 				      struct br_ip *ip_dst,
1846 				      struct br_ip *group,
1847 				      bool with_srcs,
1848 				      u8 sflag,
1849 				      bool *need_rexmit)
1850 {
1851 	struct sk_buff_head *queue;
1852 	bool over_lmqt = !!sflag;
1853 	struct sk_buff *skb;
1854 
1855 	if (!br_multicast_ctx_should_use(brmctx, pmctx) ||
1856 	    !br_multicast_ctx_matches_vlan_snooping(brmctx))
1857 		return;
1858 
1859 	queue = pmctx ? &pmctx->query_queue : &brmctx->query_queue;
1860 
1861 again_under_lmqt:
1862 	if (skb_queue_len_lockless(queue) >= BR_MULTICAST_QUERY_QUEUE_LEN_MAX)
1863 		return;
1864 
1865 	skb = br_multicast_alloc_query(brmctx, pmctx, pg, ip_dst, group,
1866 				       with_srcs, over_lmqt, sflag,
1867 				       need_rexmit);
1868 	if (!skb)
1869 		return;
1870 
1871 	if (pmctx) {
1872 		skb->dev = pmctx->port->dev;
1873 		skb_queue_tail(queue, skb);
1874 		queue_work(system_highpri_wq, &pmctx->query_queue_work);
1875 
1876 		if (over_lmqt && with_srcs && sflag) {
1877 			over_lmqt = false;
1878 			goto again_under_lmqt;
1879 		}
1880 	} else {
1881 		br_multicast_select_own_querier(brmctx, group, skb);
1882 		skb_queue_tail(queue, skb);
1883 		queue_work(system_highpri_wq, &brmctx->query_queue_work);
1884 	}
1885 }
1886 
br_multicast_read_querier(const struct bridge_mcast_querier * querier,struct bridge_mcast_querier * dest)1887 static void br_multicast_read_querier(const struct bridge_mcast_querier *querier,
1888 				      struct bridge_mcast_querier *dest)
1889 {
1890 	unsigned int seq;
1891 
1892 	memset(dest, 0, sizeof(*dest));
1893 	do {
1894 		seq = read_seqcount_begin(&querier->seq);
1895 		dest->port_ifidx = querier->port_ifidx;
1896 		memcpy(&dest->addr, &querier->addr, sizeof(struct br_ip));
1897 	} while (read_seqcount_retry(&querier->seq, seq));
1898 }
1899 
br_multicast_update_querier(struct net_bridge_mcast * brmctx,struct bridge_mcast_querier * querier,int ifindex,struct br_ip * saddr)1900 static void br_multicast_update_querier(struct net_bridge_mcast *brmctx,
1901 					struct bridge_mcast_querier *querier,
1902 					int ifindex,
1903 					struct br_ip *saddr)
1904 {
1905 	write_seqcount_begin(&querier->seq);
1906 	querier->port_ifidx = ifindex;
1907 	memcpy(&querier->addr, saddr, sizeof(*saddr));
1908 	write_seqcount_end(&querier->seq);
1909 }
1910 
br_multicast_send_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct bridge_mcast_own_query * own_query)1911 static void br_multicast_send_query(struct net_bridge_mcast *brmctx,
1912 				    struct net_bridge_mcast_port *pmctx,
1913 				    struct bridge_mcast_own_query *own_query)
1914 {
1915 	struct bridge_mcast_other_query *other_query = NULL;
1916 	struct bridge_mcast_querier *querier;
1917 	struct br_ip br_group;
1918 	unsigned long time;
1919 
1920 	if (!br_multicast_ctx_should_use(brmctx, pmctx) ||
1921 	    !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) ||
1922 	    !brmctx->multicast_querier)
1923 		return;
1924 
1925 	memset(&br_group.dst, 0, sizeof(br_group.dst));
1926 
1927 	if (pmctx ? (own_query == &pmctx->ip4_own_query) :
1928 		    (own_query == &brmctx->ip4_own_query)) {
1929 		querier = &brmctx->ip4_querier;
1930 		other_query = &brmctx->ip4_other_query;
1931 		br_group.proto = htons(ETH_P_IP);
1932 #if IS_ENABLED(CONFIG_IPV6)
1933 	} else {
1934 		querier = &brmctx->ip6_querier;
1935 		other_query = &brmctx->ip6_other_query;
1936 		br_group.proto = htons(ETH_P_IPV6);
1937 #endif
1938 	}
1939 
1940 	if (!other_query || timer_pending(&other_query->timer))
1941 		return;
1942 
1943 	/* we're about to select ourselves as querier */
1944 	if (!pmctx && querier->port_ifidx) {
1945 		struct br_ip zeroip = {};
1946 
1947 		br_multicast_update_querier(brmctx, querier, 0, &zeroip);
1948 	}
1949 
1950 	__br_multicast_send_query(brmctx, pmctx, NULL, NULL, &br_group, false,
1951 				  0, NULL);
1952 
1953 	time = jiffies;
1954 	time += own_query->startup_sent < brmctx->multicast_startup_query_count ?
1955 		brmctx->multicast_startup_query_interval :
1956 		brmctx->multicast_query_interval;
1957 	mod_timer(&own_query->timer, time);
1958 }
1959 
1960 static void
br_multicast_port_query_expired(struct net_bridge_mcast_port * pmctx,struct bridge_mcast_own_query * query)1961 br_multicast_port_query_expired(struct net_bridge_mcast_port *pmctx,
1962 				struct bridge_mcast_own_query *query)
1963 {
1964 	struct net_bridge *br = pmctx->port->br;
1965 	struct net_bridge_mcast *brmctx;
1966 
1967 	spin_lock(&br->multicast_lock);
1968 	if (br_multicast_port_ctx_state_stopped(pmctx))
1969 		goto out;
1970 
1971 	brmctx = br_multicast_port_ctx_get_global(pmctx);
1972 	if (query->startup_sent < brmctx->multicast_startup_query_count)
1973 		query->startup_sent++;
1974 
1975 	br_multicast_send_query(brmctx, pmctx, query);
1976 
1977 out:
1978 	spin_unlock(&br->multicast_lock);
1979 }
1980 
br_ip4_multicast_port_query_expired(struct timer_list * t)1981 static void br_ip4_multicast_port_query_expired(struct timer_list *t)
1982 {
1983 	struct net_bridge_mcast_port *pmctx = timer_container_of(pmctx, t,
1984 								 ip4_own_query.timer);
1985 
1986 	br_multicast_port_query_expired(pmctx, &pmctx->ip4_own_query);
1987 }
1988 
1989 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_port_query_expired(struct timer_list * t)1990 static void br_ip6_multicast_port_query_expired(struct timer_list *t)
1991 {
1992 	struct net_bridge_mcast_port *pmctx = timer_container_of(pmctx, t,
1993 								 ip6_own_query.timer);
1994 
1995 	br_multicast_port_query_expired(pmctx, &pmctx->ip6_own_query);
1996 }
1997 #endif
1998 
br_multicast_port_group_rexmit(struct timer_list * t)1999 static void br_multicast_port_group_rexmit(struct timer_list *t)
2000 {
2001 	struct net_bridge_port_group *pg = timer_container_of(pg, t,
2002 							      rexmit_timer);
2003 	struct bridge_mcast_other_query *other_query = NULL;
2004 	struct net_bridge *br = pg->key.port->br;
2005 	struct net_bridge_mcast_port *pmctx;
2006 	struct net_bridge_mcast *brmctx;
2007 	bool need_rexmit = false;
2008 
2009 	spin_lock(&br->multicast_lock);
2010 	if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
2011 	    !br_opt_get(br, BROPT_MULTICAST_ENABLED))
2012 		goto out;
2013 
2014 	pmctx = br_multicast_pg_to_port_ctx(pg);
2015 	if (!pmctx)
2016 		goto out;
2017 	brmctx = br_multicast_port_ctx_get_global(pmctx);
2018 	if (!brmctx->multicast_querier)
2019 		goto out;
2020 
2021 	if (pg->key.addr.proto == htons(ETH_P_IP))
2022 		other_query = &brmctx->ip4_other_query;
2023 #if IS_ENABLED(CONFIG_IPV6)
2024 	else
2025 		other_query = &brmctx->ip6_other_query;
2026 #endif
2027 
2028 	if (!other_query || timer_pending(&other_query->timer))
2029 		goto out;
2030 
2031 	if (pg->grp_query_rexmit_cnt) {
2032 		pg->grp_query_rexmit_cnt--;
2033 		__br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
2034 					  &pg->key.addr, false, 1, NULL);
2035 	}
2036 	__br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
2037 				  &pg->key.addr, true, 0, &need_rexmit);
2038 
2039 	if (pg->grp_query_rexmit_cnt || need_rexmit)
2040 		mod_timer(&pg->rexmit_timer, jiffies +
2041 					     brmctx->multicast_last_member_interval);
2042 out:
2043 	spin_unlock(&br->multicast_lock);
2044 }
2045 
br_mc_disabled_update(struct net_device * dev,bool value,struct netlink_ext_ack * extack)2046 static int br_mc_disabled_update(struct net_device *dev, bool value,
2047 				 struct netlink_ext_ack *extack)
2048 {
2049 	struct switchdev_attr attr = {
2050 		.orig_dev = dev,
2051 		.id = SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
2052 		.flags = SWITCHDEV_F_DEFER,
2053 		.u.mc_disabled = !value,
2054 	};
2055 
2056 	return switchdev_port_attr_set(dev, &attr, extack);
2057 }
2058 
br_multicast_port_ctx_init(struct net_bridge_port * port,struct net_bridge_vlan * vlan,struct net_bridge_mcast_port * pmctx)2059 void br_multicast_port_ctx_init(struct net_bridge_port *port,
2060 				struct net_bridge_vlan *vlan,
2061 				struct net_bridge_mcast_port *pmctx)
2062 {
2063 	pmctx->port = port;
2064 	pmctx->vlan = vlan;
2065 	pmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
2066 
2067 	skb_queue_head_init(&pmctx->query_queue);
2068 	INIT_WORK(&pmctx->query_queue_work, br_multicast_port_query_queue_work);
2069 
2070 	timer_setup(&pmctx->ip4_mc_router_timer,
2071 		    br_ip4_multicast_router_expired, 0);
2072 	timer_setup(&pmctx->ip4_own_query.timer,
2073 		    br_ip4_multicast_port_query_expired, 0);
2074 #if IS_ENABLED(CONFIG_IPV6)
2075 	timer_setup(&pmctx->ip6_mc_router_timer,
2076 		    br_ip6_multicast_router_expired, 0);
2077 	timer_setup(&pmctx->ip6_own_query.timer,
2078 		    br_ip6_multicast_port_query_expired, 0);
2079 #endif
2080 	/* initialize mdb_n_entries if a new port vlan is being created */
2081 	if (vlan) {
2082 		struct net_bridge_port_group *pg;
2083 		u32 n = 0;
2084 
2085 		spin_lock_bh(&port->br->multicast_lock);
2086 		hlist_for_each_entry(pg, &port->mglist, mglist)
2087 			if (pg->key.addr.vid == vlan->vid)
2088 				n++;
2089 		WRITE_ONCE(pmctx->mdb_n_entries, n);
2090 		spin_unlock_bh(&port->br->multicast_lock);
2091 	}
2092 }
2093 
br_multicast_port_ctx_deinit(struct net_bridge_mcast_port * pmctx)2094 void br_multicast_port_ctx_deinit(struct net_bridge_mcast_port *pmctx)
2095 {
2096 	struct net_bridge *br = pmctx->port->br;
2097 	bool del = false;
2098 
2099 #if IS_ENABLED(CONFIG_IPV6)
2100 	timer_shutdown_sync(&pmctx->ip6_own_query.timer);
2101 	timer_shutdown_sync(&pmctx->ip6_mc_router_timer);
2102 #endif
2103 	timer_shutdown_sync(&pmctx->ip4_own_query.timer);
2104 	timer_shutdown_sync(&pmctx->ip4_mc_router_timer);
2105 
2106 	spin_lock_bh(&br->multicast_lock);
2107 	del |= br_ip6_multicast_rport_del(pmctx);
2108 	del |= br_ip4_multicast_rport_del(pmctx);
2109 	br_multicast_rport_del_notify(pmctx, del);
2110 	spin_unlock_bh(&br->multicast_lock);
2111 	cancel_work_sync(&pmctx->query_queue_work);
2112 	__skb_queue_purge(&pmctx->query_queue);
2113 }
2114 
br_multicast_add_port(struct net_bridge_port * port)2115 int br_multicast_add_port(struct net_bridge_port *port)
2116 {
2117 	int err;
2118 
2119 	port->multicast_eht_hosts_limit = BR_MCAST_DEFAULT_EHT_HOSTS_LIMIT;
2120 	br_multicast_port_ctx_init(port, NULL, &port->multicast_ctx);
2121 
2122 	err = br_mc_disabled_update(port->dev,
2123 				    br_opt_get(port->br,
2124 					       BROPT_MULTICAST_ENABLED),
2125 				    NULL);
2126 	if (err && err != -EOPNOTSUPP)
2127 		return err;
2128 
2129 	port->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats);
2130 	if (!port->mcast_stats)
2131 		return -ENOMEM;
2132 
2133 	return 0;
2134 }
2135 
br_multicast_del_port(struct net_bridge_port * port)2136 void br_multicast_del_port(struct net_bridge_port *port)
2137 {
2138 	struct net_bridge *br = port->br;
2139 	struct net_bridge_port_group *pg;
2140 	struct hlist_node *n;
2141 
2142 	/* Take care of the remaining groups, only perm ones should be left */
2143 	spin_lock_bh(&br->multicast_lock);
2144 	hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
2145 		br_multicast_find_del_pg(br, pg);
2146 	spin_unlock_bh(&br->multicast_lock);
2147 	flush_work(&br->mcast_gc_work);
2148 	br_multicast_port_ctx_deinit(&port->multicast_ctx);
2149 	free_percpu(port->mcast_stats);
2150 }
2151 
br_multicast_enable(struct bridge_mcast_own_query * query)2152 static void br_multicast_enable(struct bridge_mcast_own_query *query)
2153 {
2154 	query->startup_sent = 0;
2155 
2156 	if (timer_delete_sync_try(&query->timer) >= 0 ||
2157 	    timer_delete(&query->timer))
2158 		mod_timer(&query->timer, jiffies);
2159 }
2160 
__br_multicast_enable_port_ctx(struct net_bridge_mcast_port * pmctx)2161 static void __br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx)
2162 {
2163 	struct net_bridge *br = pmctx->port->br;
2164 	struct net_bridge_mcast *brmctx;
2165 
2166 	brmctx = br_multicast_port_ctx_get_global(pmctx);
2167 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
2168 	    !netif_running(br->dev))
2169 		return;
2170 
2171 	br_multicast_enable(&pmctx->ip4_own_query);
2172 #if IS_ENABLED(CONFIG_IPV6)
2173 	br_multicast_enable(&pmctx->ip6_own_query);
2174 #endif
2175 	if (pmctx->multicast_router == MDB_RTR_TYPE_PERM) {
2176 		br_ip4_multicast_add_router(brmctx, pmctx);
2177 		br_ip6_multicast_add_router(brmctx, pmctx);
2178 	}
2179 }
2180 
br_multicast_enable_port_ctx(struct net_bridge_mcast_port * pmctx)2181 static void br_multicast_enable_port_ctx(struct net_bridge_mcast_port *pmctx)
2182 {
2183 	struct net_bridge *br = pmctx->port->br;
2184 
2185 	spin_lock_bh(&br->multicast_lock);
2186 	if (br_multicast_port_ctx_is_vlan(pmctx) &&
2187 	    !(pmctx->vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED)) {
2188 		spin_unlock_bh(&br->multicast_lock);
2189 		return;
2190 	}
2191 	__br_multicast_enable_port_ctx(pmctx);
2192 	spin_unlock_bh(&br->multicast_lock);
2193 }
2194 
__br_multicast_disable_port_ctx(struct net_bridge_mcast_port * pmctx)2195 static void __br_multicast_disable_port_ctx(struct net_bridge_mcast_port *pmctx)
2196 {
2197 	struct net_bridge_port_group *pg;
2198 	struct hlist_node *n;
2199 	bool del = false;
2200 
2201 	hlist_for_each_entry_safe(pg, n, &pmctx->port->mglist, mglist)
2202 		if (!(pg->flags & MDB_PG_FLAGS_PERMANENT) &&
2203 		    (!br_multicast_port_ctx_is_vlan(pmctx) ||
2204 		     pg->key.addr.vid == pmctx->vlan->vid))
2205 			br_multicast_find_del_pg(pmctx->port->br, pg);
2206 
2207 	del |= br_ip4_multicast_rport_del(pmctx);
2208 	timer_delete(&pmctx->ip4_mc_router_timer);
2209 	timer_delete(&pmctx->ip4_own_query.timer);
2210 	del |= br_ip6_multicast_rport_del(pmctx);
2211 #if IS_ENABLED(CONFIG_IPV6)
2212 	timer_delete(&pmctx->ip6_mc_router_timer);
2213 	timer_delete(&pmctx->ip6_own_query.timer);
2214 #endif
2215 	br_multicast_rport_del_notify(pmctx, del);
2216 }
2217 
br_multicast_disable_port_ctx(struct net_bridge_mcast_port * pmctx)2218 static void br_multicast_disable_port_ctx(struct net_bridge_mcast_port *pmctx)
2219 {
2220 	struct net_bridge *br = pmctx->port->br;
2221 
2222 	spin_lock_bh(&br->multicast_lock);
2223 	if (br_multicast_port_ctx_is_vlan(pmctx) &&
2224 	    !(pmctx->vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED)) {
2225 		spin_unlock_bh(&br->multicast_lock);
2226 		return;
2227 	}
2228 
2229 	__br_multicast_disable_port_ctx(pmctx);
2230 	spin_unlock_bh(&br->multicast_lock);
2231 }
2232 
br_multicast_toggle_port(struct net_bridge_port * port,bool on)2233 static void br_multicast_toggle_port(struct net_bridge_port *port, bool on)
2234 {
2235 #if IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING)
2236 	if (br_opt_get(port->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) {
2237 		struct net_bridge_vlan_group *vg;
2238 		struct net_bridge_vlan *vlan;
2239 
2240 		rcu_read_lock();
2241 		vg = nbp_vlan_group_rcu(port);
2242 		if (!vg) {
2243 			rcu_read_unlock();
2244 			return;
2245 		}
2246 
2247 		/* iterate each vlan, toggle vlan multicast context */
2248 		list_for_each_entry_rcu(vlan, &vg->vlan_list, vlist) {
2249 			struct net_bridge_mcast_port *pmctx =
2250 						&vlan->port_mcast_ctx;
2251 			u8 state = br_vlan_get_state(vlan);
2252 			/* enable vlan multicast context when state is
2253 			 * LEARNING or FORWARDING
2254 			 */
2255 			if (on && br_vlan_state_allowed(state, true))
2256 				br_multicast_enable_port_ctx(pmctx);
2257 			else
2258 				br_multicast_disable_port_ctx(pmctx);
2259 		}
2260 		rcu_read_unlock();
2261 		return;
2262 	}
2263 #endif
2264 	/* toggle port multicast context when vlan snooping is disabled */
2265 	if (on)
2266 		br_multicast_enable_port_ctx(&port->multicast_ctx);
2267 	else
2268 		br_multicast_disable_port_ctx(&port->multicast_ctx);
2269 }
2270 
br_multicast_enable_port(struct net_bridge_port * port)2271 void br_multicast_enable_port(struct net_bridge_port *port)
2272 {
2273 	br_multicast_toggle_port(port, true);
2274 }
2275 
br_multicast_disable_port(struct net_bridge_port * port)2276 void br_multicast_disable_port(struct net_bridge_port *port)
2277 {
2278 	br_multicast_toggle_port(port, false);
2279 }
2280 
__grp_src_delete_marked(struct net_bridge_port_group * pg)2281 static int __grp_src_delete_marked(struct net_bridge_port_group *pg)
2282 {
2283 	struct net_bridge_group_src *ent;
2284 	struct hlist_node *tmp;
2285 	int deleted = 0;
2286 
2287 	hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node)
2288 		if (ent->flags & BR_SGRP_F_DELETE) {
2289 			br_multicast_del_group_src(ent, false);
2290 			deleted++;
2291 		}
2292 
2293 	return deleted;
2294 }
2295 
__grp_src_mod_timer(struct net_bridge_group_src * src,unsigned long expires)2296 static void __grp_src_mod_timer(struct net_bridge_group_src *src,
2297 				unsigned long expires)
2298 {
2299 	mod_timer(&src->timer, expires);
2300 	br_multicast_fwd_src_handle(src);
2301 }
2302 
__grp_src_query_marked_and_rexmit(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg)2303 static void __grp_src_query_marked_and_rexmit(struct net_bridge_mcast *brmctx,
2304 					      struct net_bridge_mcast_port *pmctx,
2305 					      struct net_bridge_port_group *pg)
2306 {
2307 	struct bridge_mcast_other_query *other_query = NULL;
2308 	u32 lmqc = brmctx->multicast_last_member_count;
2309 	unsigned long lmqt, lmi, now = jiffies;
2310 	struct net_bridge_group_src *ent;
2311 
2312 	if (!netif_running(brmctx->br->dev) ||
2313 	    !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
2314 		return;
2315 
2316 	if (pg->key.addr.proto == htons(ETH_P_IP))
2317 		other_query = &brmctx->ip4_other_query;
2318 #if IS_ENABLED(CONFIG_IPV6)
2319 	else
2320 		other_query = &brmctx->ip6_other_query;
2321 #endif
2322 
2323 	lmqt = now + br_multicast_lmqt(brmctx);
2324 	hlist_for_each_entry(ent, &pg->src_list, node) {
2325 		if (ent->flags & BR_SGRP_F_SEND) {
2326 			ent->flags &= ~BR_SGRP_F_SEND;
2327 			if (ent->timer.expires > lmqt) {
2328 				if (brmctx->multicast_querier &&
2329 				    other_query &&
2330 				    !timer_pending(&other_query->timer))
2331 					ent->src_query_rexmit_cnt = lmqc;
2332 				__grp_src_mod_timer(ent, lmqt);
2333 			}
2334 		}
2335 	}
2336 
2337 	if (!brmctx->multicast_querier ||
2338 	    !other_query || timer_pending(&other_query->timer))
2339 		return;
2340 
2341 	__br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
2342 				  &pg->key.addr, true, 1, NULL);
2343 
2344 	lmi = now + brmctx->multicast_last_member_interval;
2345 	if (!timer_pending(&pg->rexmit_timer) ||
2346 	    time_after(pg->rexmit_timer.expires, lmi))
2347 		mod_timer(&pg->rexmit_timer, lmi);
2348 }
2349 
__grp_send_query_and_rexmit(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg)2350 static void __grp_send_query_and_rexmit(struct net_bridge_mcast *brmctx,
2351 					struct net_bridge_mcast_port *pmctx,
2352 					struct net_bridge_port_group *pg)
2353 {
2354 	struct bridge_mcast_other_query *other_query = NULL;
2355 	unsigned long now = jiffies, lmi;
2356 
2357 	if (!netif_running(brmctx->br->dev) ||
2358 	    !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED))
2359 		return;
2360 
2361 	if (pg->key.addr.proto == htons(ETH_P_IP))
2362 		other_query = &brmctx->ip4_other_query;
2363 #if IS_ENABLED(CONFIG_IPV6)
2364 	else
2365 		other_query = &brmctx->ip6_other_query;
2366 #endif
2367 
2368 	if (brmctx->multicast_querier &&
2369 	    other_query && !timer_pending(&other_query->timer)) {
2370 		lmi = now + brmctx->multicast_last_member_interval;
2371 		pg->grp_query_rexmit_cnt = brmctx->multicast_last_member_count - 1;
2372 		__br_multicast_send_query(brmctx, pmctx, pg, &pg->key.addr,
2373 					  &pg->key.addr, false, 0, NULL);
2374 		if (!timer_pending(&pg->rexmit_timer) ||
2375 		    time_after(pg->rexmit_timer.expires, lmi))
2376 			mod_timer(&pg->rexmit_timer, lmi);
2377 	}
2378 
2379 	if (pg->filter_mode == MCAST_EXCLUDE &&
2380 	    (!timer_pending(&pg->timer) ||
2381 	     time_after(pg->timer.expires, now + br_multicast_lmqt(brmctx))))
2382 		mod_timer(&pg->timer, now + br_multicast_lmqt(brmctx));
2383 }
2384 
2385 /* State          Msg type      New state                Actions
2386  * INCLUDE (A)    IS_IN (B)     INCLUDE (A+B)            (B)=GMI
2387  * INCLUDE (A)    ALLOW (B)     INCLUDE (A+B)            (B)=GMI
2388  * EXCLUDE (X,Y)  ALLOW (A)     EXCLUDE (X+A,Y-A)        (A)=GMI
2389  */
br_multicast_isinc_allow(const struct net_bridge_mcast * brmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2390 static bool br_multicast_isinc_allow(const struct net_bridge_mcast *brmctx,
2391 				     struct net_bridge_port_group *pg, void *h_addr,
2392 				     void *srcs, u32 nsrcs, size_t addr_size,
2393 				     int grec_type)
2394 {
2395 	struct net_bridge_group_src *ent;
2396 	unsigned long now = jiffies;
2397 	bool changed = false;
2398 	struct br_ip src_ip;
2399 	u32 src_idx;
2400 
2401 	memset(&src_ip, 0, sizeof(src_ip));
2402 	src_ip.proto = pg->key.addr.proto;
2403 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2404 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2405 		ent = br_multicast_find_group_src(pg, &src_ip);
2406 		if (!ent) {
2407 			ent = br_multicast_new_group_src(pg, &src_ip);
2408 			if (ent)
2409 				changed = true;
2410 		}
2411 
2412 		if (ent)
2413 			__grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx));
2414 	}
2415 
2416 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2417 				    grec_type))
2418 		changed = true;
2419 
2420 	return changed;
2421 }
2422 
2423 /* State          Msg type      New state                Actions
2424  * INCLUDE (A)    IS_EX (B)     EXCLUDE (A*B,B-A)        (B-A)=0
2425  *                                                       Delete (A-B)
2426  *                                                       Group Timer=GMI
2427  */
__grp_src_isexc_incl(const struct net_bridge_mcast * brmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2428 static void __grp_src_isexc_incl(const struct net_bridge_mcast *brmctx,
2429 				 struct net_bridge_port_group *pg, void *h_addr,
2430 				 void *srcs, u32 nsrcs, size_t addr_size,
2431 				 int grec_type)
2432 {
2433 	struct net_bridge_group_src *ent;
2434 	struct br_ip src_ip;
2435 	u32 src_idx;
2436 
2437 	hlist_for_each_entry(ent, &pg->src_list, node)
2438 		ent->flags |= BR_SGRP_F_DELETE;
2439 
2440 	memset(&src_ip, 0, sizeof(src_ip));
2441 	src_ip.proto = pg->key.addr.proto;
2442 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2443 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2444 		ent = br_multicast_find_group_src(pg, &src_ip);
2445 		if (ent)
2446 			ent->flags &= ~BR_SGRP_F_DELETE;
2447 		else
2448 			ent = br_multicast_new_group_src(pg, &src_ip);
2449 		if (ent)
2450 			br_multicast_fwd_src_handle(ent);
2451 	}
2452 
2453 	br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2454 				grec_type);
2455 
2456 	__grp_src_delete_marked(pg);
2457 }
2458 
2459 /* State          Msg type      New state                Actions
2460  * EXCLUDE (X,Y)  IS_EX (A)     EXCLUDE (A-Y,Y*A)        (A-X-Y)=GMI
2461  *                                                       Delete (X-A)
2462  *                                                       Delete (Y-A)
2463  *                                                       Group Timer=GMI
2464  */
__grp_src_isexc_excl(const struct net_bridge_mcast * brmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2465 static bool __grp_src_isexc_excl(const struct net_bridge_mcast *brmctx,
2466 				 struct net_bridge_port_group *pg, void *h_addr,
2467 				 void *srcs, u32 nsrcs, size_t addr_size,
2468 				 int grec_type)
2469 {
2470 	struct net_bridge_group_src *ent;
2471 	unsigned long now = jiffies;
2472 	bool changed = false;
2473 	struct br_ip src_ip;
2474 	u32 src_idx;
2475 
2476 	hlist_for_each_entry(ent, &pg->src_list, node)
2477 		ent->flags |= BR_SGRP_F_DELETE;
2478 
2479 	memset(&src_ip, 0, sizeof(src_ip));
2480 	src_ip.proto = pg->key.addr.proto;
2481 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2482 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2483 		ent = br_multicast_find_group_src(pg, &src_ip);
2484 		if (ent) {
2485 			ent->flags &= ~BR_SGRP_F_DELETE;
2486 		} else {
2487 			ent = br_multicast_new_group_src(pg, &src_ip);
2488 			if (ent) {
2489 				__grp_src_mod_timer(ent,
2490 						    now + br_multicast_gmi(brmctx));
2491 				changed = true;
2492 			}
2493 		}
2494 	}
2495 
2496 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2497 				    grec_type))
2498 		changed = true;
2499 
2500 	if (__grp_src_delete_marked(pg))
2501 		changed = true;
2502 
2503 	return changed;
2504 }
2505 
br_multicast_isexc(const struct net_bridge_mcast * brmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2506 static bool br_multicast_isexc(const struct net_bridge_mcast *brmctx,
2507 			       struct net_bridge_port_group *pg, void *h_addr,
2508 			       void *srcs, u32 nsrcs, size_t addr_size,
2509 			       int grec_type)
2510 {
2511 	bool changed = false;
2512 
2513 	switch (pg->filter_mode) {
2514 	case MCAST_INCLUDE:
2515 		__grp_src_isexc_incl(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2516 				     grec_type);
2517 		br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE);
2518 		changed = true;
2519 		break;
2520 	case MCAST_EXCLUDE:
2521 		changed = __grp_src_isexc_excl(brmctx, pg, h_addr, srcs, nsrcs,
2522 					       addr_size, grec_type);
2523 		break;
2524 	}
2525 
2526 	pg->filter_mode = MCAST_EXCLUDE;
2527 	mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx));
2528 
2529 	return changed;
2530 }
2531 
2532 /* State          Msg type      New state                Actions
2533  * INCLUDE (A)    TO_IN (B)     INCLUDE (A+B)            (B)=GMI
2534  *                                                       Send Q(G,A-B)
2535  */
__grp_src_toin_incl(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2536 static bool __grp_src_toin_incl(struct net_bridge_mcast *brmctx,
2537 				struct net_bridge_mcast_port *pmctx,
2538 				struct net_bridge_port_group *pg, void *h_addr,
2539 				void *srcs, u32 nsrcs, size_t addr_size,
2540 				int grec_type)
2541 {
2542 	u32 src_idx, to_send = pg->src_ents;
2543 	struct net_bridge_group_src *ent;
2544 	unsigned long now = jiffies;
2545 	bool changed = false;
2546 	struct br_ip src_ip;
2547 
2548 	hlist_for_each_entry(ent, &pg->src_list, node)
2549 		ent->flags |= BR_SGRP_F_SEND;
2550 
2551 	memset(&src_ip, 0, sizeof(src_ip));
2552 	src_ip.proto = pg->key.addr.proto;
2553 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2554 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2555 		ent = br_multicast_find_group_src(pg, &src_ip);
2556 		if (ent) {
2557 			ent->flags &= ~BR_SGRP_F_SEND;
2558 			to_send--;
2559 		} else {
2560 			ent = br_multicast_new_group_src(pg, &src_ip);
2561 			if (ent)
2562 				changed = true;
2563 		}
2564 		if (ent)
2565 			__grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx));
2566 	}
2567 
2568 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2569 				    grec_type))
2570 		changed = true;
2571 
2572 	if (to_send)
2573 		__grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2574 
2575 	return changed;
2576 }
2577 
2578 /* State          Msg type      New state                Actions
2579  * EXCLUDE (X,Y)  TO_IN (A)     EXCLUDE (X+A,Y-A)        (A)=GMI
2580  *                                                       Send Q(G,X-A)
2581  *                                                       Send Q(G)
2582  */
__grp_src_toin_excl(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2583 static bool __grp_src_toin_excl(struct net_bridge_mcast *brmctx,
2584 				struct net_bridge_mcast_port *pmctx,
2585 				struct net_bridge_port_group *pg, void *h_addr,
2586 				void *srcs, u32 nsrcs, size_t addr_size,
2587 				int grec_type)
2588 {
2589 	u32 src_idx, to_send = pg->src_ents;
2590 	struct net_bridge_group_src *ent;
2591 	unsigned long now = jiffies;
2592 	bool changed = false;
2593 	struct br_ip src_ip;
2594 
2595 	hlist_for_each_entry(ent, &pg->src_list, node)
2596 		if (timer_pending(&ent->timer))
2597 			ent->flags |= BR_SGRP_F_SEND;
2598 
2599 	memset(&src_ip, 0, sizeof(src_ip));
2600 	src_ip.proto = pg->key.addr.proto;
2601 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2602 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2603 		ent = br_multicast_find_group_src(pg, &src_ip);
2604 		if (ent) {
2605 			if (timer_pending(&ent->timer)) {
2606 				ent->flags &= ~BR_SGRP_F_SEND;
2607 				to_send--;
2608 			}
2609 		} else {
2610 			ent = br_multicast_new_group_src(pg, &src_ip);
2611 			if (ent)
2612 				changed = true;
2613 		}
2614 		if (ent)
2615 			__grp_src_mod_timer(ent, now + br_multicast_gmi(brmctx));
2616 	}
2617 
2618 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2619 				    grec_type))
2620 		changed = true;
2621 
2622 	if (to_send)
2623 		__grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2624 
2625 	__grp_send_query_and_rexmit(brmctx, pmctx, pg);
2626 
2627 	return changed;
2628 }
2629 
br_multicast_toin(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2630 static bool br_multicast_toin(struct net_bridge_mcast *brmctx,
2631 			      struct net_bridge_mcast_port *pmctx,
2632 			      struct net_bridge_port_group *pg, void *h_addr,
2633 			      void *srcs, u32 nsrcs, size_t addr_size,
2634 			      int grec_type)
2635 {
2636 	bool changed = false;
2637 
2638 	switch (pg->filter_mode) {
2639 	case MCAST_INCLUDE:
2640 		changed = __grp_src_toin_incl(brmctx, pmctx, pg, h_addr, srcs,
2641 					      nsrcs, addr_size, grec_type);
2642 		break;
2643 	case MCAST_EXCLUDE:
2644 		changed = __grp_src_toin_excl(brmctx, pmctx, pg, h_addr, srcs,
2645 					      nsrcs, addr_size, grec_type);
2646 		break;
2647 	}
2648 
2649 	if (br_multicast_eht_should_del_pg(pg)) {
2650 		pg->flags |= MDB_PG_FLAGS_FAST_LEAVE;
2651 		br_multicast_find_del_pg(pg->key.port->br, pg);
2652 		/* a notification has already been sent and we shouldn't
2653 		 * access pg after the delete so we have to return false
2654 		 */
2655 		changed = false;
2656 	}
2657 
2658 	return changed;
2659 }
2660 
2661 /* State          Msg type      New state                Actions
2662  * INCLUDE (A)    TO_EX (B)     EXCLUDE (A*B,B-A)        (B-A)=0
2663  *                                                       Delete (A-B)
2664  *                                                       Send Q(G,A*B)
2665  *                                                       Group Timer=GMI
2666  */
__grp_src_toex_incl(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2667 static void __grp_src_toex_incl(struct net_bridge_mcast *brmctx,
2668 				struct net_bridge_mcast_port *pmctx,
2669 				struct net_bridge_port_group *pg, void *h_addr,
2670 				void *srcs, u32 nsrcs, size_t addr_size,
2671 				int grec_type)
2672 {
2673 	struct net_bridge_group_src *ent;
2674 	u32 src_idx, to_send = 0;
2675 	struct br_ip src_ip;
2676 
2677 	hlist_for_each_entry(ent, &pg->src_list, node)
2678 		ent->flags = (ent->flags & ~BR_SGRP_F_SEND) | BR_SGRP_F_DELETE;
2679 
2680 	memset(&src_ip, 0, sizeof(src_ip));
2681 	src_ip.proto = pg->key.addr.proto;
2682 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2683 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2684 		ent = br_multicast_find_group_src(pg, &src_ip);
2685 		if (ent) {
2686 			ent->flags = (ent->flags & ~BR_SGRP_F_DELETE) |
2687 				     BR_SGRP_F_SEND;
2688 			to_send++;
2689 		} else {
2690 			ent = br_multicast_new_group_src(pg, &src_ip);
2691 		}
2692 		if (ent)
2693 			br_multicast_fwd_src_handle(ent);
2694 	}
2695 
2696 	br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2697 				grec_type);
2698 
2699 	__grp_src_delete_marked(pg);
2700 	if (to_send)
2701 		__grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2702 }
2703 
2704 /* State          Msg type      New state                Actions
2705  * EXCLUDE (X,Y)  TO_EX (A)     EXCLUDE (A-Y,Y*A)        (A-X-Y)=Group Timer
2706  *                                                       Delete (X-A)
2707  *                                                       Delete (Y-A)
2708  *                                                       Send Q(G,A-Y)
2709  *                                                       Group Timer=GMI
2710  */
__grp_src_toex_excl(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2711 static bool __grp_src_toex_excl(struct net_bridge_mcast *brmctx,
2712 				struct net_bridge_mcast_port *pmctx,
2713 				struct net_bridge_port_group *pg, void *h_addr,
2714 				void *srcs, u32 nsrcs, size_t addr_size,
2715 				int grec_type)
2716 {
2717 	struct net_bridge_group_src *ent;
2718 	u32 src_idx, to_send = 0;
2719 	bool changed = false;
2720 	struct br_ip src_ip;
2721 
2722 	hlist_for_each_entry(ent, &pg->src_list, node)
2723 		ent->flags = (ent->flags & ~BR_SGRP_F_SEND) | BR_SGRP_F_DELETE;
2724 
2725 	memset(&src_ip, 0, sizeof(src_ip));
2726 	src_ip.proto = pg->key.addr.proto;
2727 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2728 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2729 		ent = br_multicast_find_group_src(pg, &src_ip);
2730 		if (ent) {
2731 			ent->flags &= ~BR_SGRP_F_DELETE;
2732 		} else {
2733 			ent = br_multicast_new_group_src(pg, &src_ip);
2734 			if (ent) {
2735 				__grp_src_mod_timer(ent, pg->timer.expires);
2736 				changed = true;
2737 			}
2738 		}
2739 		if (ent && timer_pending(&ent->timer)) {
2740 			ent->flags |= BR_SGRP_F_SEND;
2741 			to_send++;
2742 		}
2743 	}
2744 
2745 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2746 				    grec_type))
2747 		changed = true;
2748 
2749 	if (__grp_src_delete_marked(pg))
2750 		changed = true;
2751 	if (to_send)
2752 		__grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2753 
2754 	return changed;
2755 }
2756 
br_multicast_toex(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2757 static bool br_multicast_toex(struct net_bridge_mcast *brmctx,
2758 			      struct net_bridge_mcast_port *pmctx,
2759 			      struct net_bridge_port_group *pg, void *h_addr,
2760 			      void *srcs, u32 nsrcs, size_t addr_size,
2761 			      int grec_type)
2762 {
2763 	bool changed = false;
2764 
2765 	switch (pg->filter_mode) {
2766 	case MCAST_INCLUDE:
2767 		__grp_src_toex_incl(brmctx, pmctx, pg, h_addr, srcs, nsrcs,
2768 				    addr_size, grec_type);
2769 		br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE);
2770 		changed = true;
2771 		break;
2772 	case MCAST_EXCLUDE:
2773 		changed = __grp_src_toex_excl(brmctx, pmctx, pg, h_addr, srcs,
2774 					      nsrcs, addr_size, grec_type);
2775 		break;
2776 	}
2777 
2778 	pg->filter_mode = MCAST_EXCLUDE;
2779 	mod_timer(&pg->timer, jiffies + br_multicast_gmi(brmctx));
2780 
2781 	return changed;
2782 }
2783 
2784 /* State          Msg type      New state                Actions
2785  * INCLUDE (A)    BLOCK (B)     INCLUDE (A)              Send Q(G,A*B)
2786  */
__grp_src_block_incl(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2787 static bool __grp_src_block_incl(struct net_bridge_mcast *brmctx,
2788 				 struct net_bridge_mcast_port *pmctx,
2789 				 struct net_bridge_port_group *pg, void *h_addr,
2790 				 void *srcs, u32 nsrcs, size_t addr_size, int grec_type)
2791 {
2792 	struct net_bridge_group_src *ent;
2793 	u32 src_idx, to_send = 0;
2794 	bool changed = false;
2795 	struct br_ip src_ip;
2796 
2797 	hlist_for_each_entry(ent, &pg->src_list, node)
2798 		ent->flags &= ~BR_SGRP_F_SEND;
2799 
2800 	memset(&src_ip, 0, sizeof(src_ip));
2801 	src_ip.proto = pg->key.addr.proto;
2802 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2803 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2804 		ent = br_multicast_find_group_src(pg, &src_ip);
2805 		if (ent) {
2806 			ent->flags |= BR_SGRP_F_SEND;
2807 			to_send++;
2808 		}
2809 	}
2810 
2811 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2812 				    grec_type))
2813 		changed = true;
2814 
2815 	if (to_send)
2816 		__grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2817 
2818 	return changed;
2819 }
2820 
2821 /* State          Msg type      New state                Actions
2822  * EXCLUDE (X,Y)  BLOCK (A)     EXCLUDE (X+(A-Y),Y)      (A-X-Y)=Group Timer
2823  *                                                       Send Q(G,A-Y)
2824  */
__grp_src_block_excl(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2825 static bool __grp_src_block_excl(struct net_bridge_mcast *brmctx,
2826 				 struct net_bridge_mcast_port *pmctx,
2827 				 struct net_bridge_port_group *pg, void *h_addr,
2828 				 void *srcs, u32 nsrcs, size_t addr_size, int grec_type)
2829 {
2830 	struct net_bridge_group_src *ent;
2831 	u32 src_idx, to_send = 0;
2832 	bool changed = false;
2833 	struct br_ip src_ip;
2834 
2835 	hlist_for_each_entry(ent, &pg->src_list, node)
2836 		ent->flags &= ~BR_SGRP_F_SEND;
2837 
2838 	memset(&src_ip, 0, sizeof(src_ip));
2839 	src_ip.proto = pg->key.addr.proto;
2840 	for (src_idx = 0; src_idx < nsrcs; src_idx++) {
2841 		memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
2842 		ent = br_multicast_find_group_src(pg, &src_ip);
2843 		if (!ent) {
2844 			ent = br_multicast_new_group_src(pg, &src_ip);
2845 			if (ent) {
2846 				__grp_src_mod_timer(ent, pg->timer.expires);
2847 				changed = true;
2848 			}
2849 		}
2850 		if (ent && timer_pending(&ent->timer)) {
2851 			ent->flags |= BR_SGRP_F_SEND;
2852 			to_send++;
2853 		}
2854 	}
2855 
2856 	if (br_multicast_eht_handle(brmctx, pg, h_addr, srcs, nsrcs, addr_size,
2857 				    grec_type))
2858 		changed = true;
2859 
2860 	if (to_send)
2861 		__grp_src_query_marked_and_rexmit(brmctx, pmctx, pg);
2862 
2863 	return changed;
2864 }
2865 
br_multicast_block(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct net_bridge_port_group * pg,void * h_addr,void * srcs,u32 nsrcs,size_t addr_size,int grec_type)2866 static bool br_multicast_block(struct net_bridge_mcast *brmctx,
2867 			       struct net_bridge_mcast_port *pmctx,
2868 			       struct net_bridge_port_group *pg, void *h_addr,
2869 			       void *srcs, u32 nsrcs, size_t addr_size, int grec_type)
2870 {
2871 	bool changed = false;
2872 
2873 	switch (pg->filter_mode) {
2874 	case MCAST_INCLUDE:
2875 		changed = __grp_src_block_incl(brmctx, pmctx, pg, h_addr, srcs,
2876 					       nsrcs, addr_size, grec_type);
2877 		break;
2878 	case MCAST_EXCLUDE:
2879 		changed = __grp_src_block_excl(brmctx, pmctx, pg, h_addr, srcs,
2880 					       nsrcs, addr_size, grec_type);
2881 		break;
2882 	}
2883 
2884 	if ((pg->filter_mode == MCAST_INCLUDE && hlist_empty(&pg->src_list)) ||
2885 	    br_multicast_eht_should_del_pg(pg)) {
2886 		if (br_multicast_eht_should_del_pg(pg))
2887 			pg->flags |= MDB_PG_FLAGS_FAST_LEAVE;
2888 		br_multicast_find_del_pg(pg->key.port->br, pg);
2889 		/* a notification has already been sent and we shouldn't
2890 		 * access pg after the delete so we have to return false
2891 		 */
2892 		changed = false;
2893 	}
2894 
2895 	return changed;
2896 }
2897 
2898 static struct net_bridge_port_group *
br_multicast_find_port(struct net_bridge_mdb_entry * mp,struct net_bridge_port * p,const unsigned char * src)2899 br_multicast_find_port(struct net_bridge_mdb_entry *mp,
2900 		       struct net_bridge_port *p,
2901 		       const unsigned char *src)
2902 {
2903 	struct net_bridge *br __maybe_unused = mp->br;
2904 	struct net_bridge_port_group *pg;
2905 
2906 	for (pg = mlock_dereference(mp->ports, br);
2907 	     pg;
2908 	     pg = mlock_dereference(pg->next, br))
2909 		if (br_port_group_equal(pg, p, src))
2910 			return pg;
2911 
2912 	return NULL;
2913 }
2914 
br_ip4_multicast_igmp3_report(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb,u16 vid)2915 static int br_ip4_multicast_igmp3_report(struct net_bridge_mcast *brmctx,
2916 					 struct net_bridge_mcast_port *pmctx,
2917 					 struct sk_buff *skb,
2918 					 u16 vid)
2919 {
2920 	bool igmpv2 = brmctx->multicast_igmp_version == 2;
2921 	struct net_bridge_mdb_entry *mdst;
2922 	struct net_bridge_port_group *pg;
2923 	const unsigned char *src;
2924 	struct igmpv3_report *ih;
2925 	struct igmpv3_grec *grec;
2926 	int i, len, num, type;
2927 	__be32 group, *h_addr;
2928 	bool changed = false;
2929 	int err = 0;
2930 	u16 nsrcs;
2931 
2932 	ih = igmpv3_report_hdr(skb);
2933 	num = ntohs(ih->ngrec);
2934 	len = skb_transport_offset(skb) + sizeof(*ih);
2935 
2936 	for (i = 0; i < num; i++) {
2937 		len += sizeof(*grec);
2938 		if (!ip_mc_may_pull(skb, len))
2939 			return -EINVAL;
2940 
2941 		grec = (void *)(skb->data + len - sizeof(*grec));
2942 		group = grec->grec_mca;
2943 		type = grec->grec_type;
2944 		nsrcs = ntohs(grec->grec_nsrcs);
2945 
2946 		len += nsrcs * 4;
2947 		if (!ip_mc_may_pull(skb, len))
2948 			return -EINVAL;
2949 
2950 		switch (type) {
2951 		case IGMPV3_MODE_IS_INCLUDE:
2952 		case IGMPV3_MODE_IS_EXCLUDE:
2953 		case IGMPV3_CHANGE_TO_INCLUDE:
2954 		case IGMPV3_CHANGE_TO_EXCLUDE:
2955 		case IGMPV3_ALLOW_NEW_SOURCES:
2956 		case IGMPV3_BLOCK_OLD_SOURCES:
2957 			break;
2958 
2959 		default:
2960 			continue;
2961 		}
2962 
2963 		src = eth_hdr(skb)->h_source;
2964 		if (nsrcs == 0 &&
2965 		    (type == IGMPV3_CHANGE_TO_INCLUDE ||
2966 		     type == IGMPV3_MODE_IS_INCLUDE)) {
2967 			if (!pmctx || igmpv2) {
2968 				br_ip4_multicast_leave_group(brmctx, pmctx,
2969 							     group, vid, src);
2970 				continue;
2971 			}
2972 		} else {
2973 			err = br_ip4_multicast_add_group(brmctx, pmctx, group,
2974 							 vid, src, igmpv2);
2975 			if (err)
2976 				break;
2977 		}
2978 
2979 		if (!pmctx || igmpv2)
2980 			continue;
2981 
2982 		spin_lock(&brmctx->br->multicast_lock);
2983 		if (!br_multicast_ctx_should_use(brmctx, pmctx))
2984 			goto unlock_continue;
2985 
2986 		mdst = br_mdb_ip4_get(brmctx->br, group, vid);
2987 		if (!mdst)
2988 			goto unlock_continue;
2989 		pg = br_multicast_find_port(mdst, pmctx->port, src);
2990 		if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT))
2991 			goto unlock_continue;
2992 		/* reload grec and host addr */
2993 		grec = (void *)(skb->data + len - sizeof(*grec) - (nsrcs * 4));
2994 		h_addr = &ip_hdr(skb)->saddr;
2995 		switch (type) {
2996 		case IGMPV3_ALLOW_NEW_SOURCES:
2997 			changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
2998 							   grec->grec_src,
2999 							   nsrcs, sizeof(__be32), type);
3000 			break;
3001 		case IGMPV3_MODE_IS_INCLUDE:
3002 			changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
3003 							   grec->grec_src,
3004 							   nsrcs, sizeof(__be32), type);
3005 			break;
3006 		case IGMPV3_MODE_IS_EXCLUDE:
3007 			changed = br_multicast_isexc(brmctx, pg, h_addr,
3008 						     grec->grec_src,
3009 						     nsrcs, sizeof(__be32), type);
3010 			break;
3011 		case IGMPV3_CHANGE_TO_INCLUDE:
3012 			changed = br_multicast_toin(brmctx, pmctx, pg, h_addr,
3013 						    grec->grec_src,
3014 						    nsrcs, sizeof(__be32), type);
3015 			break;
3016 		case IGMPV3_CHANGE_TO_EXCLUDE:
3017 			changed = br_multicast_toex(brmctx, pmctx, pg, h_addr,
3018 						    grec->grec_src,
3019 						    nsrcs, sizeof(__be32), type);
3020 			break;
3021 		case IGMPV3_BLOCK_OLD_SOURCES:
3022 			changed = br_multicast_block(brmctx, pmctx, pg, h_addr,
3023 						     grec->grec_src,
3024 						     nsrcs, sizeof(__be32), type);
3025 			break;
3026 		}
3027 		if (changed)
3028 			br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB);
3029 unlock_continue:
3030 		spin_unlock(&brmctx->br->multicast_lock);
3031 	}
3032 
3033 	return err;
3034 }
3035 
3036 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_mld2_report(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb,u16 vid)3037 static int br_ip6_multicast_mld2_report(struct net_bridge_mcast *brmctx,
3038 					struct net_bridge_mcast_port *pmctx,
3039 					struct sk_buff *skb,
3040 					u16 vid)
3041 {
3042 	bool mldv1 = brmctx->multicast_mld_version == 1;
3043 	struct net_bridge_mdb_entry *mdst;
3044 	struct net_bridge_port_group *pg;
3045 	unsigned int nsrcs_offset;
3046 	struct mld2_report *mld2r;
3047 	const unsigned char *src;
3048 	struct in6_addr *h_addr;
3049 	struct mld2_grec *grec;
3050 	unsigned int grec_len;
3051 	bool changed = false;
3052 	int i, len, num;
3053 	int err = 0;
3054 
3055 	if (!ipv6_mc_may_pull(skb, sizeof(*mld2r)))
3056 		return -EINVAL;
3057 
3058 	mld2r = (struct mld2_report *)icmp6_hdr(skb);
3059 	num = ntohs(mld2r->mld2r_ngrec);
3060 	len = skb_transport_offset(skb) + sizeof(*mld2r);
3061 
3062 	for (i = 0; i < num; i++) {
3063 		__be16 *_nsrcs, __nsrcs;
3064 		u16 nsrcs;
3065 
3066 		nsrcs_offset = len + offsetof(struct mld2_grec, grec_nsrcs);
3067 
3068 		if (skb_transport_offset(skb) + ipv6_transport_len(skb) <
3069 		    nsrcs_offset + sizeof(__nsrcs))
3070 			return -EINVAL;
3071 
3072 		_nsrcs = skb_header_pointer(skb, nsrcs_offset,
3073 					    sizeof(__nsrcs), &__nsrcs);
3074 		if (!_nsrcs)
3075 			return -EINVAL;
3076 
3077 		nsrcs = ntohs(*_nsrcs);
3078 		grec_len = struct_size(grec, grec_src, nsrcs);
3079 
3080 		if (!ipv6_mc_may_pull(skb, len + grec_len))
3081 			return -EINVAL;
3082 
3083 		grec = (struct mld2_grec *)(skb->data + len);
3084 		len += grec_len;
3085 
3086 		switch (grec->grec_type) {
3087 		case MLD2_MODE_IS_INCLUDE:
3088 		case MLD2_MODE_IS_EXCLUDE:
3089 		case MLD2_CHANGE_TO_INCLUDE:
3090 		case MLD2_CHANGE_TO_EXCLUDE:
3091 		case MLD2_ALLOW_NEW_SOURCES:
3092 		case MLD2_BLOCK_OLD_SOURCES:
3093 			break;
3094 
3095 		default:
3096 			continue;
3097 		}
3098 
3099 		src = eth_hdr(skb)->h_source;
3100 		if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE ||
3101 		     grec->grec_type == MLD2_MODE_IS_INCLUDE) &&
3102 		    nsrcs == 0) {
3103 			if (!pmctx || mldv1) {
3104 				br_ip6_multicast_leave_group(brmctx, pmctx,
3105 							     &grec->grec_mca,
3106 							     vid, src);
3107 				continue;
3108 			}
3109 		} else {
3110 			err = br_ip6_multicast_add_group(brmctx, pmctx,
3111 							 &grec->grec_mca, vid,
3112 							 src, mldv1);
3113 			if (err)
3114 				break;
3115 		}
3116 
3117 		if (!pmctx || mldv1)
3118 			continue;
3119 
3120 		spin_lock(&brmctx->br->multicast_lock);
3121 		if (!br_multicast_ctx_should_use(brmctx, pmctx))
3122 			goto unlock_continue;
3123 
3124 		mdst = br_mdb_ip6_get(brmctx->br, &grec->grec_mca, vid);
3125 		if (!mdst)
3126 			goto unlock_continue;
3127 		pg = br_multicast_find_port(mdst, pmctx->port, src);
3128 		if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT))
3129 			goto unlock_continue;
3130 		h_addr = &ipv6_hdr(skb)->saddr;
3131 		switch (grec->grec_type) {
3132 		case MLD2_ALLOW_NEW_SOURCES:
3133 			changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
3134 							   grec->grec_src, nsrcs,
3135 							   sizeof(struct in6_addr),
3136 							   grec->grec_type);
3137 			break;
3138 		case MLD2_MODE_IS_INCLUDE:
3139 			changed = br_multicast_isinc_allow(brmctx, pg, h_addr,
3140 							   grec->grec_src, nsrcs,
3141 							   sizeof(struct in6_addr),
3142 							   grec->grec_type);
3143 			break;
3144 		case MLD2_MODE_IS_EXCLUDE:
3145 			changed = br_multicast_isexc(brmctx, pg, h_addr,
3146 						     grec->grec_src, nsrcs,
3147 						     sizeof(struct in6_addr),
3148 						     grec->grec_type);
3149 			break;
3150 		case MLD2_CHANGE_TO_INCLUDE:
3151 			changed = br_multicast_toin(brmctx, pmctx, pg, h_addr,
3152 						    grec->grec_src, nsrcs,
3153 						    sizeof(struct in6_addr),
3154 						    grec->grec_type);
3155 			break;
3156 		case MLD2_CHANGE_TO_EXCLUDE:
3157 			changed = br_multicast_toex(brmctx, pmctx, pg, h_addr,
3158 						    grec->grec_src, nsrcs,
3159 						    sizeof(struct in6_addr),
3160 						    grec->grec_type);
3161 			break;
3162 		case MLD2_BLOCK_OLD_SOURCES:
3163 			changed = br_multicast_block(brmctx, pmctx, pg, h_addr,
3164 						     grec->grec_src, nsrcs,
3165 						     sizeof(struct in6_addr),
3166 						     grec->grec_type);
3167 			break;
3168 		}
3169 		if (changed)
3170 			br_mdb_notify(brmctx->br->dev, mdst, pg, RTM_NEWMDB);
3171 unlock_continue:
3172 		spin_unlock(&brmctx->br->multicast_lock);
3173 	}
3174 
3175 	return err;
3176 }
3177 #endif
3178 
br_multicast_select_querier(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct br_ip * saddr)3179 static bool br_multicast_select_querier(struct net_bridge_mcast *brmctx,
3180 					struct net_bridge_mcast_port *pmctx,
3181 					struct br_ip *saddr)
3182 {
3183 	int port_ifidx = pmctx ? pmctx->port->dev->ifindex : 0;
3184 	struct timer_list *own_timer, *other_timer;
3185 	struct bridge_mcast_querier *querier;
3186 
3187 	switch (saddr->proto) {
3188 	case htons(ETH_P_IP):
3189 		querier = &brmctx->ip4_querier;
3190 		own_timer = &brmctx->ip4_own_query.timer;
3191 		other_timer = &brmctx->ip4_other_query.timer;
3192 		if (!querier->addr.src.ip4 ||
3193 		    ntohl(saddr->src.ip4) <= ntohl(querier->addr.src.ip4))
3194 			goto update;
3195 		break;
3196 #if IS_ENABLED(CONFIG_IPV6)
3197 	case htons(ETH_P_IPV6):
3198 		querier = &brmctx->ip6_querier;
3199 		own_timer = &brmctx->ip6_own_query.timer;
3200 		other_timer = &brmctx->ip6_other_query.timer;
3201 		if (ipv6_addr_cmp(&saddr->src.ip6, &querier->addr.src.ip6) <= 0)
3202 			goto update;
3203 		break;
3204 #endif
3205 	default:
3206 		return false;
3207 	}
3208 
3209 	if (!timer_pending(own_timer) && !timer_pending(other_timer))
3210 		goto update;
3211 
3212 	return false;
3213 
3214 update:
3215 	br_multicast_update_querier(brmctx, querier, port_ifidx, saddr);
3216 
3217 	return true;
3218 }
3219 
3220 static struct net_bridge_port *
__br_multicast_get_querier_port(struct net_bridge * br,const struct bridge_mcast_querier * querier)3221 __br_multicast_get_querier_port(struct net_bridge *br,
3222 				const struct bridge_mcast_querier *querier)
3223 {
3224 	int port_ifidx = READ_ONCE(querier->port_ifidx);
3225 	struct net_bridge_port *p;
3226 	struct net_device *dev;
3227 
3228 	if (port_ifidx == 0)
3229 		return NULL;
3230 
3231 	dev = dev_get_by_index_rcu(dev_net(br->dev), port_ifidx);
3232 	if (!dev)
3233 		return NULL;
3234 	p = br_port_get_rtnl_rcu(dev);
3235 	if (!p || p->br != br)
3236 		return NULL;
3237 
3238 	return p;
3239 }
3240 
br_multicast_querier_state_size(void)3241 size_t br_multicast_querier_state_size(void)
3242 {
3243 	return nla_total_size(0) +		/* nest attribute */
3244 	       nla_total_size(sizeof(__be32)) + /* BRIDGE_QUERIER_IP_ADDRESS */
3245 	       nla_total_size(sizeof(int)) +    /* BRIDGE_QUERIER_IP_PORT */
3246 	       nla_total_size_64bit(sizeof(u64)) + /* BRIDGE_QUERIER_IP_OTHER_TIMER */
3247 #if IS_ENABLED(CONFIG_IPV6)
3248 	       nla_total_size(sizeof(struct in6_addr)) + /* BRIDGE_QUERIER_IPV6_ADDRESS */
3249 	       nla_total_size(sizeof(int)) +		 /* BRIDGE_QUERIER_IPV6_PORT */
3250 	       nla_total_size_64bit(sizeof(u64)) +	 /* BRIDGE_QUERIER_IPV6_OTHER_TIMER */
3251 #endif
3252 	       0;
3253 }
3254 
3255 /* protected by rtnl or rcu */
br_multicast_dump_querier_state(struct sk_buff * skb,const struct net_bridge_mcast * brmctx,int nest_attr)3256 int br_multicast_dump_querier_state(struct sk_buff *skb,
3257 				    const struct net_bridge_mcast *brmctx,
3258 				    int nest_attr)
3259 {
3260 	struct bridge_mcast_querier querier = {};
3261 	struct net_bridge_port *p;
3262 	struct nlattr *nest;
3263 
3264 	if (!br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED) ||
3265 	    br_multicast_ctx_vlan_global_disabled(brmctx))
3266 		return 0;
3267 
3268 	nest = nla_nest_start(skb, nest_attr);
3269 	if (!nest)
3270 		return -EMSGSIZE;
3271 
3272 	rcu_read_lock();
3273 	if (!brmctx->multicast_querier &&
3274 	    !timer_pending(&brmctx->ip4_other_query.timer))
3275 		goto out_v6;
3276 
3277 	br_multicast_read_querier(&brmctx->ip4_querier, &querier);
3278 	if (nla_put_in_addr(skb, BRIDGE_QUERIER_IP_ADDRESS,
3279 			    querier.addr.src.ip4)) {
3280 		rcu_read_unlock();
3281 		goto out_err;
3282 	}
3283 
3284 	p = __br_multicast_get_querier_port(brmctx->br, &querier);
3285 	if (timer_pending(&brmctx->ip4_other_query.timer) &&
3286 	    (nla_put_u64_64bit(skb, BRIDGE_QUERIER_IP_OTHER_TIMER,
3287 			       br_timer_value(&brmctx->ip4_other_query.timer),
3288 			       BRIDGE_QUERIER_PAD) ||
3289 	     (p && nla_put_u32(skb, BRIDGE_QUERIER_IP_PORT, p->dev->ifindex)))) {
3290 		rcu_read_unlock();
3291 		goto out_err;
3292 	}
3293 
3294 out_v6:
3295 #if IS_ENABLED(CONFIG_IPV6)
3296 	if (!brmctx->multicast_querier &&
3297 	    !timer_pending(&brmctx->ip6_other_query.timer))
3298 		goto out;
3299 
3300 	br_multicast_read_querier(&brmctx->ip6_querier, &querier);
3301 	if (nla_put_in6_addr(skb, BRIDGE_QUERIER_IPV6_ADDRESS,
3302 			     &querier.addr.src.ip6)) {
3303 		rcu_read_unlock();
3304 		goto out_err;
3305 	}
3306 
3307 	p = __br_multicast_get_querier_port(brmctx->br, &querier);
3308 	if (timer_pending(&brmctx->ip6_other_query.timer) &&
3309 	    (nla_put_u64_64bit(skb, BRIDGE_QUERIER_IPV6_OTHER_TIMER,
3310 			       br_timer_value(&brmctx->ip6_other_query.timer),
3311 			       BRIDGE_QUERIER_PAD) ||
3312 	     (p && nla_put_u32(skb, BRIDGE_QUERIER_IPV6_PORT,
3313 			       p->dev->ifindex)))) {
3314 		rcu_read_unlock();
3315 		goto out_err;
3316 	}
3317 out:
3318 #endif
3319 	rcu_read_unlock();
3320 	nla_nest_end(skb, nest);
3321 	if (!nla_len(nest))
3322 		nla_nest_cancel(skb, nest);
3323 
3324 	return 0;
3325 
3326 out_err:
3327 	nla_nest_cancel(skb, nest);
3328 	return -EMSGSIZE;
3329 }
3330 
3331 static void
br_multicast_update_query_timer(struct net_bridge_mcast * brmctx,struct bridge_mcast_other_query * query,unsigned long max_delay)3332 br_multicast_update_query_timer(struct net_bridge_mcast *brmctx,
3333 				struct bridge_mcast_other_query *query,
3334 				unsigned long max_delay)
3335 {
3336 	if (!timer_pending(&query->timer))
3337 		mod_timer(&query->delay_timer, jiffies + max_delay);
3338 
3339 	mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval);
3340 }
3341 
br_port_mc_router_state_change(struct net_bridge_port * p,bool is_mc_router)3342 static void br_port_mc_router_state_change(struct net_bridge_port *p,
3343 					   bool is_mc_router)
3344 {
3345 	struct switchdev_attr attr = {
3346 		.orig_dev = p->dev,
3347 		.id = SWITCHDEV_ATTR_ID_PORT_MROUTER,
3348 		.flags = SWITCHDEV_F_DEFER,
3349 		.u.mrouter = is_mc_router,
3350 	};
3351 
3352 	switchdev_port_attr_set(p->dev, &attr, NULL);
3353 }
3354 
3355 static struct net_bridge_port *
br_multicast_rport_from_node(struct net_bridge_mcast * brmctx,struct hlist_head * mc_router_list,struct hlist_node * rlist)3356 br_multicast_rport_from_node(struct net_bridge_mcast *brmctx,
3357 			     struct hlist_head *mc_router_list,
3358 			     struct hlist_node *rlist)
3359 {
3360 	struct net_bridge_mcast_port *pmctx;
3361 
3362 #if IS_ENABLED(CONFIG_IPV6)
3363 	if (mc_router_list == &brmctx->ip6_mc_router_list)
3364 		pmctx = hlist_entry(rlist, struct net_bridge_mcast_port,
3365 				    ip6_rlist);
3366 	else
3367 #endif
3368 		pmctx = hlist_entry(rlist, struct net_bridge_mcast_port,
3369 				    ip4_rlist);
3370 
3371 	return pmctx->port;
3372 }
3373 
3374 static struct hlist_node *
br_multicast_get_rport_slot(struct net_bridge_mcast * brmctx,struct net_bridge_port * port,struct hlist_head * mc_router_list)3375 br_multicast_get_rport_slot(struct net_bridge_mcast *brmctx,
3376 			    struct net_bridge_port *port,
3377 			    struct hlist_head *mc_router_list)
3378 
3379 {
3380 	struct hlist_node *slot = NULL;
3381 	struct net_bridge_port *p;
3382 	struct hlist_node *rlist;
3383 
3384 	hlist_for_each(rlist, mc_router_list) {
3385 		p = br_multicast_rport_from_node(brmctx, mc_router_list, rlist);
3386 
3387 		if ((unsigned long)port >= (unsigned long)p)
3388 			break;
3389 
3390 		slot = rlist;
3391 	}
3392 
3393 	return slot;
3394 }
3395 
br_multicast_no_router_otherpf(struct net_bridge_mcast_port * pmctx,struct hlist_node * rnode)3396 static bool br_multicast_no_router_otherpf(struct net_bridge_mcast_port *pmctx,
3397 					   struct hlist_node *rnode)
3398 {
3399 #if IS_ENABLED(CONFIG_IPV6)
3400 	if (rnode != &pmctx->ip6_rlist)
3401 		return hlist_unhashed(&pmctx->ip6_rlist);
3402 	else
3403 		return hlist_unhashed(&pmctx->ip4_rlist);
3404 #else
3405 	return true;
3406 #endif
3407 }
3408 
3409 /* Add port to router_list
3410  *  list is maintained ordered by pointer value
3411  *  and locked by br->multicast_lock and RCU
3412  */
br_multicast_add_router(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct hlist_node * rlist,struct hlist_head * mc_router_list)3413 static void br_multicast_add_router(struct net_bridge_mcast *brmctx,
3414 				    struct net_bridge_mcast_port *pmctx,
3415 				    struct hlist_node *rlist,
3416 				    struct hlist_head *mc_router_list)
3417 {
3418 	struct hlist_node *slot;
3419 
3420 	if (!hlist_unhashed(rlist))
3421 		return;
3422 
3423 	slot = br_multicast_get_rport_slot(brmctx, pmctx->port, mc_router_list);
3424 
3425 	if (slot)
3426 		hlist_add_behind_rcu(rlist, slot);
3427 	else
3428 		hlist_add_head_rcu(rlist, mc_router_list);
3429 
3430 	/* For backwards compatibility for now, only notify if we
3431 	 * switched from no IPv4/IPv6 multicast router to a new
3432 	 * IPv4 or IPv6 multicast router.
3433 	 */
3434 	if (br_multicast_no_router_otherpf(pmctx, rlist)) {
3435 		br_rtr_notify(pmctx->port->br->dev, pmctx, RTM_NEWMDB);
3436 		br_port_mc_router_state_change(pmctx->port, true);
3437 	}
3438 }
3439 
3440 /* Add port to router_list
3441  *  list is maintained ordered by pointer value
3442  *  and locked by br->multicast_lock and RCU
3443  */
br_ip4_multicast_add_router(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx)3444 static void br_ip4_multicast_add_router(struct net_bridge_mcast *brmctx,
3445 					struct net_bridge_mcast_port *pmctx)
3446 {
3447 	br_multicast_add_router(brmctx, pmctx, &pmctx->ip4_rlist,
3448 				&brmctx->ip4_mc_router_list);
3449 }
3450 
3451 /* Add port to router_list
3452  *  list is maintained ordered by pointer value
3453  *  and locked by br->multicast_lock and RCU
3454  */
br_ip6_multicast_add_router(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx)3455 static void br_ip6_multicast_add_router(struct net_bridge_mcast *brmctx,
3456 					struct net_bridge_mcast_port *pmctx)
3457 {
3458 #if IS_ENABLED(CONFIG_IPV6)
3459 	br_multicast_add_router(brmctx, pmctx, &pmctx->ip6_rlist,
3460 				&brmctx->ip6_mc_router_list);
3461 #endif
3462 }
3463 
br_multicast_mark_router(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct timer_list * timer,struct hlist_node * rlist,struct hlist_head * mc_router_list)3464 static void br_multicast_mark_router(struct net_bridge_mcast *brmctx,
3465 				     struct net_bridge_mcast_port *pmctx,
3466 				     struct timer_list *timer,
3467 				     struct hlist_node *rlist,
3468 				     struct hlist_head *mc_router_list)
3469 {
3470 	unsigned long now = jiffies;
3471 
3472 	if (!br_multicast_ctx_should_use(brmctx, pmctx))
3473 		return;
3474 
3475 	if (!pmctx) {
3476 		if (brmctx->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) {
3477 			if (!br_ip4_multicast_is_router(brmctx) &&
3478 			    !br_ip6_multicast_is_router(brmctx))
3479 				br_mc_router_state_change(brmctx->br, true);
3480 			mod_timer(timer, now + brmctx->multicast_querier_interval);
3481 		}
3482 		return;
3483 	}
3484 
3485 	if (pmctx->multicast_router == MDB_RTR_TYPE_DISABLED ||
3486 	    pmctx->multicast_router == MDB_RTR_TYPE_PERM)
3487 		return;
3488 
3489 	br_multicast_add_router(brmctx, pmctx, rlist, mc_router_list);
3490 	mod_timer(timer, now + brmctx->multicast_querier_interval);
3491 }
3492 
br_ip4_multicast_mark_router(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx)3493 static void br_ip4_multicast_mark_router(struct net_bridge_mcast *brmctx,
3494 					 struct net_bridge_mcast_port *pmctx)
3495 {
3496 	struct timer_list *timer = &brmctx->ip4_mc_router_timer;
3497 	struct hlist_node *rlist = NULL;
3498 
3499 	if (pmctx) {
3500 		timer = &pmctx->ip4_mc_router_timer;
3501 		rlist = &pmctx->ip4_rlist;
3502 	}
3503 
3504 	br_multicast_mark_router(brmctx, pmctx, timer, rlist,
3505 				 &brmctx->ip4_mc_router_list);
3506 }
3507 
br_ip6_multicast_mark_router(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx)3508 static void br_ip6_multicast_mark_router(struct net_bridge_mcast *brmctx,
3509 					 struct net_bridge_mcast_port *pmctx)
3510 {
3511 #if IS_ENABLED(CONFIG_IPV6)
3512 	struct timer_list *timer = &brmctx->ip6_mc_router_timer;
3513 	struct hlist_node *rlist = NULL;
3514 
3515 	if (pmctx) {
3516 		timer = &pmctx->ip6_mc_router_timer;
3517 		rlist = &pmctx->ip6_rlist;
3518 	}
3519 
3520 	br_multicast_mark_router(brmctx, pmctx, timer, rlist,
3521 				 &brmctx->ip6_mc_router_list);
3522 #endif
3523 }
3524 
3525 static void
br_ip4_multicast_query_received(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct bridge_mcast_other_query * query,struct br_ip * saddr,unsigned long max_delay)3526 br_ip4_multicast_query_received(struct net_bridge_mcast *brmctx,
3527 				struct net_bridge_mcast_port *pmctx,
3528 				struct bridge_mcast_other_query *query,
3529 				struct br_ip *saddr,
3530 				unsigned long max_delay)
3531 {
3532 	if (!br_multicast_select_querier(brmctx, pmctx, saddr))
3533 		return;
3534 
3535 	br_multicast_update_query_timer(brmctx, query, max_delay);
3536 	br_ip4_multicast_mark_router(brmctx, pmctx);
3537 }
3538 
3539 #if IS_ENABLED(CONFIG_IPV6)
3540 static void
br_ip6_multicast_query_received(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct bridge_mcast_other_query * query,struct br_ip * saddr,unsigned long max_delay)3541 br_ip6_multicast_query_received(struct net_bridge_mcast *brmctx,
3542 				struct net_bridge_mcast_port *pmctx,
3543 				struct bridge_mcast_other_query *query,
3544 				struct br_ip *saddr,
3545 				unsigned long max_delay)
3546 {
3547 	if (!br_multicast_select_querier(brmctx, pmctx, saddr))
3548 		return;
3549 
3550 	br_multicast_update_query_timer(brmctx, query, max_delay);
3551 	br_ip6_multicast_mark_router(brmctx, pmctx);
3552 }
3553 #endif
3554 
br_ip4_multicast_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb,u16 vid)3555 static void br_ip4_multicast_query(struct net_bridge_mcast *brmctx,
3556 				   struct net_bridge_mcast_port *pmctx,
3557 				   struct sk_buff *skb,
3558 				   u16 vid)
3559 {
3560 	unsigned int transport_len = ip_transport_len(skb);
3561 	const struct iphdr *iph = ip_hdr(skb);
3562 	struct igmphdr *ih = igmp_hdr(skb);
3563 	struct net_bridge_mdb_entry *mp;
3564 	struct igmpv3_query *ih3;
3565 	struct net_bridge_port_group *p;
3566 	struct net_bridge_port_group __rcu **pp;
3567 	struct br_ip saddr = {};
3568 	unsigned long max_delay;
3569 	unsigned long now = jiffies;
3570 	__be32 group;
3571 
3572 	spin_lock(&brmctx->br->multicast_lock);
3573 	if (!br_multicast_ctx_should_use(brmctx, pmctx))
3574 		goto out;
3575 
3576 	group = ih->group;
3577 
3578 	if (transport_len == sizeof(*ih)) {
3579 		max_delay = ih->code * (HZ / IGMP_TIMER_SCALE);
3580 
3581 		if (!max_delay) {
3582 			max_delay = 10 * HZ;
3583 			group = 0;
3584 		}
3585 	} else if (transport_len >= sizeof(*ih3)) {
3586 		ih3 = igmpv3_query_hdr(skb);
3587 		if (ih3->nsrcs ||
3588 		    (brmctx->multicast_igmp_version == 3 && group &&
3589 		     ih3->suppress))
3590 			goto out;
3591 
3592 		max_delay = ih3->code ?
3593 			    igmpv3_mrt(ih3) * (HZ / IGMP_TIMER_SCALE) : 1;
3594 	} else {
3595 		goto out;
3596 	}
3597 
3598 	if (!group) {
3599 		saddr.proto = htons(ETH_P_IP);
3600 		saddr.src.ip4 = iph->saddr;
3601 
3602 		br_ip4_multicast_query_received(brmctx, pmctx,
3603 						&brmctx->ip4_other_query,
3604 						&saddr, max_delay);
3605 		goto out;
3606 	}
3607 
3608 	mp = br_mdb_ip4_get(brmctx->br, group, vid);
3609 	if (!mp)
3610 		goto out;
3611 
3612 	max_delay *= brmctx->multicast_last_member_count;
3613 
3614 	if (mp->host_joined &&
3615 	    (timer_pending(&mp->timer) ?
3616 	     time_after(mp->timer.expires, now + max_delay) :
3617 	     timer_delete_sync_try(&mp->timer) >= 0))
3618 		mod_timer(&mp->timer, now + max_delay);
3619 
3620 	for (pp = &mp->ports;
3621 	     (p = mlock_dereference(*pp, brmctx->br)) != NULL;
3622 	     pp = &p->next) {
3623 		if (timer_pending(&p->timer) ?
3624 		    time_after(p->timer.expires, now + max_delay) :
3625 		    timer_delete_sync_try(&p->timer) >= 0 &&
3626 		    (brmctx->multicast_igmp_version == 2 ||
3627 		     p->filter_mode == MCAST_EXCLUDE))
3628 			mod_timer(&p->timer, now + max_delay);
3629 	}
3630 
3631 out:
3632 	spin_unlock(&brmctx->br->multicast_lock);
3633 }
3634 
3635 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_query(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb,u16 vid)3636 static int br_ip6_multicast_query(struct net_bridge_mcast *brmctx,
3637 				  struct net_bridge_mcast_port *pmctx,
3638 				  struct sk_buff *skb,
3639 				  u16 vid)
3640 {
3641 	unsigned int transport_len = ipv6_transport_len(skb);
3642 	struct mld_msg *mld;
3643 	struct net_bridge_mdb_entry *mp;
3644 	struct mld2_query *mld2q;
3645 	struct net_bridge_port_group *p;
3646 	struct net_bridge_port_group __rcu **pp;
3647 	struct br_ip saddr = {};
3648 	unsigned long max_delay;
3649 	unsigned long now = jiffies;
3650 	unsigned int offset = skb_transport_offset(skb);
3651 	const struct in6_addr *group = NULL;
3652 	bool is_general_query;
3653 	int err = 0;
3654 
3655 	spin_lock(&brmctx->br->multicast_lock);
3656 	if (!br_multicast_ctx_should_use(brmctx, pmctx))
3657 		goto out;
3658 
3659 	if (transport_len == sizeof(*mld)) {
3660 		if (!pskb_may_pull(skb, offset + sizeof(*mld))) {
3661 			err = -EINVAL;
3662 			goto out;
3663 		}
3664 		mld = (struct mld_msg *) icmp6_hdr(skb);
3665 		max_delay = msecs_to_jiffies(ntohs(mld->mld_maxdelay));
3666 		if (max_delay)
3667 			group = &mld->mld_mca;
3668 	} else {
3669 		if (!pskb_may_pull(skb, offset + sizeof(*mld2q))) {
3670 			err = -EINVAL;
3671 			goto out;
3672 		}
3673 		mld2q = (struct mld2_query *)icmp6_hdr(skb);
3674 		if (!mld2q->mld2q_nsrcs)
3675 			group = &mld2q->mld2q_mca;
3676 		if (brmctx->multicast_mld_version == 2 &&
3677 		    !ipv6_addr_any(&mld2q->mld2q_mca) &&
3678 		    mld2q->mld2q_suppress)
3679 			goto out;
3680 
3681 		max_delay = max(msecs_to_jiffies(mldv2_mrd(mld2q)), 1UL);
3682 	}
3683 
3684 	is_general_query = group && ipv6_addr_any(group);
3685 
3686 	if (is_general_query) {
3687 		saddr.proto = htons(ETH_P_IPV6);
3688 		saddr.src.ip6 = ipv6_hdr(skb)->saddr;
3689 
3690 		br_ip6_multicast_query_received(brmctx, pmctx,
3691 						&brmctx->ip6_other_query,
3692 						&saddr, max_delay);
3693 		goto out;
3694 	} else if (!group) {
3695 		goto out;
3696 	}
3697 
3698 	mp = br_mdb_ip6_get(brmctx->br, group, vid);
3699 	if (!mp)
3700 		goto out;
3701 
3702 	max_delay *= brmctx->multicast_last_member_count;
3703 	if (mp->host_joined &&
3704 	    (timer_pending(&mp->timer) ?
3705 	     time_after(mp->timer.expires, now + max_delay) :
3706 	     timer_delete_sync_try(&mp->timer) >= 0))
3707 		mod_timer(&mp->timer, now + max_delay);
3708 
3709 	for (pp = &mp->ports;
3710 	     (p = mlock_dereference(*pp, brmctx->br)) != NULL;
3711 	     pp = &p->next) {
3712 		if (timer_pending(&p->timer) ?
3713 		    time_after(p->timer.expires, now + max_delay) :
3714 		    timer_delete_sync_try(&p->timer) >= 0 &&
3715 		    (brmctx->multicast_mld_version == 1 ||
3716 		     p->filter_mode == MCAST_EXCLUDE))
3717 			mod_timer(&p->timer, now + max_delay);
3718 	}
3719 
3720 out:
3721 	spin_unlock(&brmctx->br->multicast_lock);
3722 	return err;
3723 }
3724 #endif
3725 
3726 static void
br_multicast_leave_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct br_ip * group,struct bridge_mcast_other_query * other_query,struct bridge_mcast_own_query * own_query,const unsigned char * src)3727 br_multicast_leave_group(struct net_bridge_mcast *brmctx,
3728 			 struct net_bridge_mcast_port *pmctx,
3729 			 struct br_ip *group,
3730 			 struct bridge_mcast_other_query *other_query,
3731 			 struct bridge_mcast_own_query *own_query,
3732 			 const unsigned char *src)
3733 {
3734 	struct net_bridge_mdb_entry *mp;
3735 	struct net_bridge_port_group *p;
3736 	unsigned long now;
3737 	unsigned long time;
3738 
3739 	spin_lock(&brmctx->br->multicast_lock);
3740 	if (!br_multicast_ctx_should_use(brmctx, pmctx))
3741 		goto out;
3742 
3743 	mp = br_mdb_ip_get(brmctx->br, group);
3744 	if (!mp)
3745 		goto out;
3746 
3747 	if (pmctx &&
3748 	    test_bit(BR_MULTICAST_FAST_LEAVE_BIT, &pmctx->port->flags)) {
3749 		struct net_bridge_port_group __rcu **pp;
3750 
3751 		for (pp = &mp->ports;
3752 		     (p = mlock_dereference(*pp, brmctx->br)) != NULL;
3753 		     pp = &p->next) {
3754 			if (!br_port_group_equal(p, pmctx->port, src))
3755 				continue;
3756 
3757 			if (p->flags & MDB_PG_FLAGS_PERMANENT)
3758 				break;
3759 
3760 			p->flags |= MDB_PG_FLAGS_FAST_LEAVE;
3761 			br_multicast_del_pg(mp, p, pp);
3762 			break;
3763 		}
3764 		goto out;
3765 	}
3766 
3767 	if (timer_pending(&other_query->timer))
3768 		goto out;
3769 
3770 	if (brmctx->multicast_querier) {
3771 		__br_multicast_send_query(brmctx, pmctx, NULL, NULL, &mp->addr,
3772 					  false, 0, NULL);
3773 
3774 		time = jiffies + brmctx->multicast_last_member_count *
3775 				 brmctx->multicast_last_member_interval;
3776 
3777 		mod_timer(&own_query->timer, time);
3778 
3779 		for (p = mlock_dereference(mp->ports, brmctx->br);
3780 		     p != NULL && pmctx != NULL;
3781 		     p = mlock_dereference(p->next, brmctx->br)) {
3782 			if (!br_port_group_equal(p, pmctx->port, src))
3783 				continue;
3784 
3785 			if (!hlist_unhashed(&p->mglist) &&
3786 			    (timer_pending(&p->timer) ?
3787 			     time_after(p->timer.expires, time) :
3788 			     timer_delete_sync_try(&p->timer) >= 0)) {
3789 				mod_timer(&p->timer, time);
3790 			}
3791 
3792 			break;
3793 		}
3794 	}
3795 
3796 	now = jiffies;
3797 	time = now + brmctx->multicast_last_member_count *
3798 		     brmctx->multicast_last_member_interval;
3799 
3800 	if (!pmctx) {
3801 		if (mp->host_joined &&
3802 		    (timer_pending(&mp->timer) ?
3803 		     time_after(mp->timer.expires, time) :
3804 		     timer_delete_sync_try(&mp->timer) >= 0)) {
3805 			mod_timer(&mp->timer, time);
3806 		}
3807 
3808 		goto out;
3809 	}
3810 
3811 	for (p = mlock_dereference(mp->ports, brmctx->br);
3812 	     p != NULL;
3813 	     p = mlock_dereference(p->next, brmctx->br)) {
3814 		if (p->key.port != pmctx->port)
3815 			continue;
3816 
3817 		if (!hlist_unhashed(&p->mglist) &&
3818 		    (timer_pending(&p->timer) ?
3819 		     time_after(p->timer.expires, time) :
3820 		     timer_delete_sync_try(&p->timer) >= 0)) {
3821 			mod_timer(&p->timer, time);
3822 		}
3823 
3824 		break;
3825 	}
3826 out:
3827 	spin_unlock(&brmctx->br->multicast_lock);
3828 }
3829 
br_ip4_multicast_leave_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,__be32 group,__u16 vid,const unsigned char * src)3830 static void br_ip4_multicast_leave_group(struct net_bridge_mcast *brmctx,
3831 					 struct net_bridge_mcast_port *pmctx,
3832 					 __be32 group,
3833 					 __u16 vid,
3834 					 const unsigned char *src)
3835 {
3836 	struct br_ip br_group;
3837 	struct bridge_mcast_own_query *own_query;
3838 
3839 	if (ipv4_is_local_multicast(group))
3840 		return;
3841 
3842 	own_query = pmctx ? &pmctx->ip4_own_query : &brmctx->ip4_own_query;
3843 
3844 	memset(&br_group, 0, sizeof(br_group));
3845 	br_group.dst.ip4 = group;
3846 	br_group.proto = htons(ETH_P_IP);
3847 	br_group.vid = vid;
3848 
3849 	br_multicast_leave_group(brmctx, pmctx, &br_group,
3850 				 &brmctx->ip4_other_query,
3851 				 own_query, src);
3852 }
3853 
3854 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_leave_group(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,const struct in6_addr * group,__u16 vid,const unsigned char * src)3855 static void br_ip6_multicast_leave_group(struct net_bridge_mcast *brmctx,
3856 					 struct net_bridge_mcast_port *pmctx,
3857 					 const struct in6_addr *group,
3858 					 __u16 vid,
3859 					 const unsigned char *src)
3860 {
3861 	struct br_ip br_group;
3862 	struct bridge_mcast_own_query *own_query;
3863 
3864 	if (ipv6_addr_is_ll_all_nodes(group))
3865 		return;
3866 
3867 	own_query = pmctx ? &pmctx->ip6_own_query : &brmctx->ip6_own_query;
3868 
3869 	memset(&br_group, 0, sizeof(br_group));
3870 	br_group.dst.ip6 = *group;
3871 	br_group.proto = htons(ETH_P_IPV6);
3872 	br_group.vid = vid;
3873 
3874 	br_multicast_leave_group(brmctx, pmctx, &br_group,
3875 				 &brmctx->ip6_other_query,
3876 				 own_query, src);
3877 }
3878 #endif
3879 
br_multicast_err_count(const struct net_bridge * br,const struct net_bridge_port * p,__be16 proto)3880 static void br_multicast_err_count(const struct net_bridge *br,
3881 				   const struct net_bridge_port *p,
3882 				   __be16 proto)
3883 {
3884 	struct bridge_mcast_stats __percpu *stats;
3885 	struct bridge_mcast_stats *pstats;
3886 
3887 	if (!br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED))
3888 		return;
3889 
3890 	if (p)
3891 		stats = p->mcast_stats;
3892 	else
3893 		stats = br->mcast_stats;
3894 	if (WARN_ON(!stats))
3895 		return;
3896 
3897 	pstats = this_cpu_ptr(stats);
3898 
3899 	u64_stats_update_begin(&pstats->syncp);
3900 	switch (proto) {
3901 	case htons(ETH_P_IP):
3902 		pstats->mstats.igmp_parse_errors++;
3903 		break;
3904 #if IS_ENABLED(CONFIG_IPV6)
3905 	case htons(ETH_P_IPV6):
3906 		pstats->mstats.mld_parse_errors++;
3907 		break;
3908 #endif
3909 	}
3910 	u64_stats_update_end(&pstats->syncp);
3911 }
3912 
br_multicast_pim(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,const struct sk_buff * skb)3913 static void br_multicast_pim(struct net_bridge_mcast *brmctx,
3914 			     struct net_bridge_mcast_port *pmctx,
3915 			     const struct sk_buff *skb)
3916 {
3917 	unsigned int offset = skb_transport_offset(skb);
3918 	struct pimhdr *pimhdr, _pimhdr;
3919 
3920 	pimhdr = skb_header_pointer(skb, offset, sizeof(_pimhdr), &_pimhdr);
3921 	if (!pimhdr || pim_hdr_version(pimhdr) != PIM_VERSION ||
3922 	    pim_hdr_type(pimhdr) != PIM_TYPE_HELLO)
3923 		return;
3924 
3925 	spin_lock(&brmctx->br->multicast_lock);
3926 	br_ip4_multicast_mark_router(brmctx, pmctx);
3927 	spin_unlock(&brmctx->br->multicast_lock);
3928 }
3929 
br_ip4_multicast_mrd_rcv(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb)3930 static int br_ip4_multicast_mrd_rcv(struct net_bridge_mcast *brmctx,
3931 				    struct net_bridge_mcast_port *pmctx,
3932 				    struct sk_buff *skb)
3933 {
3934 	if (ip_hdr(skb)->protocol != IPPROTO_IGMP ||
3935 	    igmp_hdr(skb)->type != IGMP_MRDISC_ADV)
3936 		return -ENOMSG;
3937 
3938 	spin_lock(&brmctx->br->multicast_lock);
3939 	br_ip4_multicast_mark_router(brmctx, pmctx);
3940 	spin_unlock(&brmctx->br->multicast_lock);
3941 
3942 	return 0;
3943 }
3944 
br_multicast_ipv4_rcv(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb,u16 vid)3945 static int br_multicast_ipv4_rcv(struct net_bridge_mcast *brmctx,
3946 				 struct net_bridge_mcast_port *pmctx,
3947 				 struct sk_buff *skb,
3948 				 u16 vid)
3949 {
3950 	struct net_bridge_port *p = pmctx ? pmctx->port : NULL;
3951 	const unsigned char *src;
3952 	struct igmphdr *ih;
3953 	int err;
3954 
3955 	err = ip_mc_check_igmp(skb);
3956 
3957 	if (err == -ENOMSG) {
3958 		if (!ipv4_is_local_multicast(ip_hdr(skb)->daddr)) {
3959 			BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
3960 		} else if (pim_ipv4_all_pim_routers(ip_hdr(skb)->daddr)) {
3961 			if (ip_hdr(skb)->protocol == IPPROTO_PIM)
3962 				br_multicast_pim(brmctx, pmctx, skb);
3963 		} else if (ipv4_is_all_snoopers(ip_hdr(skb)->daddr)) {
3964 			br_ip4_multicast_mrd_rcv(brmctx, pmctx, skb);
3965 		}
3966 
3967 		return 0;
3968 	} else if (err < 0) {
3969 		br_multicast_err_count(brmctx->br, p, skb->protocol);
3970 		return err;
3971 	}
3972 
3973 	ih = igmp_hdr(skb);
3974 	src = eth_hdr(skb)->h_source;
3975 	BR_INPUT_SKB_CB(skb)->igmp = ih->type;
3976 
3977 	switch (ih->type) {
3978 	case IGMP_HOST_MEMBERSHIP_REPORT:
3979 	case IGMPV2_HOST_MEMBERSHIP_REPORT:
3980 		BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
3981 		err = br_ip4_multicast_add_group(brmctx, pmctx, ih->group, vid,
3982 						 src, true);
3983 		break;
3984 	case IGMPV3_HOST_MEMBERSHIP_REPORT:
3985 		err = br_ip4_multicast_igmp3_report(brmctx, pmctx, skb, vid);
3986 		break;
3987 	case IGMP_HOST_MEMBERSHIP_QUERY:
3988 		br_ip4_multicast_query(brmctx, pmctx, skb, vid);
3989 		break;
3990 	case IGMP_HOST_LEAVE_MESSAGE:
3991 		br_ip4_multicast_leave_group(brmctx, pmctx, ih->group, vid, src);
3992 		break;
3993 	}
3994 
3995 	br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp,
3996 			   BR_MCAST_DIR_RX);
3997 
3998 	return err;
3999 }
4000 
4001 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_mrd_rcv(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb)4002 static void br_ip6_multicast_mrd_rcv(struct net_bridge_mcast *brmctx,
4003 				     struct net_bridge_mcast_port *pmctx,
4004 				     struct sk_buff *skb)
4005 {
4006 	if (icmp6_hdr(skb)->icmp6_type != ICMPV6_MRDISC_ADV)
4007 		return;
4008 
4009 	spin_lock(&brmctx->br->multicast_lock);
4010 	br_ip6_multicast_mark_router(brmctx, pmctx);
4011 	spin_unlock(&brmctx->br->multicast_lock);
4012 }
4013 
br_multicast_ipv6_rcv(struct net_bridge_mcast * brmctx,struct net_bridge_mcast_port * pmctx,struct sk_buff * skb,u16 vid)4014 static int br_multicast_ipv6_rcv(struct net_bridge_mcast *brmctx,
4015 				 struct net_bridge_mcast_port *pmctx,
4016 				 struct sk_buff *skb,
4017 				 u16 vid)
4018 {
4019 	struct net_bridge_port *p = pmctx ? pmctx->port : NULL;
4020 	const unsigned char *src;
4021 	struct mld_msg *mld;
4022 	int err;
4023 
4024 	err = ipv6_mc_check_mld(skb);
4025 
4026 	if (err == -ENOMSG || err == -ENODATA) {
4027 		if (!ipv6_addr_is_ll_all_nodes(&ipv6_hdr(skb)->daddr))
4028 			BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
4029 		if (err == -ENODATA &&
4030 		    ipv6_addr_is_all_snoopers(&ipv6_hdr(skb)->daddr))
4031 			br_ip6_multicast_mrd_rcv(brmctx, pmctx, skb);
4032 
4033 		return 0;
4034 	} else if (err < 0) {
4035 		br_multicast_err_count(brmctx->br, p, skb->protocol);
4036 		return err;
4037 	}
4038 
4039 	mld = (struct mld_msg *)skb_transport_header(skb);
4040 	BR_INPUT_SKB_CB(skb)->igmp = mld->mld_type;
4041 
4042 	switch (mld->mld_type) {
4043 	case ICMPV6_MGM_REPORT:
4044 		src = eth_hdr(skb)->h_source;
4045 		BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
4046 		err = br_ip6_multicast_add_group(brmctx, pmctx, &mld->mld_mca,
4047 						 vid, src, true);
4048 		break;
4049 	case ICMPV6_MLD2_REPORT:
4050 		err = br_ip6_multicast_mld2_report(brmctx, pmctx, skb, vid);
4051 		break;
4052 	case ICMPV6_MGM_QUERY:
4053 		err = br_ip6_multicast_query(brmctx, pmctx, skb, vid);
4054 		break;
4055 	case ICMPV6_MGM_REDUCTION:
4056 		src = eth_hdr(skb)->h_source;
4057 		br_ip6_multicast_leave_group(brmctx, pmctx, &mld->mld_mca, vid,
4058 					     src);
4059 		break;
4060 	}
4061 
4062 	br_multicast_count(brmctx->br, p, skb, BR_INPUT_SKB_CB(skb)->igmp,
4063 			   BR_MCAST_DIR_RX);
4064 
4065 	return err;
4066 }
4067 #endif
4068 
br_multicast_rcv(struct net_bridge_mcast ** brmctx,struct net_bridge_mcast_port ** pmctx,struct net_bridge_vlan * vlan,struct sk_buff * skb,u16 vid)4069 int br_multicast_rcv(struct net_bridge_mcast **brmctx,
4070 		     struct net_bridge_mcast_port **pmctx,
4071 		     struct net_bridge_vlan *vlan,
4072 		     struct sk_buff *skb, u16 vid)
4073 {
4074 	int ret = 0;
4075 
4076 	BR_INPUT_SKB_CB(skb)->igmp = 0;
4077 	BR_INPUT_SKB_CB(skb)->mrouters_only = 0;
4078 
4079 	if (!br_opt_get((*brmctx)->br, BROPT_MULTICAST_ENABLED))
4080 		return 0;
4081 
4082 	if (br_opt_get((*brmctx)->br, BROPT_MCAST_VLAN_SNOOPING_ENABLED) && vlan) {
4083 		const struct net_bridge_vlan *masterv;
4084 
4085 		/* the vlan has the master flag set only when transmitting
4086 		 * through the bridge device
4087 		 */
4088 		if (br_vlan_is_master(vlan)) {
4089 			masterv = vlan;
4090 			*brmctx = &vlan->br_mcast_ctx;
4091 			*pmctx = NULL;
4092 		} else {
4093 			masterv = vlan->brvlan;
4094 			*brmctx = &vlan->brvlan->br_mcast_ctx;
4095 			*pmctx = &vlan->port_mcast_ctx;
4096 		}
4097 
4098 		if (!(masterv->priv_flags & BR_VLFLAG_GLOBAL_MCAST_ENABLED))
4099 			return 0;
4100 	}
4101 
4102 	switch (skb->protocol) {
4103 	case htons(ETH_P_IP):
4104 		ret = br_multicast_ipv4_rcv(*brmctx, *pmctx, skb, vid);
4105 		break;
4106 #if IS_ENABLED(CONFIG_IPV6)
4107 	case htons(ETH_P_IPV6):
4108 		ret = br_multicast_ipv6_rcv(*brmctx, *pmctx, skb, vid);
4109 		break;
4110 #endif
4111 	}
4112 
4113 	return ret;
4114 }
4115 
br_multicast_query_expired(struct net_bridge_mcast * brmctx,struct bridge_mcast_own_query * query)4116 static void br_multicast_query_expired(struct net_bridge_mcast *brmctx,
4117 				       struct bridge_mcast_own_query *query)
4118 {
4119 	spin_lock(&brmctx->br->multicast_lock);
4120 	if (br_multicast_ctx_vlan_disabled(brmctx))
4121 		goto out;
4122 
4123 	if (query->startup_sent < brmctx->multicast_startup_query_count)
4124 		query->startup_sent++;
4125 
4126 	br_multicast_send_query(brmctx, NULL, query);
4127 out:
4128 	spin_unlock(&brmctx->br->multicast_lock);
4129 }
4130 
br_ip4_multicast_query_expired(struct timer_list * t)4131 static void br_ip4_multicast_query_expired(struct timer_list *t)
4132 {
4133 	struct net_bridge_mcast *brmctx = timer_container_of(brmctx, t,
4134 							     ip4_own_query.timer);
4135 
4136 	br_multicast_query_expired(brmctx, &brmctx->ip4_own_query);
4137 }
4138 
4139 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_query_expired(struct timer_list * t)4140 static void br_ip6_multicast_query_expired(struct timer_list *t)
4141 {
4142 	struct net_bridge_mcast *brmctx = timer_container_of(brmctx, t,
4143 							     ip6_own_query.timer);
4144 
4145 	br_multicast_query_expired(brmctx, &brmctx->ip6_own_query);
4146 }
4147 #endif
4148 
br_multicast_gc_work(struct work_struct * work)4149 static void br_multicast_gc_work(struct work_struct *work)
4150 {
4151 	struct net_bridge *br = container_of(work, struct net_bridge,
4152 					     mcast_gc_work);
4153 	HLIST_HEAD(deleted_head);
4154 
4155 	spin_lock_bh(&br->multicast_lock);
4156 	hlist_move_list(&br->mcast_gc_list, &deleted_head);
4157 	spin_unlock_bh(&br->multicast_lock);
4158 
4159 	br_multicast_gc(&deleted_head);
4160 }
4161 
br_multicast_ctx_init(struct net_bridge * br,struct net_bridge_vlan * vlan,struct net_bridge_mcast * brmctx)4162 void br_multicast_ctx_init(struct net_bridge *br,
4163 			   struct net_bridge_vlan *vlan,
4164 			   struct net_bridge_mcast *brmctx)
4165 {
4166 	brmctx->br = br;
4167 	brmctx->vlan = vlan;
4168 	brmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
4169 	brmctx->multicast_last_member_count = 2;
4170 	brmctx->multicast_startup_query_count = 2;
4171 
4172 	brmctx->multicast_last_member_interval = HZ;
4173 	brmctx->multicast_query_response_interval = 10 * HZ;
4174 	brmctx->multicast_startup_query_interval = 125 * HZ / 4;
4175 	brmctx->multicast_query_interval = 125 * HZ;
4176 	brmctx->multicast_querier_interval = 255 * HZ;
4177 	brmctx->multicast_membership_interval = 260 * HZ;
4178 
4179 	brmctx->ip4_querier.port_ifidx = 0;
4180 	seqcount_spinlock_init(&brmctx->ip4_querier.seq, &br->multicast_lock);
4181 	brmctx->multicast_igmp_version = 2;
4182 #if IS_ENABLED(CONFIG_IPV6)
4183 	brmctx->multicast_mld_version = 1;
4184 	brmctx->ip6_querier.port_ifidx = 0;
4185 	seqcount_spinlock_init(&brmctx->ip6_querier.seq, &br->multicast_lock);
4186 #endif
4187 
4188 	skb_queue_head_init(&brmctx->query_queue);
4189 	INIT_WORK(&brmctx->query_queue_work, br_multicast_query_queue_work);
4190 
4191 	timer_setup(&brmctx->ip4_mc_router_timer,
4192 		    br_ip4_multicast_local_router_expired, 0);
4193 	timer_setup(&brmctx->ip4_other_query.timer,
4194 		    br_ip4_multicast_querier_expired, 0);
4195 	timer_setup(&brmctx->ip4_other_query.delay_timer,
4196 		    br_multicast_query_delay_expired, 0);
4197 	timer_setup(&brmctx->ip4_own_query.timer,
4198 		    br_ip4_multicast_query_expired, 0);
4199 #if IS_ENABLED(CONFIG_IPV6)
4200 	timer_setup(&brmctx->ip6_mc_router_timer,
4201 		    br_ip6_multicast_local_router_expired, 0);
4202 	timer_setup(&brmctx->ip6_other_query.timer,
4203 		    br_ip6_multicast_querier_expired, 0);
4204 	timer_setup(&brmctx->ip6_other_query.delay_timer,
4205 		    br_multicast_query_delay_expired, 0);
4206 	timer_setup(&brmctx->ip6_own_query.timer,
4207 		    br_ip6_multicast_query_expired, 0);
4208 #endif
4209 }
4210 
br_multicast_ctx_deinit(struct net_bridge_mcast * brmctx)4211 void br_multicast_ctx_deinit(struct net_bridge_mcast *brmctx)
4212 {
4213 	__br_multicast_stop(brmctx);
4214 	cancel_work_sync(&brmctx->query_queue_work);
4215 	__skb_queue_purge(&brmctx->query_queue);
4216 }
4217 
br_multicast_init(struct net_bridge * br)4218 void br_multicast_init(struct net_bridge *br)
4219 {
4220 	br->hash_max = BR_MULTICAST_DEFAULT_HASH_MAX;
4221 
4222 	br_multicast_ctx_init(br, NULL, &br->multicast_ctx);
4223 
4224 	br_opt_toggle(br, BROPT_MULTICAST_ENABLED, true);
4225 	br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true);
4226 
4227 	spin_lock_init(&br->multicast_lock);
4228 	INIT_HLIST_HEAD(&br->mdb_list);
4229 	INIT_HLIST_HEAD(&br->mcast_gc_list);
4230 	INIT_WORK(&br->mcast_gc_work, br_multicast_gc_work);
4231 }
4232 
br_ip4_multicast_join_snoopers(struct net_bridge * br)4233 static void br_ip4_multicast_join_snoopers(struct net_bridge *br)
4234 {
4235 	struct in_device *in_dev = in_dev_get(br->dev);
4236 
4237 	if (!in_dev)
4238 		return;
4239 
4240 	__ip_mc_inc_group(in_dev, htonl(INADDR_ALLSNOOPERS_GROUP), GFP_ATOMIC);
4241 	in_dev_put(in_dev);
4242 }
4243 
4244 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_join_snoopers(struct net_bridge * br)4245 static void br_ip6_multicast_join_snoopers(struct net_bridge *br)
4246 {
4247 	struct in6_addr addr;
4248 
4249 	ipv6_addr_set(&addr, htonl(0xff020000), 0, 0, htonl(0x6a));
4250 	ipv6_dev_mc_inc(br->dev, &addr);
4251 }
4252 #else
br_ip6_multicast_join_snoopers(struct net_bridge * br)4253 static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br)
4254 {
4255 }
4256 #endif
4257 
br_multicast_join_snoopers(struct net_bridge * br)4258 void br_multicast_join_snoopers(struct net_bridge *br)
4259 {
4260 	br_ip4_multicast_join_snoopers(br);
4261 	br_ip6_multicast_join_snoopers(br);
4262 }
4263 
br_ip4_multicast_leave_snoopers(struct net_bridge * br)4264 static void br_ip4_multicast_leave_snoopers(struct net_bridge *br)
4265 {
4266 	struct in_device *in_dev = in_dev_get(br->dev);
4267 
4268 	if (WARN_ON(!in_dev))
4269 		return;
4270 
4271 	__ip_mc_dec_group(in_dev, htonl(INADDR_ALLSNOOPERS_GROUP), GFP_ATOMIC);
4272 	in_dev_put(in_dev);
4273 }
4274 
4275 #if IS_ENABLED(CONFIG_IPV6)
br_ip6_multicast_leave_snoopers(struct net_bridge * br)4276 static void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
4277 {
4278 	struct in6_addr addr;
4279 
4280 	ipv6_addr_set(&addr, htonl(0xff020000), 0, 0, htonl(0x6a));
4281 	ipv6_dev_mc_dec(br->dev, &addr);
4282 }
4283 #else
br_ip6_multicast_leave_snoopers(struct net_bridge * br)4284 static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
4285 {
4286 }
4287 #endif
4288 
br_multicast_leave_snoopers(struct net_bridge * br)4289 void br_multicast_leave_snoopers(struct net_bridge *br)
4290 {
4291 	br_ip4_multicast_leave_snoopers(br);
4292 	br_ip6_multicast_leave_snoopers(br);
4293 }
4294 
__br_multicast_open_query(struct net_bridge * br,struct bridge_mcast_own_query * query)4295 static void __br_multicast_open_query(struct net_bridge *br,
4296 				      struct bridge_mcast_own_query *query)
4297 {
4298 	query->startup_sent = 0;
4299 
4300 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
4301 		return;
4302 
4303 	mod_timer(&query->timer, jiffies);
4304 }
4305 
__br_multicast_open(struct net_bridge_mcast * brmctx)4306 static void __br_multicast_open(struct net_bridge_mcast *brmctx)
4307 {
4308 	__br_multicast_open_query(brmctx->br, &brmctx->ip4_own_query);
4309 #if IS_ENABLED(CONFIG_IPV6)
4310 	__br_multicast_open_query(brmctx->br, &brmctx->ip6_own_query);
4311 #endif
4312 }
4313 
br_multicast_open(struct net_bridge * br)4314 void br_multicast_open(struct net_bridge *br)
4315 {
4316 	ASSERT_RTNL();
4317 
4318 	if (br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) {
4319 		struct net_bridge_vlan_group *vg;
4320 		struct net_bridge_vlan *vlan;
4321 
4322 		vg = br_vlan_group(br);
4323 		if (vg) {
4324 			list_for_each_entry(vlan, &vg->vlan_list, vlist) {
4325 				struct net_bridge_mcast *brmctx;
4326 
4327 				brmctx = &vlan->br_mcast_ctx;
4328 				if (br_vlan_is_brentry(vlan) &&
4329 				    !br_multicast_ctx_vlan_disabled(brmctx))
4330 					__br_multicast_open(&vlan->br_mcast_ctx);
4331 			}
4332 		}
4333 	} else {
4334 		__br_multicast_open(&br->multicast_ctx);
4335 	}
4336 }
4337 
__br_multicast_stop(struct net_bridge_mcast * brmctx)4338 static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
4339 {
4340 	timer_delete_sync(&brmctx->ip4_mc_router_timer);
4341 	timer_delete_sync(&brmctx->ip4_other_query.timer);
4342 	timer_delete_sync(&brmctx->ip4_other_query.delay_timer);
4343 	timer_delete_sync(&brmctx->ip4_own_query.timer);
4344 #if IS_ENABLED(CONFIG_IPV6)
4345 	timer_delete_sync(&brmctx->ip6_mc_router_timer);
4346 	timer_delete_sync(&brmctx->ip6_other_query.timer);
4347 	timer_delete_sync(&brmctx->ip6_other_query.delay_timer);
4348 	timer_delete_sync(&brmctx->ip6_own_query.timer);
4349 #endif
4350 }
4351 
br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan * v,u8 state)4352 void br_multicast_update_vlan_mcast_ctx(struct net_bridge_vlan *v, u8 state)
4353 {
4354 #if IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING)
4355 	struct net_bridge *br;
4356 
4357 	if (!br_vlan_should_use(v))
4358 		return;
4359 
4360 	if (br_vlan_is_master(v))
4361 		return;
4362 
4363 	br = v->port->br;
4364 
4365 	if (!br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED))
4366 		return;
4367 
4368 	if (br_vlan_state_allowed(state, true))
4369 		br_multicast_enable_port_ctx(&v->port_mcast_ctx);
4370 
4371 	/* Multicast is not disabled for the vlan when it goes in
4372 	 * blocking state because the timers will expire and stop by
4373 	 * themselves without sending more queries.
4374 	 */
4375 #endif
4376 }
4377 
br_multicast_toggle_one_vlan(struct net_bridge_vlan * vlan,bool on)4378 void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on)
4379 {
4380 	struct net_bridge *br;
4381 
4382 	/* it's okay to check for the flag without the multicast lock because it
4383 	 * can only change under RTNL -> multicast_lock, we need the latter to
4384 	 * sync with timers and packets
4385 	 */
4386 	if (on == !!(vlan->priv_flags & BR_VLFLAG_MCAST_ENABLED))
4387 		return;
4388 
4389 	if (br_vlan_is_master(vlan)) {
4390 		br = vlan->br;
4391 
4392 		if (on &&
4393 		    (!br_vlan_is_brentry(vlan) ||
4394 		     br_multicast_ctx_vlan_global_disabled(&vlan->br_mcast_ctx)))
4395 			return;
4396 
4397 		spin_lock_bh(&br->multicast_lock);
4398 		vlan->priv_flags ^= BR_VLFLAG_MCAST_ENABLED;
4399 		spin_unlock_bh(&br->multicast_lock);
4400 
4401 		if (on)
4402 			__br_multicast_open(&vlan->br_mcast_ctx);
4403 		else
4404 			__br_multicast_stop(&vlan->br_mcast_ctx);
4405 	} else {
4406 		struct net_bridge_mcast *brmctx;
4407 
4408 		brmctx = br_multicast_port_ctx_get_global(&vlan->port_mcast_ctx);
4409 		if (on && br_multicast_ctx_vlan_global_disabled(brmctx))
4410 			return;
4411 
4412 		br = vlan->port->br;
4413 		spin_lock_bh(&br->multicast_lock);
4414 		vlan->priv_flags ^= BR_VLFLAG_MCAST_ENABLED;
4415 		if (on)
4416 			__br_multicast_enable_port_ctx(&vlan->port_mcast_ctx);
4417 		else
4418 			__br_multicast_disable_port_ctx(&vlan->port_mcast_ctx);
4419 		spin_unlock_bh(&br->multicast_lock);
4420 	}
4421 }
4422 
br_multicast_toggle_vlan(struct net_bridge_vlan * vlan,bool on)4423 static void br_multicast_toggle_vlan(struct net_bridge_vlan *vlan, bool on)
4424 {
4425 	struct net_bridge_port *p;
4426 
4427 	if (WARN_ON_ONCE(!br_vlan_is_master(vlan)))
4428 		return;
4429 
4430 	list_for_each_entry(p, &vlan->br->port_list, list) {
4431 		struct net_bridge_vlan *vport;
4432 
4433 		vport = br_vlan_find(nbp_vlan_group(p), vlan->vid);
4434 		if (!vport)
4435 			continue;
4436 		br_multicast_toggle_one_vlan(vport, on);
4437 	}
4438 
4439 	if (br_vlan_is_brentry(vlan))
4440 		br_multicast_toggle_one_vlan(vlan, on);
4441 }
4442 
br_multicast_toggle_vlan_snooping(struct net_bridge * br,bool on,struct netlink_ext_ack * extack)4443 int br_multicast_toggle_vlan_snooping(struct net_bridge *br, bool on,
4444 				      struct netlink_ext_ack *extack)
4445 {
4446 	struct net_bridge_vlan_group *vg;
4447 	struct net_bridge_vlan *vlan;
4448 	struct net_bridge_port *p;
4449 
4450 	if (br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED) == on)
4451 		return 0;
4452 
4453 	if (on && !br_opt_get(br, BROPT_VLAN_ENABLED)) {
4454 		NL_SET_ERR_MSG_MOD(extack, "Cannot enable multicast vlan snooping with vlan filtering disabled");
4455 		return -EINVAL;
4456 	}
4457 
4458 	vg = br_vlan_group(br);
4459 	if (!vg)
4460 		return 0;
4461 
4462 	br_opt_toggle(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED, on);
4463 
4464 	/* disable/enable non-vlan mcast contexts based on vlan snooping */
4465 	if (on)
4466 		__br_multicast_stop(&br->multicast_ctx);
4467 	else
4468 		__br_multicast_open(&br->multicast_ctx);
4469 	list_for_each_entry(p, &br->port_list, list) {
4470 		if (on)
4471 			br_multicast_disable_port_ctx(&p->multicast_ctx);
4472 		else
4473 			br_multicast_enable_port_ctx(&p->multicast_ctx);
4474 	}
4475 
4476 	list_for_each_entry(vlan, &vg->vlan_list, vlist)
4477 		br_multicast_toggle_vlan(vlan, on);
4478 
4479 	return 0;
4480 }
4481 
br_multicast_toggle_global_vlan(struct net_bridge_vlan * vlan,bool on)4482 bool br_multicast_toggle_global_vlan(struct net_bridge_vlan *vlan, bool on)
4483 {
4484 	ASSERT_RTNL();
4485 
4486 	/* BR_VLFLAG_GLOBAL_MCAST_ENABLED relies on eventual consistency and
4487 	 * requires only RTNL to change
4488 	 */
4489 	if (on == !!(vlan->priv_flags & BR_VLFLAG_GLOBAL_MCAST_ENABLED))
4490 		return false;
4491 
4492 	vlan->priv_flags ^= BR_VLFLAG_GLOBAL_MCAST_ENABLED;
4493 	br_multicast_toggle_vlan(vlan, on);
4494 
4495 	return true;
4496 }
4497 
br_multicast_stop(struct net_bridge * br)4498 void br_multicast_stop(struct net_bridge *br)
4499 {
4500 	ASSERT_RTNL();
4501 
4502 	if (br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) {
4503 		struct net_bridge_vlan_group *vg;
4504 		struct net_bridge_vlan *vlan;
4505 
4506 		vg = br_vlan_group(br);
4507 		if (vg) {
4508 			list_for_each_entry(vlan, &vg->vlan_list, vlist) {
4509 				struct net_bridge_mcast *brmctx;
4510 
4511 				brmctx = &vlan->br_mcast_ctx;
4512 				if (br_vlan_is_brentry(vlan) &&
4513 				    !br_multicast_ctx_vlan_disabled(brmctx))
4514 					__br_multicast_stop(&vlan->br_mcast_ctx);
4515 			}
4516 		}
4517 	} else {
4518 		__br_multicast_stop(&br->multicast_ctx);
4519 	}
4520 }
4521 
br_multicast_dev_del(struct net_bridge * br)4522 void br_multicast_dev_del(struct net_bridge *br)
4523 {
4524 	struct net_bridge_mdb_entry *mp;
4525 	HLIST_HEAD(deleted_head);
4526 	struct hlist_node *tmp;
4527 
4528 	spin_lock_bh(&br->multicast_lock);
4529 	hlist_for_each_entry_safe(mp, tmp, &br->mdb_list, mdb_node)
4530 		br_multicast_del_mdb_entry(mp);
4531 	hlist_move_list(&br->mcast_gc_list, &deleted_head);
4532 	spin_unlock_bh(&br->multicast_lock);
4533 
4534 	br_multicast_ctx_deinit(&br->multicast_ctx);
4535 	br_multicast_gc(&deleted_head);
4536 	cancel_work_sync(&br->mcast_gc_work);
4537 }
4538 
br_multicast_set_router(struct net_bridge_mcast * brmctx,unsigned long val)4539 int br_multicast_set_router(struct net_bridge_mcast *brmctx, unsigned long val)
4540 {
4541 	int err = -EINVAL;
4542 
4543 	spin_lock_bh(&brmctx->br->multicast_lock);
4544 
4545 	switch (val) {
4546 	case MDB_RTR_TYPE_DISABLED:
4547 	case MDB_RTR_TYPE_PERM:
4548 		br_mc_router_state_change(brmctx->br, val == MDB_RTR_TYPE_PERM);
4549 		timer_delete(&brmctx->ip4_mc_router_timer);
4550 #if IS_ENABLED(CONFIG_IPV6)
4551 		timer_delete(&brmctx->ip6_mc_router_timer);
4552 #endif
4553 		brmctx->multicast_router = val;
4554 		err = 0;
4555 		break;
4556 	case MDB_RTR_TYPE_TEMP_QUERY:
4557 		if (brmctx->multicast_router != MDB_RTR_TYPE_TEMP_QUERY)
4558 			br_mc_router_state_change(brmctx->br, false);
4559 		brmctx->multicast_router = val;
4560 		err = 0;
4561 		break;
4562 	}
4563 
4564 	spin_unlock_bh(&brmctx->br->multicast_lock);
4565 
4566 	return err;
4567 }
4568 
4569 static void
br_multicast_rport_del_notify(struct net_bridge_mcast_port * pmctx,bool deleted)4570 br_multicast_rport_del_notify(struct net_bridge_mcast_port *pmctx, bool deleted)
4571 {
4572 	if (!deleted)
4573 		return;
4574 
4575 	/* For backwards compatibility for now, only notify if there is
4576 	 * no multicast router anymore for both IPv4 and IPv6.
4577 	 */
4578 	if (!hlist_unhashed(&pmctx->ip4_rlist))
4579 		return;
4580 #if IS_ENABLED(CONFIG_IPV6)
4581 	if (!hlist_unhashed(&pmctx->ip6_rlist))
4582 		return;
4583 #endif
4584 
4585 	br_rtr_notify(pmctx->port->br->dev, pmctx, RTM_DELMDB);
4586 	br_port_mc_router_state_change(pmctx->port, false);
4587 
4588 	/* don't allow timer refresh */
4589 	if (pmctx->multicast_router == MDB_RTR_TYPE_TEMP)
4590 		pmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
4591 }
4592 
br_multicast_set_port_router(struct net_bridge_mcast_port * pmctx,unsigned long val)4593 int br_multicast_set_port_router(struct net_bridge_mcast_port *pmctx,
4594 				 unsigned long val)
4595 {
4596 	struct net_bridge_mcast *brmctx;
4597 	unsigned long now = jiffies;
4598 	int err = -EINVAL;
4599 	bool del = false;
4600 
4601 	brmctx = br_multicast_port_ctx_get_global(pmctx);
4602 	spin_lock_bh(&brmctx->br->multicast_lock);
4603 	if (pmctx->multicast_router == val) {
4604 		/* Refresh the temp router port timer */
4605 		if (pmctx->multicast_router == MDB_RTR_TYPE_TEMP) {
4606 			mod_timer(&pmctx->ip4_mc_router_timer,
4607 				  now + brmctx->multicast_querier_interval);
4608 #if IS_ENABLED(CONFIG_IPV6)
4609 			mod_timer(&pmctx->ip6_mc_router_timer,
4610 				  now + brmctx->multicast_querier_interval);
4611 #endif
4612 		}
4613 		err = 0;
4614 		goto unlock;
4615 	}
4616 	switch (val) {
4617 	case MDB_RTR_TYPE_DISABLED:
4618 		pmctx->multicast_router = MDB_RTR_TYPE_DISABLED;
4619 		del |= br_ip4_multicast_rport_del(pmctx);
4620 		timer_delete(&pmctx->ip4_mc_router_timer);
4621 		del |= br_ip6_multicast_rport_del(pmctx);
4622 #if IS_ENABLED(CONFIG_IPV6)
4623 		timer_delete(&pmctx->ip6_mc_router_timer);
4624 #endif
4625 		br_multicast_rport_del_notify(pmctx, del);
4626 		break;
4627 	case MDB_RTR_TYPE_TEMP_QUERY:
4628 		pmctx->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
4629 		del |= br_ip4_multicast_rport_del(pmctx);
4630 		del |= br_ip6_multicast_rport_del(pmctx);
4631 		br_multicast_rport_del_notify(pmctx, del);
4632 		break;
4633 	case MDB_RTR_TYPE_PERM:
4634 		pmctx->multicast_router = MDB_RTR_TYPE_PERM;
4635 		timer_delete(&pmctx->ip4_mc_router_timer);
4636 		br_ip4_multicast_add_router(brmctx, pmctx);
4637 #if IS_ENABLED(CONFIG_IPV6)
4638 		timer_delete(&pmctx->ip6_mc_router_timer);
4639 #endif
4640 		br_ip6_multicast_add_router(brmctx, pmctx);
4641 		break;
4642 	case MDB_RTR_TYPE_TEMP:
4643 		pmctx->multicast_router = MDB_RTR_TYPE_TEMP;
4644 		br_ip4_multicast_mark_router(brmctx, pmctx);
4645 		br_ip6_multicast_mark_router(brmctx, pmctx);
4646 		break;
4647 	default:
4648 		goto unlock;
4649 	}
4650 	err = 0;
4651 unlock:
4652 	spin_unlock_bh(&brmctx->br->multicast_lock);
4653 
4654 	return err;
4655 }
4656 
br_multicast_set_vlan_router(struct net_bridge_vlan * v,u8 mcast_router)4657 int br_multicast_set_vlan_router(struct net_bridge_vlan *v, u8 mcast_router)
4658 {
4659 	int err;
4660 
4661 	if (br_vlan_is_master(v))
4662 		err = br_multicast_set_router(&v->br_mcast_ctx, mcast_router);
4663 	else
4664 		err = br_multicast_set_port_router(&v->port_mcast_ctx,
4665 						   mcast_router);
4666 
4667 	return err;
4668 }
4669 
br_multicast_start_querier(struct net_bridge_mcast * brmctx,struct bridge_mcast_own_query * query)4670 static void br_multicast_start_querier(struct net_bridge_mcast *brmctx,
4671 				       struct bridge_mcast_own_query *query)
4672 {
4673 	struct net_bridge_port *port;
4674 
4675 	if (!br_multicast_ctx_matches_vlan_snooping(brmctx))
4676 		return;
4677 
4678 	__br_multicast_open_query(brmctx->br, query);
4679 
4680 	rcu_read_lock();
4681 	list_for_each_entry_rcu(port, &brmctx->br->port_list, list) {
4682 		struct bridge_mcast_own_query *ip4_own_query;
4683 #if IS_ENABLED(CONFIG_IPV6)
4684 		struct bridge_mcast_own_query *ip6_own_query;
4685 #endif
4686 
4687 		if (br_multicast_port_ctx_state_stopped(&port->multicast_ctx))
4688 			continue;
4689 
4690 		if (br_multicast_ctx_is_vlan(brmctx)) {
4691 			struct net_bridge_vlan *vlan;
4692 
4693 			vlan = br_vlan_find(nbp_vlan_group_rcu(port),
4694 					    brmctx->vlan->vid);
4695 			if (!vlan ||
4696 			    br_multicast_port_ctx_state_stopped(&vlan->port_mcast_ctx))
4697 				continue;
4698 
4699 			ip4_own_query = &vlan->port_mcast_ctx.ip4_own_query;
4700 #if IS_ENABLED(CONFIG_IPV6)
4701 			ip6_own_query = &vlan->port_mcast_ctx.ip6_own_query;
4702 #endif
4703 		} else {
4704 			ip4_own_query = &port->multicast_ctx.ip4_own_query;
4705 #if IS_ENABLED(CONFIG_IPV6)
4706 			ip6_own_query = &port->multicast_ctx.ip6_own_query;
4707 #endif
4708 		}
4709 
4710 		if (query == &brmctx->ip4_own_query)
4711 			br_multicast_enable(ip4_own_query);
4712 #if IS_ENABLED(CONFIG_IPV6)
4713 		else
4714 			br_multicast_enable(ip6_own_query);
4715 #endif
4716 	}
4717 	rcu_read_unlock();
4718 }
4719 
br_multicast_enable_all_ports(struct net_bridge * br)4720 static void br_multicast_enable_all_ports(struct net_bridge *br)
4721 {
4722 	struct net_bridge_port *port;
4723 
4724 	if (br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED))
4725 		return;
4726 
4727 	list_for_each_entry(port, &br->port_list, list)
4728 		__br_multicast_enable_port_ctx(&port->multicast_ctx);
4729 }
4730 
br_multicast_disable_all_ports(struct net_bridge * br)4731 static void br_multicast_disable_all_ports(struct net_bridge *br)
4732 {
4733 	struct net_bridge_port *port;
4734 
4735 	if (br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED))
4736 		return;
4737 
4738 	list_for_each_entry(port, &br->port_list, list)
4739 		__br_multicast_disable_port_ctx(&port->multicast_ctx);
4740 }
4741 
br_multicast_toggle(struct net_bridge * br,unsigned long val,struct netlink_ext_ack * extack)4742 int br_multicast_toggle(struct net_bridge *br, unsigned long val,
4743 			struct netlink_ext_ack *extack)
4744 {
4745 	bool change_snoopers = false;
4746 	int err = 0;
4747 
4748 	spin_lock_bh(&br->multicast_lock);
4749 	if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val)
4750 		goto unlock;
4751 
4752 	err = br_mc_disabled_update(br->dev, val, extack);
4753 	if (err == -EOPNOTSUPP)
4754 		err = 0;
4755 	if (err)
4756 		goto unlock;
4757 
4758 	br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val);
4759 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
4760 		change_snoopers = true;
4761 		br_multicast_disable_all_ports(br);
4762 		goto unlock;
4763 	}
4764 
4765 	if (!netif_running(br->dev))
4766 		goto unlock;
4767 
4768 	br_multicast_open(br);
4769 	br_multicast_enable_all_ports(br);
4770 
4771 	change_snoopers = true;
4772 
4773 unlock:
4774 	spin_unlock_bh(&br->multicast_lock);
4775 
4776 	/* br_multicast_join_snoopers has the potential to cause
4777 	 * an MLD Report/Leave to be delivered to br_multicast_rcv,
4778 	 * which would in turn call br_multicast_add_group, which would
4779 	 * attempt to acquire multicast_lock. This function should be
4780 	 * called after the lock has been released to avoid deadlocks on
4781 	 * multicast_lock.
4782 	 *
4783 	 * br_multicast_leave_snoopers does not have the problem since
4784 	 * br_multicast_rcv first checks BROPT_MULTICAST_ENABLED, and
4785 	 * returns without calling br_multicast_ipv4/6_rcv if it's not
4786 	 * enabled. Moved both functions out just for symmetry.
4787 	 */
4788 	if (change_snoopers) {
4789 		if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
4790 			br_multicast_join_snoopers(br);
4791 		else
4792 			br_multicast_leave_snoopers(br);
4793 	}
4794 
4795 	return err;
4796 }
4797 
br_multicast_enabled(const struct net_device * dev)4798 bool br_multicast_enabled(const struct net_device *dev)
4799 {
4800 	struct net_bridge *br = netdev_priv(dev);
4801 
4802 	return !!br_opt_get(br, BROPT_MULTICAST_ENABLED);
4803 }
4804 EXPORT_SYMBOL_GPL(br_multicast_enabled);
4805 
br_multicast_router(const struct net_device * dev)4806 bool br_multicast_router(const struct net_device *dev)
4807 {
4808 	struct net_bridge *br = netdev_priv(dev);
4809 	bool is_router;
4810 
4811 	spin_lock_bh(&br->multicast_lock);
4812 	is_router = br_multicast_is_router(&br->multicast_ctx, NULL);
4813 	spin_unlock_bh(&br->multicast_lock);
4814 	return is_router;
4815 }
4816 EXPORT_SYMBOL_GPL(br_multicast_router);
4817 
br_multicast_set_querier(struct net_bridge_mcast * brmctx,unsigned long val)4818 int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
4819 {
4820 	unsigned long max_delay;
4821 
4822 	val = !!val;
4823 
4824 	spin_lock_bh(&brmctx->br->multicast_lock);
4825 	if (brmctx->multicast_querier == val)
4826 		goto unlock;
4827 
4828 	WRITE_ONCE(brmctx->multicast_querier, val);
4829 	if (!val)
4830 		goto unlock;
4831 
4832 	max_delay = brmctx->multicast_query_response_interval;
4833 
4834 	if (!timer_pending(&brmctx->ip4_other_query.timer))
4835 		mod_timer(&brmctx->ip4_other_query.delay_timer,
4836 			  jiffies + max_delay);
4837 
4838 	br_multicast_start_querier(brmctx, &brmctx->ip4_own_query);
4839 
4840 #if IS_ENABLED(CONFIG_IPV6)
4841 	if (!timer_pending(&brmctx->ip6_other_query.timer))
4842 		mod_timer(&brmctx->ip6_other_query.delay_timer,
4843 			  jiffies + max_delay);
4844 
4845 	br_multicast_start_querier(brmctx, &brmctx->ip6_own_query);
4846 #endif
4847 
4848 unlock:
4849 	spin_unlock_bh(&brmctx->br->multicast_lock);
4850 
4851 	return 0;
4852 }
4853 
br_multicast_set_igmp_version(struct net_bridge_mcast * brmctx,unsigned long val)4854 int br_multicast_set_igmp_version(struct net_bridge_mcast *brmctx,
4855 				  unsigned long val)
4856 {
4857 	/* Currently we support only version 2 and 3 */
4858 	switch (val) {
4859 	case 2:
4860 	case 3:
4861 		break;
4862 	default:
4863 		return -EINVAL;
4864 	}
4865 
4866 	spin_lock_bh(&brmctx->br->multicast_lock);
4867 	brmctx->multicast_igmp_version = val;
4868 	spin_unlock_bh(&brmctx->br->multicast_lock);
4869 
4870 	return 0;
4871 }
4872 
4873 #if IS_ENABLED(CONFIG_IPV6)
br_multicast_set_mld_version(struct net_bridge_mcast * brmctx,unsigned long val)4874 int br_multicast_set_mld_version(struct net_bridge_mcast *brmctx,
4875 				 unsigned long val)
4876 {
4877 	/* Currently we support version 1 and 2 */
4878 	switch (val) {
4879 	case 1:
4880 	case 2:
4881 		break;
4882 	default:
4883 		return -EINVAL;
4884 	}
4885 
4886 	spin_lock_bh(&brmctx->br->multicast_lock);
4887 	brmctx->multicast_mld_version = val;
4888 	spin_unlock_bh(&brmctx->br->multicast_lock);
4889 
4890 	return 0;
4891 }
4892 #endif
4893 
br_multicast_set_query_intvl(struct net_bridge_mcast * brmctx,unsigned long val)4894 void br_multicast_set_query_intvl(struct net_bridge_mcast *brmctx,
4895 				  unsigned long val)
4896 {
4897 	unsigned long intvl_jiffies = clock_t_to_jiffies(val);
4898 
4899 	if (intvl_jiffies < BR_MULTICAST_QUERY_INTVL_MIN) {
4900 		br_info(brmctx->br,
4901 			"trying to set multicast query interval below minimum, setting to %lu (%ums)\n",
4902 			jiffies_to_clock_t(BR_MULTICAST_QUERY_INTVL_MIN),
4903 			jiffies_to_msecs(BR_MULTICAST_QUERY_INTVL_MIN));
4904 		intvl_jiffies = BR_MULTICAST_QUERY_INTVL_MIN;
4905 	}
4906 
4907 	if (intvl_jiffies > BR_MULTICAST_QUERY_INTVL_MAX) {
4908 		br_info(brmctx->br,
4909 			"trying to set multicast query interval above maximum, setting to %lu (%ums)\n",
4910 			jiffies_to_clock_t(BR_MULTICAST_QUERY_INTVL_MAX),
4911 			jiffies_to_msecs(BR_MULTICAST_QUERY_INTVL_MAX));
4912 		intvl_jiffies = BR_MULTICAST_QUERY_INTVL_MAX;
4913 	}
4914 
4915 	brmctx->multicast_query_interval = intvl_jiffies;
4916 }
4917 
br_multicast_set_startup_query_intvl(struct net_bridge_mcast * brmctx,unsigned long val)4918 void br_multicast_set_startup_query_intvl(struct net_bridge_mcast *brmctx,
4919 					  unsigned long val)
4920 {
4921 	unsigned long intvl_jiffies = clock_t_to_jiffies(val);
4922 
4923 	if (intvl_jiffies < BR_MULTICAST_STARTUP_QUERY_INTVL_MIN) {
4924 		br_info(brmctx->br,
4925 			"trying to set multicast startup query interval below minimum, setting to %lu (%ums)\n",
4926 			jiffies_to_clock_t(BR_MULTICAST_STARTUP_QUERY_INTVL_MIN),
4927 			jiffies_to_msecs(BR_MULTICAST_STARTUP_QUERY_INTVL_MIN));
4928 		intvl_jiffies = BR_MULTICAST_STARTUP_QUERY_INTVL_MIN;
4929 	}
4930 
4931 	if (intvl_jiffies > BR_MULTICAST_STARTUP_QUERY_INTVL_MAX) {
4932 		br_info(brmctx->br,
4933 			"trying to set multicast startup query interval above maximum, setting to %lu (%ums)\n",
4934 			jiffies_to_clock_t(BR_MULTICAST_STARTUP_QUERY_INTVL_MAX),
4935 			jiffies_to_msecs(BR_MULTICAST_STARTUP_QUERY_INTVL_MAX));
4936 		intvl_jiffies = BR_MULTICAST_STARTUP_QUERY_INTVL_MAX;
4937 	}
4938 
4939 	brmctx->multicast_startup_query_interval = intvl_jiffies;
4940 }
4941 
4942 /**
4943  * br_multicast_list_adjacent - Returns snooped multicast addresses
4944  * @dev:	The bridge port adjacent to which to retrieve addresses
4945  * @br_ip_list:	The list to store found, snooped multicast IP addresses in
4946  *
4947  * Creates a list of IP addresses (struct br_ip_list) sensed by the multicast
4948  * snooping feature on all bridge ports of dev's bridge device, excluding
4949  * the addresses from dev itself.
4950  *
4951  * Returns the number of items added to br_ip_list.
4952  *
4953  * Notes:
4954  * - br_ip_list needs to be initialized by caller
4955  * - br_ip_list might contain duplicates in the end
4956  *   (needs to be taken care of by caller)
4957  * - br_ip_list needs to be freed by caller
4958  */
br_multicast_list_adjacent(struct net_device * dev,struct list_head * br_ip_list)4959 int br_multicast_list_adjacent(struct net_device *dev,
4960 			       struct list_head *br_ip_list)
4961 {
4962 	struct net_bridge *br;
4963 	struct net_bridge_port *port;
4964 	struct net_bridge_port_group *group;
4965 	struct br_ip_list *entry;
4966 	int count = 0;
4967 
4968 	rcu_read_lock();
4969 	if (!br_ip_list || !netif_is_bridge_port(dev))
4970 		goto unlock;
4971 
4972 	port = br_port_get_rcu(dev);
4973 	if (!port || !port->br)
4974 		goto unlock;
4975 
4976 	br = port->br;
4977 
4978 	list_for_each_entry_rcu(port, &br->port_list, list) {
4979 		if (!port->dev || port->dev == dev)
4980 			continue;
4981 
4982 		hlist_for_each_entry_rcu(group, &port->mglist, mglist) {
4983 			entry = kmalloc_obj(*entry, GFP_ATOMIC);
4984 			if (!entry)
4985 				goto unlock;
4986 
4987 			entry->addr = group->key.addr;
4988 			list_add(&entry->list, br_ip_list);
4989 			count++;
4990 		}
4991 	}
4992 
4993 unlock:
4994 	rcu_read_unlock();
4995 	return count;
4996 }
4997 EXPORT_SYMBOL_GPL(br_multicast_list_adjacent);
4998 
4999 /**
5000  * br_multicast_has_querier_anywhere - Checks for a querier on a bridge
5001  * @dev: The bridge port providing the bridge on which to check for a querier
5002  * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
5003  *
5004  * Checks whether the given interface has a bridge on top and if so returns
5005  * true if a valid querier exists anywhere on the bridged link layer.
5006  * Otherwise returns false.
5007  */
br_multicast_has_querier_anywhere(struct net_device * dev,int proto)5008 bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto)
5009 {
5010 	struct net_bridge *br;
5011 	struct net_bridge_port *port;
5012 	struct ethhdr eth;
5013 	bool ret = false;
5014 
5015 	rcu_read_lock();
5016 	if (!netif_is_bridge_port(dev))
5017 		goto unlock;
5018 
5019 	port = br_port_get_rcu(dev);
5020 	if (!port || !port->br)
5021 		goto unlock;
5022 
5023 	br = port->br;
5024 
5025 	memset(&eth, 0, sizeof(eth));
5026 	eth.h_proto = htons(proto);
5027 
5028 	ret = br_multicast_querier_exists(&br->multicast_ctx, &eth, NULL);
5029 
5030 unlock:
5031 	rcu_read_unlock();
5032 	return ret;
5033 }
5034 EXPORT_SYMBOL_GPL(br_multicast_has_querier_anywhere);
5035 
5036 /**
5037  * br_multicast_has_querier_adjacent - Checks for a querier behind a bridge port
5038  * @dev: The bridge port adjacent to which to check for a querier
5039  * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
5040  *
5041  * Checks whether the given interface has a bridge on top and if so returns
5042  * true if a selected querier is behind one of the other ports of this
5043  * bridge. Otherwise returns false.
5044  */
br_multicast_has_querier_adjacent(struct net_device * dev,int proto)5045 bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto)
5046 {
5047 	struct net_bridge_mcast *brmctx;
5048 	struct net_bridge *br;
5049 	struct net_bridge_port *port;
5050 	bool ret = false;
5051 	int port_ifidx;
5052 
5053 	rcu_read_lock();
5054 	if (!netif_is_bridge_port(dev))
5055 		goto unlock;
5056 
5057 	port = br_port_get_rcu(dev);
5058 	if (!port || !port->br)
5059 		goto unlock;
5060 
5061 	br = port->br;
5062 	brmctx = &br->multicast_ctx;
5063 
5064 	switch (proto) {
5065 	case ETH_P_IP:
5066 		port_ifidx = brmctx->ip4_querier.port_ifidx;
5067 		if (!timer_pending(&brmctx->ip4_other_query.timer) ||
5068 		    port_ifidx == port->dev->ifindex)
5069 			goto unlock;
5070 		break;
5071 #if IS_ENABLED(CONFIG_IPV6)
5072 	case ETH_P_IPV6:
5073 		port_ifidx = brmctx->ip6_querier.port_ifidx;
5074 		if (!timer_pending(&brmctx->ip6_other_query.timer) ||
5075 		    port_ifidx == port->dev->ifindex)
5076 			goto unlock;
5077 		break;
5078 #endif
5079 	default:
5080 		goto unlock;
5081 	}
5082 
5083 	ret = true;
5084 unlock:
5085 	rcu_read_unlock();
5086 	return ret;
5087 }
5088 EXPORT_SYMBOL_GPL(br_multicast_has_querier_adjacent);
5089 
5090 /**
5091  * br_multicast_has_router_adjacent - Checks for a router behind a bridge port
5092  * @dev: The bridge port adjacent to which to check for a multicast router
5093  * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
5094  *
5095  * Checks whether the given interface has a bridge on top and if so returns
5096  * true if a multicast router is behind one of the other ports of this
5097  * bridge. Otherwise returns false.
5098  */
br_multicast_has_router_adjacent(struct net_device * dev,int proto)5099 bool br_multicast_has_router_adjacent(struct net_device *dev, int proto)
5100 {
5101 	struct net_bridge_mcast_port *pmctx;
5102 	struct net_bridge_mcast *brmctx;
5103 	struct net_bridge_port *port;
5104 	bool ret = false;
5105 
5106 	rcu_read_lock();
5107 	port = br_port_get_check_rcu(dev);
5108 	if (!port)
5109 		goto unlock;
5110 
5111 	brmctx = &port->br->multicast_ctx;
5112 	switch (proto) {
5113 	case ETH_P_IP:
5114 		hlist_for_each_entry_rcu(pmctx, &brmctx->ip4_mc_router_list,
5115 					 ip4_rlist) {
5116 			if (pmctx->port == port)
5117 				continue;
5118 
5119 			ret = true;
5120 			goto unlock;
5121 		}
5122 		break;
5123 #if IS_ENABLED(CONFIG_IPV6)
5124 	case ETH_P_IPV6:
5125 		hlist_for_each_entry_rcu(pmctx, &brmctx->ip6_mc_router_list,
5126 					 ip6_rlist) {
5127 			if (pmctx->port == port)
5128 				continue;
5129 
5130 			ret = true;
5131 			goto unlock;
5132 		}
5133 		break;
5134 #endif
5135 	default:
5136 		/* when compiled without IPv6 support, be conservative and
5137 		 * always assume presence of an IPv6 multicast router
5138 		 */
5139 		ret = true;
5140 	}
5141 
5142 unlock:
5143 	rcu_read_unlock();
5144 	return ret;
5145 }
5146 EXPORT_SYMBOL_GPL(br_multicast_has_router_adjacent);
5147 
br_mcast_stats_add(struct bridge_mcast_stats __percpu * stats,const struct sk_buff * skb,u8 type,u8 dir)5148 static void br_mcast_stats_add(struct bridge_mcast_stats __percpu *stats,
5149 			       const struct sk_buff *skb, u8 type, u8 dir)
5150 {
5151 	struct bridge_mcast_stats *pstats = this_cpu_ptr(stats);
5152 	__be16 proto = skb->protocol;
5153 	unsigned int t_len;
5154 
5155 	u64_stats_update_begin(&pstats->syncp);
5156 	switch (proto) {
5157 	case htons(ETH_P_IP):
5158 		t_len = ntohs(ip_hdr(skb)->tot_len) - ip_hdrlen(skb);
5159 		switch (type) {
5160 		case IGMP_HOST_MEMBERSHIP_REPORT:
5161 			pstats->mstats.igmp_v1reports[dir]++;
5162 			break;
5163 		case IGMPV2_HOST_MEMBERSHIP_REPORT:
5164 			pstats->mstats.igmp_v2reports[dir]++;
5165 			break;
5166 		case IGMPV3_HOST_MEMBERSHIP_REPORT:
5167 			pstats->mstats.igmp_v3reports[dir]++;
5168 			break;
5169 		case IGMP_HOST_MEMBERSHIP_QUERY:
5170 			if (t_len != sizeof(struct igmphdr)) {
5171 				pstats->mstats.igmp_v3queries[dir]++;
5172 			} else {
5173 				unsigned int offset = skb_transport_offset(skb);
5174 				struct igmphdr *ih, _ihdr;
5175 
5176 				ih = skb_header_pointer(skb, offset,
5177 							sizeof(_ihdr), &_ihdr);
5178 				if (!ih)
5179 					break;
5180 				if (!ih->code)
5181 					pstats->mstats.igmp_v1queries[dir]++;
5182 				else
5183 					pstats->mstats.igmp_v2queries[dir]++;
5184 			}
5185 			break;
5186 		case IGMP_HOST_LEAVE_MESSAGE:
5187 			pstats->mstats.igmp_leaves[dir]++;
5188 			break;
5189 		}
5190 		break;
5191 #if IS_ENABLED(CONFIG_IPV6)
5192 	case htons(ETH_P_IPV6):
5193 		t_len = ntohs(ipv6_hdr(skb)->payload_len) +
5194 			sizeof(struct ipv6hdr);
5195 		t_len -= skb_network_header_len(skb);
5196 		switch (type) {
5197 		case ICMPV6_MGM_REPORT:
5198 			pstats->mstats.mld_v1reports[dir]++;
5199 			break;
5200 		case ICMPV6_MLD2_REPORT:
5201 			pstats->mstats.mld_v2reports[dir]++;
5202 			break;
5203 		case ICMPV6_MGM_QUERY:
5204 			if (t_len != sizeof(struct mld_msg))
5205 				pstats->mstats.mld_v2queries[dir]++;
5206 			else
5207 				pstats->mstats.mld_v1queries[dir]++;
5208 			break;
5209 		case ICMPV6_MGM_REDUCTION:
5210 			pstats->mstats.mld_leaves[dir]++;
5211 			break;
5212 		}
5213 		break;
5214 #endif /* CONFIG_IPV6 */
5215 	}
5216 	u64_stats_update_end(&pstats->syncp);
5217 }
5218 
br_multicast_count(struct net_bridge * br,const struct net_bridge_port * p,const struct sk_buff * skb,u8 type,u8 dir)5219 void br_multicast_count(struct net_bridge *br,
5220 			const struct net_bridge_port *p,
5221 			const struct sk_buff *skb, u8 type, u8 dir)
5222 {
5223 	struct bridge_mcast_stats __percpu *stats;
5224 
5225 	/* if multicast_disabled is true then igmp type can't be set */
5226 	if (!type || !br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED))
5227 		return;
5228 
5229 	if (p)
5230 		stats = p->mcast_stats;
5231 	else
5232 		stats = br->mcast_stats;
5233 	if (WARN_ON(!stats))
5234 		return;
5235 
5236 	br_mcast_stats_add(stats, skb, type, dir);
5237 }
5238 
br_multicast_init_stats(struct net_bridge * br)5239 int br_multicast_init_stats(struct net_bridge *br)
5240 {
5241 	br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats);
5242 	if (!br->mcast_stats)
5243 		return -ENOMEM;
5244 
5245 	return 0;
5246 }
5247 
br_multicast_uninit_stats(struct net_bridge * br)5248 void br_multicast_uninit_stats(struct net_bridge *br)
5249 {
5250 	free_percpu(br->mcast_stats);
5251 }
5252 
5253 /* noinline for https://llvm.org/pr45802#c9 */
mcast_stats_add_dir(u64 * dst,u64 * src)5254 static noinline_for_stack void mcast_stats_add_dir(u64 *dst, u64 *src)
5255 {
5256 	dst[BR_MCAST_DIR_RX] += src[BR_MCAST_DIR_RX];
5257 	dst[BR_MCAST_DIR_TX] += src[BR_MCAST_DIR_TX];
5258 }
5259 
br_multicast_get_stats(const struct net_bridge * br,const struct net_bridge_port * p,struct br_mcast_stats * dest)5260 void br_multicast_get_stats(const struct net_bridge *br,
5261 			    const struct net_bridge_port *p,
5262 			    struct br_mcast_stats *dest)
5263 {
5264 	struct bridge_mcast_stats __percpu *stats;
5265 	struct br_mcast_stats tdst;
5266 	int i;
5267 
5268 	memset(dest, 0, sizeof(*dest));
5269 	if (p)
5270 		stats = p->mcast_stats;
5271 	else
5272 		stats = br->mcast_stats;
5273 	if (WARN_ON(!stats))
5274 		return;
5275 
5276 	memset(&tdst, 0, sizeof(tdst));
5277 	for_each_possible_cpu(i) {
5278 		struct bridge_mcast_stats *cpu_stats = per_cpu_ptr(stats, i);
5279 		struct br_mcast_stats temp;
5280 		unsigned int start;
5281 
5282 		do {
5283 			start = u64_stats_fetch_begin(&cpu_stats->syncp);
5284 			u64_stats_copy(&temp, &cpu_stats->mstats, sizeof(temp));
5285 		} while (u64_stats_fetch_retry(&cpu_stats->syncp, start));
5286 
5287 		mcast_stats_add_dir(tdst.igmp_v1queries, temp.igmp_v1queries);
5288 		mcast_stats_add_dir(tdst.igmp_v2queries, temp.igmp_v2queries);
5289 		mcast_stats_add_dir(tdst.igmp_v3queries, temp.igmp_v3queries);
5290 		mcast_stats_add_dir(tdst.igmp_leaves, temp.igmp_leaves);
5291 		mcast_stats_add_dir(tdst.igmp_v1reports, temp.igmp_v1reports);
5292 		mcast_stats_add_dir(tdst.igmp_v2reports, temp.igmp_v2reports);
5293 		mcast_stats_add_dir(tdst.igmp_v3reports, temp.igmp_v3reports);
5294 		tdst.igmp_parse_errors += temp.igmp_parse_errors;
5295 
5296 		mcast_stats_add_dir(tdst.mld_v1queries, temp.mld_v1queries);
5297 		mcast_stats_add_dir(tdst.mld_v2queries, temp.mld_v2queries);
5298 		mcast_stats_add_dir(tdst.mld_leaves, temp.mld_leaves);
5299 		mcast_stats_add_dir(tdst.mld_v1reports, temp.mld_v1reports);
5300 		mcast_stats_add_dir(tdst.mld_v2reports, temp.mld_v2reports);
5301 		tdst.mld_parse_errors += temp.mld_parse_errors;
5302 	}
5303 	memcpy(dest, &tdst, sizeof(*dest));
5304 }
5305 
br_mdb_hash_init(struct net_bridge * br)5306 int br_mdb_hash_init(struct net_bridge *br)
5307 {
5308 	int err;
5309 
5310 	err = rhashtable_init(&br->sg_port_tbl, &br_sg_port_rht_params);
5311 	if (err)
5312 		return err;
5313 
5314 	err = rhashtable_init(&br->mdb_hash_tbl, &br_mdb_rht_params);
5315 	if (err) {
5316 		rhashtable_destroy(&br->sg_port_tbl);
5317 		return err;
5318 	}
5319 
5320 	return 0;
5321 }
5322 
br_mdb_hash_fini(struct net_bridge * br)5323 void br_mdb_hash_fini(struct net_bridge *br)
5324 {
5325 	rhashtable_destroy(&br->sg_port_tbl);
5326 	rhashtable_destroy(&br->mdb_hash_tbl);
5327 }
5328