net: bridge: multicast: handle block pg delete for all cases
[linux-block.git] / net / bridge / br_multicast.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
eb1d1641
HX
2/*
3 * Bridge multicast support.
4 *
5 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
eb1d1641
HX
6 */
7
8#include <linux/err.h>
07f8ac4a 9#include <linux/export.h>
eb1d1641
HX
10#include <linux/if_ether.h>
11#include <linux/igmp.h>
4b3087c7 12#include <linux/in.h>
eb1d1641
HX
13#include <linux/jhash.h>
14#include <linux/kernel.h>
b195167f 15#include <linux/log2.h>
eb1d1641
HX
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>
1c8ad5bf 23#include <linux/inetdevice.h>
91b02d3d 24#include <linux/mroute.h>
eb1d1641 25#include <net/ip.h>
147c1e9b 26#include <net/switchdev.h>
dfd56b8b 27#if IS_ENABLED(CONFIG_IPV6)
4b3087c7 28#include <linux/icmpv6.h>
08b202b6
YH
29#include <net/ipv6.h>
30#include <net/mld.h>
d4c4f07d 31#include <net/ip6_checksum.h>
3c3769e6 32#include <net/addrconf.h>
08b202b6 33#endif
eb1d1641
HX
34
35#include "br_private.h"
8f07b831 36#include "br_private_mcast_eht.h"
eb1d1641 37
19e3a9c9
NA
38static const struct rhashtable_params br_mdb_rht_params = {
39 .head_offset = offsetof(struct net_bridge_mdb_entry, rhnode),
40 .key_offset = offsetof(struct net_bridge_mdb_entry, addr),
41 .key_len = sizeof(struct br_ip),
42 .automatic_shrinking = true,
19e3a9c9
NA
43};
44
085b53c8
NA
45static const struct rhashtable_params br_sg_port_rht_params = {
46 .head_offset = offsetof(struct net_bridge_port_group, rhnode),
47 .key_offset = offsetof(struct net_bridge_port_group, key),
48 .key_len = sizeof(struct net_bridge_port_group_sg_key),
49 .automatic_shrinking = true,
50};
51
cc0fdd80 52static void br_multicast_start_querier(struct net_bridge *br,
90010b36 53 struct bridge_mcast_own_query *query);
754bc547
SA
54static void br_multicast_add_router(struct net_bridge *br,
55 struct net_bridge_port *port);
bc8c20ac
SA
56static void br_ip4_multicast_leave_group(struct net_bridge *br,
57 struct net_bridge_port *port,
58 __be32 group,
6db6f0ea
FF
59 __u16 vid,
60 const unsigned char *src);
42c11ccf 61static void br_multicast_port_group_rexmit(struct timer_list *t);
6db6f0ea 62
f12e7d95 63static void __del_port_router(struct net_bridge_port *p);
bc8c20ac
SA
64#if IS_ENABLED(CONFIG_IPV6)
65static void br_ip6_multicast_leave_group(struct net_bridge *br,
66 struct net_bridge_port *port,
67 const struct in6_addr *group,
6db6f0ea 68 __u16 vid, const unsigned char *src);
bc8c20ac 69#endif
b0812368
NA
70static struct net_bridge_port_group *
71__br_multicast_add_group(struct net_bridge *br,
72 struct net_bridge_port *port,
73 struct br_ip *group,
74 const unsigned char *src,
75 u8 filter_mode,
9116ffbf
NA
76 bool igmpv2_mldv1,
77 bool blocked);
8266a049
NA
78static void br_multicast_find_del_pg(struct net_bridge *br,
79 struct net_bridge_port_group *pg);
c83b8fab 80
085b53c8
NA
81static struct net_bridge_port_group *
82br_sg_port_find(struct net_bridge *br,
83 struct net_bridge_port_group_sg_key *sg_p)
84{
85 lockdep_assert_held_once(&br->multicast_lock);
86
87 return rhashtable_lookup_fast(&br->sg_port_tbl, sg_p,
88 br_sg_port_rht_params);
89}
90
19e3a9c9
NA
91static struct net_bridge_mdb_entry *br_mdb_ip_get_rcu(struct net_bridge *br,
92 struct br_ip *dst)
08b202b6 93{
19e3a9c9 94 return rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params);
08b202b6 95}
08b202b6 96
19e3a9c9
NA
97struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge *br,
98 struct br_ip *dst)
eb1d1641 99{
19e3a9c9 100 struct net_bridge_mdb_entry *ent;
eb1d1641 101
19e3a9c9 102 lockdep_assert_held_once(&br->multicast_lock);
eb1d1641 103
19e3a9c9
NA
104 rcu_read_lock();
105 ent = rhashtable_lookup(&br->mdb_hash_tbl, dst, br_mdb_rht_params);
106 rcu_read_unlock();
7f285fa7 107
19e3a9c9 108 return ent;
7f285fa7
HX
109}
110
19e3a9c9
NA
111static struct net_bridge_mdb_entry *br_mdb_ip4_get(struct net_bridge *br,
112 __be32 dst, __u16 vid)
eb1d1641 113{
8ef2a9a5
YH
114 struct br_ip br_dst;
115
19e3a9c9 116 memset(&br_dst, 0, sizeof(br_dst));
eab3227b 117 br_dst.dst.ip4 = dst;
8ef2a9a5 118 br_dst.proto = htons(ETH_P_IP);
b0e9a30d 119 br_dst.vid = vid;
0821ec55 120
19e3a9c9 121 return br_mdb_ip_get(br, &br_dst);
8ef2a9a5
YH
122}
123
dfd56b8b 124#if IS_ENABLED(CONFIG_IPV6)
19e3a9c9
NA
125static struct net_bridge_mdb_entry *br_mdb_ip6_get(struct net_bridge *br,
126 const struct in6_addr *dst,
127 __u16 vid)
08b202b6
YH
128{
129 struct br_ip br_dst;
0821ec55 130
19e3a9c9 131 memset(&br_dst, 0, sizeof(br_dst));
eab3227b 132 br_dst.dst.ip6 = *dst;
08b202b6 133 br_dst.proto = htons(ETH_P_IPV6);
b0e9a30d 134 br_dst.vid = vid;
08b202b6 135
19e3a9c9 136 return br_mdb_ip_get(br, &br_dst);
08b202b6
YH
137}
138#endif
139
eb1d1641 140struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
fbca58a2 141 struct sk_buff *skb, u16 vid)
eb1d1641 142{
8ef2a9a5
YH
143 struct br_ip ip;
144
13cefad2 145 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
eb1d1641
HX
146 return NULL;
147
8ef2a9a5 148 if (BR_INPUT_SKB_CB(skb)->igmp)
eb1d1641
HX
149 return NULL;
150
19e3a9c9 151 memset(&ip, 0, sizeof(ip));
8ef2a9a5 152 ip.proto = skb->protocol;
fbca58a2 153 ip.vid = vid;
8ef2a9a5 154
eb1d1641
HX
155 switch (skb->protocol) {
156 case htons(ETH_P_IP):
eab3227b 157 ip.dst.ip4 = ip_hdr(skb)->daddr;
7d07a68c
NA
158 if (br->multicast_igmp_version == 3) {
159 struct net_bridge_mdb_entry *mdb;
160
161 ip.src.ip4 = ip_hdr(skb)->saddr;
162 mdb = br_mdb_ip_get_rcu(br, &ip);
163 if (mdb)
164 return mdb;
165 ip.src.ip4 = 0;
166 }
8ef2a9a5 167 break;
dfd56b8b 168#if IS_ENABLED(CONFIG_IPV6)
08b202b6 169 case htons(ETH_P_IPV6):
eab3227b 170 ip.dst.ip6 = ipv6_hdr(skb)->daddr;
7d07a68c
NA
171 if (br->multicast_mld_version == 2) {
172 struct net_bridge_mdb_entry *mdb;
173
174 ip.src.ip6 = ipv6_hdr(skb)->saddr;
175 mdb = br_mdb_ip_get_rcu(br, &ip);
176 if (mdb)
177 return mdb;
178 memset(&ip.src.ip6, 0, sizeof(ip.src.ip6));
179 }
08b202b6
YH
180 break;
181#endif
8ef2a9a5 182 default:
955062b0
NA
183 ip.proto = 0;
184 ether_addr_copy(ip.dst.mac_addr, eth_hdr(skb)->h_dest);
eb1d1641
HX
185 }
186
19e3a9c9 187 return br_mdb_ip_get_rcu(br, &ip);
eb1d1641
HX
188}
189
b0812368
NA
190static bool br_port_group_equal(struct net_bridge_port_group *p,
191 struct net_bridge_port *port,
192 const unsigned char *src)
193{
194 if (p->key.port != port)
195 return false;
196
197 if (!(port->flags & BR_MULTICAST_TO_UNICAST))
198 return true;
199
200 return ether_addr_equal(src, p->eth_addr);
201}
202
8266a049
NA
203static void __fwd_add_star_excl(struct net_bridge_port_group *pg,
204 struct br_ip *sg_ip)
205{
206 struct net_bridge_port_group_sg_key sg_key;
207 struct net_bridge *br = pg->key.port->br;
208 struct net_bridge_port_group *src_pg;
209
210 memset(&sg_key, 0, sizeof(sg_key));
211 sg_key.port = pg->key.port;
212 sg_key.addr = *sg_ip;
213 if (br_sg_port_find(br, &sg_key))
214 return;
215
216 src_pg = __br_multicast_add_group(br, pg->key.port, sg_ip, pg->eth_addr,
9116ffbf 217 MCAST_INCLUDE, false, false);
8266a049
NA
218 if (IS_ERR_OR_NULL(src_pg) ||
219 src_pg->rt_protocol != RTPROT_KERNEL)
220 return;
221
222 src_pg->flags |= MDB_PG_FLAGS_STAR_EXCL;
223}
224
225static void __fwd_del_star_excl(struct net_bridge_port_group *pg,
226 struct br_ip *sg_ip)
227{
228 struct net_bridge_port_group_sg_key sg_key;
229 struct net_bridge *br = pg->key.port->br;
230 struct net_bridge_port_group *src_pg;
231
232 memset(&sg_key, 0, sizeof(sg_key));
233 sg_key.port = pg->key.port;
234 sg_key.addr = *sg_ip;
235 src_pg = br_sg_port_find(br, &sg_key);
236 if (!src_pg || !(src_pg->flags & MDB_PG_FLAGS_STAR_EXCL) ||
237 src_pg->rt_protocol != RTPROT_KERNEL)
238 return;
239
240 br_multicast_find_del_pg(br, src_pg);
241}
242
243/* When a port group transitions to (or is added as) EXCLUDE we need to add it
244 * to all other ports' S,G entries which are not blocked by the current group
245 * for proper replication, the assumption is that any S,G blocked entries
246 * are already added so the S,G,port lookup should skip them.
247 * When a port group transitions from EXCLUDE -> INCLUDE mode or is being
248 * deleted we need to remove it from all ports' S,G entries where it was
249 * automatically installed before (i.e. where it's MDB_PG_FLAGS_STAR_EXCL).
250 */
251void br_multicast_star_g_handle_mode(struct net_bridge_port_group *pg,
252 u8 filter_mode)
253{
254 struct net_bridge *br = pg->key.port->br;
255 struct net_bridge_port_group *pg_lst;
256 struct net_bridge_mdb_entry *mp;
257 struct br_ip sg_ip;
258
259 if (WARN_ON(!br_multicast_is_star_g(&pg->key.addr)))
260 return;
261
262 mp = br_mdb_ip_get(br, &pg->key.addr);
263 if (!mp)
264 return;
265
266 memset(&sg_ip, 0, sizeof(sg_ip));
267 sg_ip = pg->key.addr;
268 for (pg_lst = mlock_dereference(mp->ports, br);
269 pg_lst;
270 pg_lst = mlock_dereference(pg_lst->next, br)) {
271 struct net_bridge_group_src *src_ent;
272
273 if (pg_lst == pg)
274 continue;
275 hlist_for_each_entry(src_ent, &pg_lst->src_list, node) {
276 if (!(src_ent->flags & BR_SGRP_F_INSTALLED))
277 continue;
278 sg_ip.src = src_ent->addr.src;
279 switch (filter_mode) {
280 case MCAST_INCLUDE:
281 __fwd_del_star_excl(pg, &sg_ip);
282 break;
283 case MCAST_EXCLUDE:
284 __fwd_add_star_excl(pg, &sg_ip);
285 break;
286 }
287 }
288 }
289}
290
094b82fd
NA
291/* called when adding a new S,G with host_joined == false by default */
292static void br_multicast_sg_host_state(struct net_bridge_mdb_entry *star_mp,
293 struct net_bridge_port_group *sg)
294{
295 struct net_bridge_mdb_entry *sg_mp;
296
297 if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
298 return;
299 if (!star_mp->host_joined)
300 return;
301
302 sg_mp = br_mdb_ip_get(star_mp->br, &sg->key.addr);
303 if (!sg_mp)
304 return;
305 sg_mp->host_joined = true;
306}
307
308/* set the host_joined state of all of *,G's S,G entries */
309static void br_multicast_star_g_host_state(struct net_bridge_mdb_entry *star_mp)
310{
311 struct net_bridge *br = star_mp->br;
312 struct net_bridge_mdb_entry *sg_mp;
313 struct net_bridge_port_group *pg;
314 struct br_ip sg_ip;
315
316 if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
317 return;
318
319 memset(&sg_ip, 0, sizeof(sg_ip));
320 sg_ip = star_mp->addr;
321 for (pg = mlock_dereference(star_mp->ports, br);
322 pg;
323 pg = mlock_dereference(pg->next, br)) {
324 struct net_bridge_group_src *src_ent;
325
326 hlist_for_each_entry(src_ent, &pg->src_list, node) {
327 if (!(src_ent->flags & BR_SGRP_F_INSTALLED))
328 continue;
329 sg_ip.src = src_ent->addr.src;
330 sg_mp = br_mdb_ip_get(br, &sg_ip);
331 if (!sg_mp)
332 continue;
333 sg_mp->host_joined = star_mp->host_joined;
334 }
335 }
336}
337
8266a049
NA
338static void br_multicast_sg_del_exclude_ports(struct net_bridge_mdb_entry *sgmp)
339{
340 struct net_bridge_port_group __rcu **pp;
341 struct net_bridge_port_group *p;
342
343 /* *,G exclude ports are only added to S,G entries */
344 if (WARN_ON(br_multicast_is_star_g(&sgmp->addr)))
345 return;
346
347 /* we need the STAR_EXCLUDE ports if there are non-STAR_EXCLUDE ports
348 * we should ignore perm entries since they're managed by user-space
349 */
350 for (pp = &sgmp->ports;
351 (p = mlock_dereference(*pp, sgmp->br)) != NULL;
352 pp = &p->next)
353 if (!(p->flags & (MDB_PG_FLAGS_STAR_EXCL |
354 MDB_PG_FLAGS_PERMANENT)))
355 return;
356
094b82fd
NA
357 /* currently the host can only have joined the *,G which means
358 * we treat it as EXCLUDE {}, so for an S,G it's considered a
359 * STAR_EXCLUDE entry and we can safely leave it
360 */
361 sgmp->host_joined = false;
362
8266a049
NA
363 for (pp = &sgmp->ports;
364 (p = mlock_dereference(*pp, sgmp->br)) != NULL;) {
365 if (!(p->flags & MDB_PG_FLAGS_PERMANENT))
366 br_multicast_del_pg(sgmp, p, pp);
367 else
368 pp = &p->next;
369 }
370}
371
372void br_multicast_sg_add_exclude_ports(struct net_bridge_mdb_entry *star_mp,
373 struct net_bridge_port_group *sg)
374{
375 struct net_bridge_port_group_sg_key sg_key;
376 struct net_bridge *br = star_mp->br;
377 struct net_bridge_port_group *pg;
378
379 if (WARN_ON(br_multicast_is_star_g(&sg->key.addr)))
380 return;
381 if (WARN_ON(!br_multicast_is_star_g(&star_mp->addr)))
382 return;
383
094b82fd 384 br_multicast_sg_host_state(star_mp, sg);
8266a049
NA
385 memset(&sg_key, 0, sizeof(sg_key));
386 sg_key.addr = sg->key.addr;
387 /* we need to add all exclude ports to the S,G */
388 for (pg = mlock_dereference(star_mp->ports, br);
389 pg;
390 pg = mlock_dereference(pg->next, br)) {
391 struct net_bridge_port_group *src_pg;
392
393 if (pg == sg || pg->filter_mode == MCAST_INCLUDE)
394 continue;
395
396 sg_key.port = pg->key.port;
397 if (br_sg_port_find(br, &sg_key))
398 continue;
399
400 src_pg = __br_multicast_add_group(br, pg->key.port,
401 &sg->key.addr,
402 sg->eth_addr,
9116ffbf 403 MCAST_INCLUDE, false, false);
8266a049
NA
404 if (IS_ERR_OR_NULL(src_pg) ||
405 src_pg->rt_protocol != RTPROT_KERNEL)
406 continue;
407 src_pg->flags |= MDB_PG_FLAGS_STAR_EXCL;
408 }
409}
410
b0812368
NA
411static void br_multicast_fwd_src_add(struct net_bridge_group_src *src)
412{
8266a049 413 struct net_bridge_mdb_entry *star_mp;
b0812368
NA
414 struct net_bridge_port_group *sg;
415 struct br_ip sg_ip;
416
417 if (src->flags & BR_SGRP_F_INSTALLED)
418 return;
419
420 memset(&sg_ip, 0, sizeof(sg_ip));
421 sg_ip = src->pg->key.addr;
422 sg_ip.src = src->addr.src;
423 sg = __br_multicast_add_group(src->br, src->pg->key.port, &sg_ip,
9116ffbf
NA
424 src->pg->eth_addr, MCAST_INCLUDE, false,
425 !timer_pending(&src->timer));
b0812368
NA
426 if (IS_ERR_OR_NULL(sg))
427 return;
428 src->flags |= BR_SGRP_F_INSTALLED;
8266a049 429 sg->flags &= ~MDB_PG_FLAGS_STAR_EXCL;
b0812368
NA
430
431 /* if it was added by user-space as perm we can skip next steps */
432 if (sg->rt_protocol != RTPROT_KERNEL &&
433 (sg->flags & MDB_PG_FLAGS_PERMANENT))
434 return;
435
436 /* the kernel is now responsible for removing this S,G */
437 del_timer(&sg->timer);
8266a049
NA
438 star_mp = br_mdb_ip_get(src->br, &src->pg->key.addr);
439 if (!star_mp)
440 return;
441
442 br_multicast_sg_add_exclude_ports(star_mp, sg);
b0812368
NA
443}
444
445static void br_multicast_fwd_src_remove(struct net_bridge_group_src *src)
446{
447 struct net_bridge_port_group *p, *pg = src->pg;
448 struct net_bridge_port_group __rcu **pp;
449 struct net_bridge_mdb_entry *mp;
450 struct br_ip sg_ip;
451
452 memset(&sg_ip, 0, sizeof(sg_ip));
453 sg_ip = pg->key.addr;
454 sg_ip.src = src->addr.src;
455
456 mp = br_mdb_ip_get(src->br, &sg_ip);
457 if (!mp)
458 return;
459
460 for (pp = &mp->ports;
461 (p = mlock_dereference(*pp, src->br)) != NULL;
462 pp = &p->next) {
463 if (!br_port_group_equal(p, pg->key.port, pg->eth_addr))
464 continue;
465
466 if (p->rt_protocol != RTPROT_KERNEL &&
467 (p->flags & MDB_PG_FLAGS_PERMANENT))
468 break;
469
470 br_multicast_del_pg(mp, p, pp);
471 break;
472 }
473 src->flags &= ~BR_SGRP_F_INSTALLED;
474}
475
9116ffbf 476/* install S,G and based on src's timer enable or disable forwarding */
b0812368
NA
477static void br_multicast_fwd_src_handle(struct net_bridge_group_src *src)
478{
9116ffbf
NA
479 struct net_bridge_port_group_sg_key sg_key;
480 struct net_bridge_port_group *sg;
481 u8 old_flags;
482
b0812368 483 br_multicast_fwd_src_add(src);
9116ffbf
NA
484
485 memset(&sg_key, 0, sizeof(sg_key));
486 sg_key.addr = src->pg->key.addr;
487 sg_key.addr.src = src->addr.src;
488 sg_key.port = src->pg->key.port;
489
490 sg = br_sg_port_find(src->br, &sg_key);
491 if (!sg || (sg->flags & MDB_PG_FLAGS_PERMANENT))
492 return;
493
494 old_flags = sg->flags;
495 if (timer_pending(&src->timer))
496 sg->flags &= ~MDB_PG_FLAGS_BLOCKED;
497 else
498 sg->flags |= MDB_PG_FLAGS_BLOCKED;
499
500 if (old_flags != sg->flags) {
501 struct net_bridge_mdb_entry *sg_mp;
502
503 sg_mp = br_mdb_ip_get(src->br, &sg_key.addr);
504 if (!sg_mp)
505 return;
506 br_mdb_notify(src->br->dev, sg_mp, sg, RTM_NEWMDB);
507 }
b0812368
NA
508}
509
e12cec65
NA
510static void br_multicast_destroy_mdb_entry(struct net_bridge_mcast_gc *gc)
511{
512 struct net_bridge_mdb_entry *mp;
513
514 mp = container_of(gc, struct net_bridge_mdb_entry, mcast_gc);
515 WARN_ON(!hlist_unhashed(&mp->mdb_node));
516 WARN_ON(mp->ports);
517
518 del_timer_sync(&mp->timer);
519 kfree_rcu(mp, rcu);
520}
521
522static void br_multicast_del_mdb_entry(struct net_bridge_mdb_entry *mp)
523{
524 struct net_bridge *br = mp->br;
525
526 rhashtable_remove_fast(&br->mdb_hash_tbl, &mp->rhnode,
527 br_mdb_rht_params);
528 hlist_del_init_rcu(&mp->mdb_node);
529 hlist_add_head(&mp->mcast_gc.gc_node, &br->mcast_gc_list);
530 queue_work(system_long_wq, &br->mcast_gc_work);
531}
532
88c1f37f 533static void br_multicast_group_expired(struct timer_list *t)
eb1d1641 534{
88c1f37f 535 struct net_bridge_mdb_entry *mp = from_timer(mp, t, timer);
eb1d1641 536 struct net_bridge *br = mp->br;
eb1d1641
HX
537
538 spin_lock(&br->multicast_lock);
b0812368
NA
539 if (hlist_unhashed(&mp->mdb_node) || !netif_running(br->dev) ||
540 timer_pending(&mp->timer))
eb1d1641
HX
541 goto out;
542
1bc844ee 543 br_multicast_host_leave(mp, true);
eb1d1641
HX
544
545 if (mp->ports)
546 goto out;
e12cec65
NA
547 br_multicast_del_mdb_entry(mp);
548out:
549 spin_unlock(&br->multicast_lock);
550}
eb1d1641 551
e12cec65
NA
552static void br_multicast_destroy_group_src(struct net_bridge_mcast_gc *gc)
553{
554 struct net_bridge_group_src *src;
eb1d1641 555
e12cec65
NA
556 src = container_of(gc, struct net_bridge_group_src, mcast_gc);
557 WARN_ON(!hlist_unhashed(&src->node));
eb1d1641 558
e12cec65
NA
559 del_timer_sync(&src->timer);
560 kfree_rcu(src, rcu);
eb1d1641
HX
561}
562
474ddb37 563void br_multicast_del_group_src(struct net_bridge_group_src *src)
8b671779 564{
085b53c8 565 struct net_bridge *br = src->pg->key.port->br;
8b671779 566
b0812368 567 br_multicast_fwd_src_remove(src);
8b671779
NA
568 hlist_del_init_rcu(&src->node);
569 src->pg->src_ents--;
e12cec65
NA
570 hlist_add_head(&src->mcast_gc.gc_node, &br->mcast_gc_list);
571 queue_work(system_long_wq, &br->mcast_gc_work);
572}
573
574static void br_multicast_destroy_port_group(struct net_bridge_mcast_gc *gc)
575{
576 struct net_bridge_port_group *pg;
577
578 pg = container_of(gc, struct net_bridge_port_group, mcast_gc);
579 WARN_ON(!hlist_unhashed(&pg->mglist));
580 WARN_ON(!hlist_empty(&pg->src_list));
581
582 del_timer_sync(&pg->rexmit_timer);
583 del_timer_sync(&pg->timer);
584 kfree_rcu(pg, rcu);
8b671779
NA
585}
586
681590bd
NA
587void br_multicast_del_pg(struct net_bridge_mdb_entry *mp,
588 struct net_bridge_port_group *pg,
589 struct net_bridge_port_group __rcu **pp)
590{
085b53c8 591 struct net_bridge *br = pg->key.port->br;
8b671779
NA
592 struct net_bridge_group_src *ent;
593 struct hlist_node *tmp;
681590bd
NA
594
595 rcu_assign_pointer(*pp, pg->next);
596 hlist_del_init(&pg->mglist);
baa74d39 597 br_multicast_eht_clean_sets(pg);
8b671779
NA
598 hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node)
599 br_multicast_del_group_src(ent);
81f19838 600 br_mdb_notify(br->dev, mp, pg, RTM_DELMDB);
74705582
NA
601 if (!br_multicast_is_star_g(&mp->addr)) {
602 rhashtable_remove_fast(&br->sg_port_tbl, &pg->rhnode,
603 br_sg_port_rht_params);
8266a049 604 br_multicast_sg_del_exclude_ports(mp);
74705582 605 } else {
8266a049 606 br_multicast_star_g_handle_mode(pg, MCAST_INCLUDE);
74705582 607 }
e12cec65
NA
608 hlist_add_head(&pg->mcast_gc.gc_node, &br->mcast_gc_list);
609 queue_work(system_long_wq, &br->mcast_gc_work);
681590bd
NA
610
611 if (!mp->ports && !mp->host_joined && netif_running(br->dev))
612 mod_timer(&mp->timer, jiffies);
613}
614
615static void br_multicast_find_del_pg(struct net_bridge *br,
616 struct net_bridge_port_group *pg)
eb1d1641 617{
8b671779 618 struct net_bridge_port_group __rcu **pp;
eb1d1641
HX
619 struct net_bridge_mdb_entry *mp;
620 struct net_bridge_port_group *p;
e8051688 621
085b53c8 622 mp = br_mdb_ip_get(br, &pg->key.addr);
eb1d1641
HX
623 if (WARN_ON(!mp))
624 return;
625
e8051688
ED
626 for (pp = &mp->ports;
627 (p = mlock_dereference(*pp, br)) != NULL;
628 pp = &p->next) {
eb1d1641
HX
629 if (p != pg)
630 continue;
631
681590bd 632 br_multicast_del_pg(mp, pg, pp);
eb1d1641
HX
633 return;
634 }
635
636 WARN_ON(1);
637}
638
88c1f37f 639static void br_multicast_port_group_expired(struct timer_list *t)
eb1d1641 640{
88c1f37f 641 struct net_bridge_port_group *pg = from_timer(pg, t, timer);
d6c33d67 642 struct net_bridge_group_src *src_ent;
085b53c8 643 struct net_bridge *br = pg->key.port->br;
d6c33d67
NA
644 struct hlist_node *tmp;
645 bool changed;
eb1d1641
HX
646
647 spin_lock(&br->multicast_lock);
648 if (!netif_running(br->dev) || timer_pending(&pg->timer) ||
9d06b6d8 649 hlist_unhashed(&pg->mglist) || pg->flags & MDB_PG_FLAGS_PERMANENT)
eb1d1641
HX
650 goto out;
651
d6c33d67
NA
652 changed = !!(pg->filter_mode == MCAST_EXCLUDE);
653 pg->filter_mode = MCAST_INCLUDE;
654 hlist_for_each_entry_safe(src_ent, tmp, &pg->src_list, node) {
655 if (!timer_pending(&src_ent->timer)) {
656 br_multicast_del_group_src(src_ent);
657 changed = true;
658 }
659 }
660
661 if (hlist_empty(&pg->src_list)) {
662 br_multicast_find_del_pg(br, pg);
663 } else if (changed) {
085b53c8 664 struct net_bridge_mdb_entry *mp = br_mdb_ip_get(br, &pg->key.addr);
eb1d1641 665
8266a049
NA
666 if (changed && br_multicast_is_star_g(&pg->key.addr))
667 br_multicast_star_g_handle_mode(pg, MCAST_INCLUDE);
668
d6c33d67
NA
669 if (WARN_ON(!mp))
670 goto out;
671 br_mdb_notify(br->dev, mp, pg, RTM_NEWMDB);
672 }
eb1d1641
HX
673out:
674 spin_unlock(&br->multicast_lock);
675}
676
e12cec65
NA
677static void br_multicast_gc(struct hlist_head *head)
678{
679 struct net_bridge_mcast_gc *gcent;
680 struct hlist_node *tmp;
681
682 hlist_for_each_entry_safe(gcent, tmp, head, gc_node) {
683 hlist_del_init(&gcent->gc_node);
684 gcent->destroy(gcent);
685 }
686}
687
8ef2a9a5 688static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br,
438ef2d0
NA
689 struct net_bridge_port_group *pg,
690 __be32 ip_dst, __be32 group,
691 bool with_srcs, bool over_lmqt,
42c11ccf
NA
692 u8 sflag, u8 *igmp_type,
693 bool *need_rexmit)
eb1d1641 694{
085b53c8 695 struct net_bridge_port *p = pg ? pg->key.port : NULL;
438ef2d0
NA
696 struct net_bridge_group_src *ent;
697 size_t pkt_size, igmp_hdr_size;
698 unsigned long now = jiffies;
5e923585 699 struct igmpv3_query *ihv3;
438ef2d0
NA
700 void *csum_start = NULL;
701 __sum16 *csum = NULL;
eb1d1641
HX
702 struct sk_buff *skb;
703 struct igmphdr *ih;
704 struct ethhdr *eth;
438ef2d0 705 unsigned long lmqt;
eb1d1641 706 struct iphdr *iph;
438ef2d0 707 u16 lmqt_srcs = 0;
eb1d1641 708
5e923585 709 igmp_hdr_size = sizeof(*ih);
438ef2d0 710 if (br->multicast_igmp_version == 3) {
5e923585 711 igmp_hdr_size = sizeof(*ihv3);
438ef2d0
NA
712 if (pg && with_srcs) {
713 lmqt = now + (br->multicast_last_member_interval *
714 br->multicast_last_member_count);
715 hlist_for_each_entry(ent, &pg->src_list, node) {
716 if (over_lmqt == time_after(ent->timer.expires,
717 lmqt) &&
718 ent->src_query_rexmit_cnt > 0)
719 lmqt_srcs++;
720 }
721
722 if (!lmqt_srcs)
723 return NULL;
724 igmp_hdr_size += lmqt_srcs * sizeof(__be32);
725 }
726 }
727
728 pkt_size = sizeof(*eth) + sizeof(*iph) + 4 + igmp_hdr_size;
729 if ((p && pkt_size > p->dev->mtu) ||
730 pkt_size > br->dev->mtu)
731 return NULL;
732
733 skb = netdev_alloc_skb_ip_align(br->dev, pkt_size);
eb1d1641
HX
734 if (!skb)
735 goto out;
736
737 skb->protocol = htons(ETH_P_IP);
738
739 skb_reset_mac_header(skb);
740 eth = eth_hdr(skb);
741
e5a727f6 742 ether_addr_copy(eth->h_source, br->dev->dev_addr);
438ef2d0 743 ip_eth_mc_map(ip_dst, eth->h_dest);
eb1d1641
HX
744 eth->h_proto = htons(ETH_P_IP);
745 skb_put(skb, sizeof(*eth));
746
747 skb_set_network_header(skb, skb->len);
748 iph = ip_hdr(skb);
438ef2d0 749 iph->tot_len = htons(pkt_size - sizeof(*eth));
eb1d1641
HX
750
751 iph->version = 4;
752 iph->ihl = 6;
753 iph->tos = 0xc0;
eb1d1641
HX
754 iph->id = 0;
755 iph->frag_off = htons(IP_DF);
756 iph->ttl = 1;
757 iph->protocol = IPPROTO_IGMP;
675779ad 758 iph->saddr = br_opt_get(br, BROPT_MULTICAST_QUERY_USE_IFADDR) ?
1c8ad5bf 759 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0;
438ef2d0 760 iph->daddr = ip_dst;
eb1d1641
HX
761 ((u8 *)&iph[1])[0] = IPOPT_RA;
762 ((u8 *)&iph[1])[1] = 4;
763 ((u8 *)&iph[1])[2] = 0;
764 ((u8 *)&iph[1])[3] = 0;
765 ip_send_check(iph);
766 skb_put(skb, 24);
767
768 skb_set_transport_header(skb, skb->len);
1080ab95 769 *igmp_type = IGMP_HOST_MEMBERSHIP_QUERY;
eb1d1641 770
5e923585
NA
771 switch (br->multicast_igmp_version) {
772 case 2:
773 ih = igmp_hdr(skb);
774 ih->type = IGMP_HOST_MEMBERSHIP_QUERY;
775 ih->code = (group ? br->multicast_last_member_interval :
776 br->multicast_query_response_interval) /
777 (HZ / IGMP_TIMER_SCALE);
778 ih->group = group;
779 ih->csum = 0;
438ef2d0
NA
780 csum = &ih->csum;
781 csum_start = (void *)ih;
5e923585
NA
782 break;
783 case 3:
784 ihv3 = igmpv3_query_hdr(skb);
785 ihv3->type = IGMP_HOST_MEMBERSHIP_QUERY;
786 ihv3->code = (group ? br->multicast_last_member_interval :
787 br->multicast_query_response_interval) /
788 (HZ / IGMP_TIMER_SCALE);
789 ihv3->group = group;
790 ihv3->qqic = br->multicast_query_interval / HZ;
438ef2d0 791 ihv3->nsrcs = htons(lmqt_srcs);
5e923585 792 ihv3->resv = 0;
438ef2d0 793 ihv3->suppress = sflag;
5e923585
NA
794 ihv3->qrv = 2;
795 ihv3->csum = 0;
438ef2d0
NA
796 csum = &ihv3->csum;
797 csum_start = (void *)ihv3;
798 if (!pg || !with_srcs)
799 break;
800
801 lmqt_srcs = 0;
802 hlist_for_each_entry(ent, &pg->src_list, node) {
803 if (over_lmqt == time_after(ent->timer.expires,
804 lmqt) &&
805 ent->src_query_rexmit_cnt > 0) {
deb96566 806 ihv3->srcs[lmqt_srcs++] = ent->addr.src.ip4;
438ef2d0 807 ent->src_query_rexmit_cnt--;
42c11ccf
NA
808 if (need_rexmit && ent->src_query_rexmit_cnt)
809 *need_rexmit = true;
438ef2d0
NA
810 }
811 }
812 if (WARN_ON(lmqt_srcs != ntohs(ihv3->nsrcs))) {
813 kfree_skb(skb);
814 return NULL;
815 }
5e923585
NA
816 break;
817 }
818
438ef2d0
NA
819 if (WARN_ON(!csum || !csum_start)) {
820 kfree_skb(skb);
821 return NULL;
822 }
823
824 *csum = ip_compute_csum(csum_start, igmp_hdr_size);
5e923585 825 skb_put(skb, igmp_hdr_size);
eb1d1641
HX
826 __skb_pull(skb, sizeof(*eth));
827
828out:
829 return skb;
830}
831
dfd56b8b 832#if IS_ENABLED(CONFIG_IPV6)
08b202b6 833static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
438ef2d0
NA
834 struct net_bridge_port_group *pg,
835 const struct in6_addr *ip6_dst,
836 const struct in6_addr *group,
837 bool with_srcs, bool over_llqt,
42c11ccf
NA
838 u8 sflag, u8 *igmp_type,
839 bool *need_rexmit)
08b202b6 840{
085b53c8 841 struct net_bridge_port *p = pg ? pg->key.port : NULL;
438ef2d0
NA
842 struct net_bridge_group_src *ent;
843 size_t pkt_size, mld_hdr_size;
844 unsigned long now = jiffies;
aa2ae3e7 845 struct mld2_query *mld2q;
438ef2d0 846 void *csum_start = NULL;
aa2ae3e7 847 unsigned long interval;
438ef2d0 848 __sum16 *csum = NULL;
08b202b6
YH
849 struct ipv6hdr *ip6h;
850 struct mld_msg *mldq;
aa2ae3e7 851 struct sk_buff *skb;
438ef2d0 852 unsigned long llqt;
08b202b6 853 struct ethhdr *eth;
438ef2d0 854 u16 llqt_srcs = 0;
08b202b6 855 u8 *hopopt;
08b202b6 856
aa2ae3e7 857 mld_hdr_size = sizeof(*mldq);
438ef2d0 858 if (br->multicast_mld_version == 2) {
aa2ae3e7 859 mld_hdr_size = sizeof(*mld2q);
438ef2d0
NA
860 if (pg && with_srcs) {
861 llqt = now + (br->multicast_last_member_interval *
862 br->multicast_last_member_count);
863 hlist_for_each_entry(ent, &pg->src_list, node) {
864 if (over_llqt == time_after(ent->timer.expires,
865 llqt) &&
866 ent->src_query_rexmit_cnt > 0)
867 llqt_srcs++;
868 }
869
870 if (!llqt_srcs)
871 return NULL;
872 mld_hdr_size += llqt_srcs * sizeof(struct in6_addr);
873 }
874 }
875
876 pkt_size = sizeof(*eth) + sizeof(*ip6h) + 8 + mld_hdr_size;
877 if ((p && pkt_size > p->dev->mtu) ||
878 pkt_size > br->dev->mtu)
879 return NULL;
880
881 skb = netdev_alloc_skb_ip_align(br->dev, pkt_size);
08b202b6
YH
882 if (!skb)
883 goto out;
884
885 skb->protocol = htons(ETH_P_IPV6);
886
887 /* Ethernet header */
888 skb_reset_mac_header(skb);
889 eth = eth_hdr(skb);
890
e5a727f6 891 ether_addr_copy(eth->h_source, br->dev->dev_addr);
08b202b6
YH
892 eth->h_proto = htons(ETH_P_IPV6);
893 skb_put(skb, sizeof(*eth));
894
895 /* IPv6 header + HbH option */
896 skb_set_network_header(skb, skb->len);
897 ip6h = ipv6_hdr(skb);
898
899 *(__force __be32 *)ip6h = htonl(0x60000000);
aa2ae3e7 900 ip6h->payload_len = htons(8 + mld_hdr_size);
08b202b6
YH
901 ip6h->nexthdr = IPPROTO_HOPOPTS;
902 ip6h->hop_limit = 1;
438ef2d0 903 ip6h->daddr = *ip6_dst;
d1d81d4c
UW
904 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0,
905 &ip6h->saddr)) {
906 kfree_skb(skb);
675779ad 907 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, false);
d1d81d4c
UW
908 return NULL;
909 }
0888d5f3 910
675779ad 911 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true);
36cff5a1 912 ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest);
08b202b6
YH
913
914 hopopt = (u8 *)(ip6h + 1);
915 hopopt[0] = IPPROTO_ICMPV6; /* next hdr */
916 hopopt[1] = 0; /* length of HbH */
917 hopopt[2] = IPV6_TLV_ROUTERALERT; /* Router Alert */
918 hopopt[3] = 2; /* Length of RA Option */
919 hopopt[4] = 0; /* Type = 0x0000 (MLD) */
920 hopopt[5] = 0;
1de5a71c
EZ
921 hopopt[6] = IPV6_TLV_PAD1; /* Pad1 */
922 hopopt[7] = IPV6_TLV_PAD1; /* Pad1 */
08b202b6
YH
923
924 skb_put(skb, sizeof(*ip6h) + 8);
925
926 /* ICMPv6 */
927 skb_set_transport_header(skb, skb->len);
438ef2d0 928 interval = ipv6_addr_any(group) ?
32de868c
LL
929 br->multicast_query_response_interval :
930 br->multicast_last_member_interval;
1080ab95 931 *igmp_type = ICMPV6_MGM_QUERY;
aa2ae3e7
NA
932 switch (br->multicast_mld_version) {
933 case 1:
934 mldq = (struct mld_msg *)icmp6_hdr(skb);
935 mldq->mld_type = ICMPV6_MGM_QUERY;
936 mldq->mld_code = 0;
937 mldq->mld_cksum = 0;
938 mldq->mld_maxdelay = htons((u16)jiffies_to_msecs(interval));
939 mldq->mld_reserved = 0;
438ef2d0
NA
940 mldq->mld_mca = *group;
941 csum = &mldq->mld_cksum;
942 csum_start = (void *)mldq;
aa2ae3e7
NA
943 break;
944 case 2:
945 mld2q = (struct mld2_query *)icmp6_hdr(skb);
53631a5f 946 mld2q->mld2q_mrc = htons((u16)jiffies_to_msecs(interval));
aa2ae3e7
NA
947 mld2q->mld2q_type = ICMPV6_MGM_QUERY;
948 mld2q->mld2q_code = 0;
949 mld2q->mld2q_cksum = 0;
950 mld2q->mld2q_resv1 = 0;
951 mld2q->mld2q_resv2 = 0;
438ef2d0 952 mld2q->mld2q_suppress = sflag;
aa2ae3e7 953 mld2q->mld2q_qrv = 2;
438ef2d0 954 mld2q->mld2q_nsrcs = htons(llqt_srcs);
aa2ae3e7 955 mld2q->mld2q_qqic = br->multicast_query_interval / HZ;
438ef2d0
NA
956 mld2q->mld2q_mca = *group;
957 csum = &mld2q->mld2q_cksum;
958 csum_start = (void *)mld2q;
959 if (!pg || !with_srcs)
960 break;
961
962 llqt_srcs = 0;
963 hlist_for_each_entry(ent, &pg->src_list, node) {
964 if (over_llqt == time_after(ent->timer.expires,
965 llqt) &&
966 ent->src_query_rexmit_cnt > 0) {
deb96566 967 mld2q->mld2q_srcs[llqt_srcs++] = ent->addr.src.ip6;
438ef2d0 968 ent->src_query_rexmit_cnt--;
42c11ccf
NA
969 if (need_rexmit && ent->src_query_rexmit_cnt)
970 *need_rexmit = true;
438ef2d0
NA
971 }
972 }
973 if (WARN_ON(llqt_srcs != ntohs(mld2q->mld2q_nsrcs))) {
974 kfree_skb(skb);
975 return NULL;
976 }
aa2ae3e7
NA
977 break;
978 }
08b202b6 979
438ef2d0
NA
980 if (WARN_ON(!csum || !csum_start)) {
981 kfree_skb(skb);
982 return NULL;
983 }
984
985 *csum = csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, mld_hdr_size,
986 IPPROTO_ICMPV6,
987 csum_partial(csum_start, mld_hdr_size, 0));
988 skb_put(skb, mld_hdr_size);
08b202b6
YH
989 __skb_pull(skb, sizeof(*eth));
990
991out:
992 return skb;
993}
994#endif
995
8ef2a9a5 996static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br,
438ef2d0
NA
997 struct net_bridge_port_group *pg,
998 struct br_ip *ip_dst,
999 struct br_ip *group,
1000 bool with_srcs, bool over_lmqt,
42c11ccf
NA
1001 u8 sflag, u8 *igmp_type,
1002 bool *need_rexmit)
8ef2a9a5 1003{
438ef2d0
NA
1004 __be32 ip4_dst;
1005
1006 switch (group->proto) {
8ef2a9a5 1007 case htons(ETH_P_IP):
eab3227b 1008 ip4_dst = ip_dst ? ip_dst->dst.ip4 : htonl(INADDR_ALLHOSTS_GROUP);
438ef2d0 1009 return br_ip4_multicast_alloc_query(br, pg,
eab3227b 1010 ip4_dst, group->dst.ip4,
438ef2d0 1011 with_srcs, over_lmqt,
42c11ccf
NA
1012 sflag, igmp_type,
1013 need_rexmit);
dfd56b8b 1014#if IS_ENABLED(CONFIG_IPV6)
438ef2d0
NA
1015 case htons(ETH_P_IPV6): {
1016 struct in6_addr ip6_dst;
1017
1018 if (ip_dst)
eab3227b 1019 ip6_dst = ip_dst->dst.ip6;
438ef2d0
NA
1020 else
1021 ipv6_addr_set(&ip6_dst, htonl(0xff020000), 0, 0,
1022 htonl(1));
1023
1024 return br_ip6_multicast_alloc_query(br, pg,
eab3227b 1025 &ip6_dst, &group->dst.ip6,
438ef2d0 1026 with_srcs, over_lmqt,
42c11ccf
NA
1027 sflag, igmp_type,
1028 need_rexmit);
438ef2d0 1029 }
08b202b6 1030#endif
8ef2a9a5
YH
1031 }
1032 return NULL;
1033}
1034
cfd56754 1035struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
5e923585 1036 struct br_ip *group)
eb1d1641 1037{
eb1d1641 1038 struct net_bridge_mdb_entry *mp;
4c0833bc 1039 int err;
eb1d1641 1040
19e3a9c9
NA
1041 mp = br_mdb_ip_get(br, group);
1042 if (mp)
1043 return mp;
eb1d1641 1044
19e3a9c9
NA
1045 if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) {
1046 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false);
1047 return ERR_PTR(-E2BIG);
eb1d1641
HX
1048 }
1049
1050 mp = kzalloc(sizeof(*mp), GFP_ATOMIC);
1051 if (unlikely(!mp))
4c0833bc 1052 return ERR_PTR(-ENOMEM);
eb1d1641
HX
1053
1054 mp->br = br;
8ef2a9a5 1055 mp->addr = *group;
e12cec65 1056 mp->mcast_gc.destroy = br_multicast_destroy_mdb_entry;
88c1f37f 1057 timer_setup(&mp->timer, br_multicast_group_expired, 0);
19e3a9c9
NA
1058 err = rhashtable_lookup_insert_fast(&br->mdb_hash_tbl, &mp->rhnode,
1059 br_mdb_rht_params);
1060 if (err) {
1061 kfree(mp);
1062 mp = ERR_PTR(err);
1063 } else {
1064 hlist_add_head_rcu(&mp->mdb_node, &br->mdb_list);
1065 }
1faabf2a 1066
eb1d1641
HX
1067 return mp;
1068}
1069
8b671779
NA
1070static void br_multicast_group_src_expired(struct timer_list *t)
1071{
1072 struct net_bridge_group_src *src = from_timer(src, t, timer);
1073 struct net_bridge_port_group *pg;
1074 struct net_bridge *br = src->br;
1075
1076 spin_lock(&br->multicast_lock);
1077 if (hlist_unhashed(&src->node) || !netif_running(br->dev) ||
1078 timer_pending(&src->timer))
1079 goto out;
1080
1081 pg = src->pg;
1082 if (pg->filter_mode == MCAST_INCLUDE) {
1083 br_multicast_del_group_src(src);
1084 if (!hlist_empty(&pg->src_list))
1085 goto out;
1086 br_multicast_find_del_pg(br, pg);
9116ffbf
NA
1087 } else {
1088 br_multicast_fwd_src_handle(src);
8b671779 1089 }
9116ffbf 1090
8b671779
NA
1091out:
1092 spin_unlock(&br->multicast_lock);
1093}
1094
474ddb37 1095struct net_bridge_group_src *
8b671779
NA
1096br_multicast_find_group_src(struct net_bridge_port_group *pg, struct br_ip *ip)
1097{
1098 struct net_bridge_group_src *ent;
1099
1100 switch (ip->proto) {
1101 case htons(ETH_P_IP):
1102 hlist_for_each_entry(ent, &pg->src_list, node)
deb96566 1103 if (ip->src.ip4 == ent->addr.src.ip4)
8b671779
NA
1104 return ent;
1105 break;
1106#if IS_ENABLED(CONFIG_IPV6)
1107 case htons(ETH_P_IPV6):
1108 hlist_for_each_entry(ent, &pg->src_list, node)
deb96566 1109 if (!ipv6_addr_cmp(&ent->addr.src.ip6, &ip->src.ip6))
8b671779
NA
1110 return ent;
1111 break;
1112#endif
1113 }
1114
1115 return NULL;
1116}
1117
1118static struct net_bridge_group_src *
1119br_multicast_new_group_src(struct net_bridge_port_group *pg, struct br_ip *src_ip)
1120{
1121 struct net_bridge_group_src *grp_src;
1122
1123 if (unlikely(pg->src_ents >= PG_SRC_ENT_LIMIT))
1124 return NULL;
1125
1126 switch (src_ip->proto) {
1127 case htons(ETH_P_IP):
deb96566
NA
1128 if (ipv4_is_zeronet(src_ip->src.ip4) ||
1129 ipv4_is_multicast(src_ip->src.ip4))
8b671779
NA
1130 return NULL;
1131 break;
1132#if IS_ENABLED(CONFIG_IPV6)
1133 case htons(ETH_P_IPV6):
deb96566
NA
1134 if (ipv6_addr_any(&src_ip->src.ip6) ||
1135 ipv6_addr_is_multicast(&src_ip->src.ip6))
8b671779
NA
1136 return NULL;
1137 break;
1138#endif
1139 }
1140
1141 grp_src = kzalloc(sizeof(*grp_src), GFP_ATOMIC);
1142 if (unlikely(!grp_src))
1143 return NULL;
1144
1145 grp_src->pg = pg;
085b53c8 1146 grp_src->br = pg->key.port->br;
8b671779 1147 grp_src->addr = *src_ip;
e12cec65 1148 grp_src->mcast_gc.destroy = br_multicast_destroy_group_src;
8b671779
NA
1149 timer_setup(&grp_src->timer, br_multicast_group_src_expired, 0);
1150
1151 hlist_add_head_rcu(&grp_src->node, &pg->src_list);
1152 pg->src_ents++;
1153
1154 return grp_src;
1155}
1156
cfd56754
CW
1157struct net_bridge_port_group *br_multicast_new_port_group(
1158 struct net_bridge_port *port,
1159 struct br_ip *group,
ccb1c31a 1160 struct net_bridge_port_group __rcu *next,
6db6f0ea 1161 unsigned char flags,
8b671779 1162 const unsigned char *src,
8f8cb77e
NA
1163 u8 filter_mode,
1164 u8 rt_protocol)
cfd56754
CW
1165{
1166 struct net_bridge_port_group *p;
1167
1168 p = kzalloc(sizeof(*p), GFP_ATOMIC);
1169 if (unlikely(!p))
1170 return NULL;
1171
085b53c8
NA
1172 p->key.addr = *group;
1173 p->key.port = port;
9d06b6d8 1174 p->flags = flags;
8b671779 1175 p->filter_mode = filter_mode;
8f8cb77e 1176 p->rt_protocol = rt_protocol;
5b163288 1177 p->eht_host_tree = RB_ROOT;
baa74d39 1178 p->eht_set_tree = RB_ROOT;
e12cec65 1179 p->mcast_gc.destroy = br_multicast_destroy_port_group;
8b671779 1180 INIT_HLIST_HEAD(&p->src_list);
085b53c8
NA
1181
1182 if (!br_multicast_is_star_g(group) &&
1183 rhashtable_lookup_insert_fast(&port->br->sg_port_tbl, &p->rhnode,
1184 br_sg_port_rht_params)) {
1185 kfree(p);
1186 return NULL;
1187 }
1188
eca2a43b 1189 rcu_assign_pointer(p->next, next);
88c1f37f 1190 timer_setup(&p->timer, br_multicast_port_group_expired, 0);
42c11ccf
NA
1191 timer_setup(&p->rexmit_timer, br_multicast_port_group_rexmit, 0);
1192 hlist_add_head(&p->mglist, &port->mglist);
6db6f0ea
FF
1193
1194 if (src)
1195 memcpy(p->eth_addr, src, ETH_ALEN);
1196 else
1bfe45f4 1197 eth_broadcast_addr(p->eth_addr);
6db6f0ea 1198
cfd56754
CW
1199 return p;
1200}
1201
1bc844ee
NA
1202void br_multicast_host_join(struct net_bridge_mdb_entry *mp, bool notify)
1203{
1204 if (!mp->host_joined) {
1205 mp->host_joined = true;
094b82fd
NA
1206 if (br_multicast_is_star_g(&mp->addr))
1207 br_multicast_star_g_host_state(mp);
1bc844ee 1208 if (notify)
81f19838 1209 br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB);
1bc844ee 1210 }
955062b0
NA
1211
1212 if (br_group_is_l2(&mp->addr))
1213 return;
1214
1bc844ee
NA
1215 mod_timer(&mp->timer, jiffies + mp->br->multicast_membership_interval);
1216}
1217
1218void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify)
1219{
1220 if (!mp->host_joined)
1221 return;
1222
1223 mp->host_joined = false;
094b82fd
NA
1224 if (br_multicast_is_star_g(&mp->addr))
1225 br_multicast_star_g_host_state(mp);
1bc844ee 1226 if (notify)
81f19838 1227 br_mdb_notify(mp->br->dev, mp, NULL, RTM_DELMDB);
1bc844ee
NA
1228}
1229
b0812368
NA
1230static struct net_bridge_port_group *
1231__br_multicast_add_group(struct net_bridge *br,
1232 struct net_bridge_port *port,
1233 struct br_ip *group,
1234 const unsigned char *src,
1235 u8 filter_mode,
9116ffbf
NA
1236 bool igmpv2_mldv1,
1237 bool blocked)
eb1d1641 1238{
e8051688 1239 struct net_bridge_port_group __rcu **pp;
b0812368 1240 struct net_bridge_port_group *p = NULL;
5e923585 1241 struct net_bridge_mdb_entry *mp;
454594f3 1242 unsigned long now = jiffies;
eb1d1641 1243
eb1d1641
HX
1244 if (!netif_running(br->dev) ||
1245 (port && port->state == BR_STATE_DISABLED))
1246 goto out;
1247
19e3a9c9 1248 mp = br_multicast_new_group(br, group);
4c0833bc 1249 if (IS_ERR(mp))
b0812368 1250 return ERR_PTR(PTR_ERR(mp));
eb1d1641
HX
1251
1252 if (!port) {
1bc844ee 1253 br_multicast_host_join(mp, true);
eb1d1641
HX
1254 goto out;
1255 }
1256
e8051688
ED
1257 for (pp = &mp->ports;
1258 (p = mlock_dereference(*pp, br)) != NULL;
1259 pp = &p->next) {
6db6f0ea 1260 if (br_port_group_equal(p, port, src))
454594f3 1261 goto found;
085b53c8 1262 if ((unsigned long)p->key.port < (unsigned long)port)
eb1d1641
HX
1263 break;
1264 }
1265
955062b0
NA
1266 p = br_multicast_new_port_group(port, group, *pp, 0, src,
1267 filter_mode, RTPROT_KERNEL);
b0812368
NA
1268 if (unlikely(!p)) {
1269 p = ERR_PTR(-ENOMEM);
1270 goto out;
1271 }
eb1d1641 1272 rcu_assign_pointer(*pp, p);
9116ffbf
NA
1273 if (blocked)
1274 p->flags |= MDB_PG_FLAGS_BLOCKED;
81f19838 1275 br_mdb_notify(br->dev, mp, p, RTM_NEWMDB);
eb1d1641 1276
454594f3 1277found:
0436862e
NA
1278 if (igmpv2_mldv1)
1279 mod_timer(&p->timer, now + br->multicast_membership_interval);
81f19838 1280
eb1d1641 1281out:
b0812368
NA
1282 return p;
1283}
1284
1285static int br_multicast_add_group(struct net_bridge *br,
1286 struct net_bridge_port *port,
1287 struct br_ip *group,
1288 const unsigned char *src,
1289 u8 filter_mode,
1290 bool igmpv2_mldv1)
1291{
1292 struct net_bridge_port_group *pg;
1293 int err;
eb1d1641 1294
b0812368
NA
1295 spin_lock(&br->multicast_lock);
1296 pg = __br_multicast_add_group(br, port, group, src, filter_mode,
9116ffbf 1297 igmpv2_mldv1, false);
b0812368
NA
1298 /* NULL is considered valid for host joined groups */
1299 err = IS_ERR(pg) ? PTR_ERR(pg) : 0;
eb1d1641 1300 spin_unlock(&br->multicast_lock);
b0812368 1301
eb1d1641
HX
1302 return err;
1303}
1304
8ef2a9a5
YH
1305static int br_ip4_multicast_add_group(struct net_bridge *br,
1306 struct net_bridge_port *port,
b0e9a30d 1307 __be32 group,
6db6f0ea 1308 __u16 vid,
8b671779
NA
1309 const unsigned char *src,
1310 bool igmpv2)
8ef2a9a5
YH
1311{
1312 struct br_ip br_group;
8b671779 1313 u8 filter_mode;
8ef2a9a5
YH
1314
1315 if (ipv4_is_local_multicast(group))
1316 return 0;
1317
1515a63f 1318 memset(&br_group, 0, sizeof(br_group));
eab3227b 1319 br_group.dst.ip4 = group;
8ef2a9a5 1320 br_group.proto = htons(ETH_P_IP);
b0e9a30d 1321 br_group.vid = vid;
8b671779 1322 filter_mode = igmpv2 ? MCAST_EXCLUDE : MCAST_INCLUDE;
8ef2a9a5 1323
0436862e
NA
1324 return br_multicast_add_group(br, port, &br_group, src, filter_mode,
1325 igmpv2);
8ef2a9a5
YH
1326}
1327
dfd56b8b 1328#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
1329static int br_ip6_multicast_add_group(struct net_bridge *br,
1330 struct net_bridge_port *port,
b0e9a30d 1331 const struct in6_addr *group,
6db6f0ea 1332 __u16 vid,
8b671779
NA
1333 const unsigned char *src,
1334 bool mldv1)
08b202b6
YH
1335{
1336 struct br_ip br_group;
8b671779 1337 u8 filter_mode;
08b202b6 1338
3c3769e6 1339 if (ipv6_addr_is_ll_all_nodes(group))
08b202b6
YH
1340 return 0;
1341
19e3a9c9 1342 memset(&br_group, 0, sizeof(br_group));
eab3227b 1343 br_group.dst.ip6 = *group;
9cc6e0c4 1344 br_group.proto = htons(ETH_P_IPV6);
b0e9a30d 1345 br_group.vid = vid;
8b671779 1346 filter_mode = mldv1 ? MCAST_EXCLUDE : MCAST_INCLUDE;
08b202b6 1347
0436862e
NA
1348 return br_multicast_add_group(br, port, &br_group, src, filter_mode,
1349 mldv1);
08b202b6
YH
1350}
1351#endif
1352
88c1f37f 1353static void br_multicast_router_expired(struct timer_list *t)
eb1d1641 1354{
88c1f37f
AP
1355 struct net_bridge_port *port =
1356 from_timer(port, t, multicast_router_timer);
eb1d1641
HX
1357 struct net_bridge *br = port->br;
1358
1359 spin_lock(&br->multicast_lock);
a55d8246
NA
1360 if (port->multicast_router == MDB_RTR_TYPE_DISABLED ||
1361 port->multicast_router == MDB_RTR_TYPE_PERM ||
f12e7d95 1362 timer_pending(&port->multicast_router_timer))
eb1d1641
HX
1363 goto out;
1364
f12e7d95 1365 __del_port_router(port);
eb1d1641
HX
1366out:
1367 spin_unlock(&br->multicast_lock);
1368}
1369
77041420
YG
1370static void br_mc_router_state_change(struct net_bridge *p,
1371 bool is_mc_router)
1372{
1373 struct switchdev_attr attr = {
1374 .orig_dev = p->dev,
1375 .id = SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
1376 .flags = SWITCHDEV_F_DEFER,
1377 .u.mrouter = is_mc_router,
1378 };
1379
1380 switchdev_port_attr_set(p->dev, &attr);
1381}
1382
88c1f37f 1383static void br_multicast_local_router_expired(struct timer_list *t)
eb1d1641 1384{
88c1f37f 1385 struct net_bridge *br = from_timer(br, t, multicast_router_timer);
77041420
YG
1386
1387 spin_lock(&br->multicast_lock);
1388 if (br->multicast_router == MDB_RTR_TYPE_DISABLED ||
1389 br->multicast_router == MDB_RTR_TYPE_PERM ||
1390 timer_pending(&br->multicast_router_timer))
1391 goto out;
1392
1393 br_mc_router_state_change(br, false);
1394out:
1395 spin_unlock(&br->multicast_lock);
eb1d1641
HX
1396}
1397
cc0fdd80 1398static void br_multicast_querier_expired(struct net_bridge *br,
90010b36 1399 struct bridge_mcast_own_query *query)
c83b8fab 1400{
c83b8fab 1401 spin_lock(&br->multicast_lock);
13cefad2 1402 if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED))
c83b8fab
HX
1403 goto out;
1404
cc0fdd80 1405 br_multicast_start_querier(br, query);
c83b8fab
HX
1406
1407out:
1408 spin_unlock(&br->multicast_lock);
1409}
1410
88c1f37f 1411static void br_ip4_multicast_querier_expired(struct timer_list *t)
cc0fdd80 1412{
88c1f37f 1413 struct net_bridge *br = from_timer(br, t, ip4_other_query.timer);
cc0fdd80 1414
90010b36 1415 br_multicast_querier_expired(br, &br->ip4_own_query);
cc0fdd80
LL
1416}
1417
1418#if IS_ENABLED(CONFIG_IPV6)
88c1f37f 1419static void br_ip6_multicast_querier_expired(struct timer_list *t)
cc0fdd80 1420{
88c1f37f 1421 struct net_bridge *br = from_timer(br, t, ip6_other_query.timer);
cc0fdd80 1422
90010b36 1423 br_multicast_querier_expired(br, &br->ip6_own_query);
cc0fdd80
LL
1424}
1425#endif
1426
dc4eb53a
LL
1427static void br_multicast_select_own_querier(struct net_bridge *br,
1428 struct br_ip *ip,
1429 struct sk_buff *skb)
1430{
1431 if (ip->proto == htons(ETH_P_IP))
deb96566 1432 br->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr;
dc4eb53a
LL
1433#if IS_ENABLED(CONFIG_IPV6)
1434 else
deb96566 1435 br->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr;
dc4eb53a
LL
1436#endif
1437}
1438
8ef2a9a5
YH
1439static void __br_multicast_send_query(struct net_bridge *br,
1440 struct net_bridge_port *port,
438ef2d0
NA
1441 struct net_bridge_port_group *pg,
1442 struct br_ip *ip_dst,
1443 struct br_ip *group,
1444 bool with_srcs,
42c11ccf
NA
1445 u8 sflag,
1446 bool *need_rexmit)
eb1d1641 1447{
438ef2d0 1448 bool over_lmqt = !!sflag;
eb1d1641 1449 struct sk_buff *skb;
1080ab95 1450 u8 igmp_type;
eb1d1641 1451
438ef2d0
NA
1452again_under_lmqt:
1453 skb = br_multicast_alloc_query(br, pg, ip_dst, group, with_srcs,
42c11ccf
NA
1454 over_lmqt, sflag, &igmp_type,
1455 need_rexmit);
eb1d1641 1456 if (!skb)
8ef2a9a5 1457 return;
eb1d1641
HX
1458
1459 if (port) {
eb1d1641 1460 skb->dev = port->dev;
a65056ec 1461 br_multicast_count(br, port, skb, igmp_type,
1080ab95 1462 BR_MCAST_DIR_TX);
29a26a56
EB
1463 NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT,
1464 dev_net(port->dev), NULL, skb, NULL, skb->dev,
f0b4eece 1465 br_dev_queue_push_xmit);
438ef2d0
NA
1466
1467 if (over_lmqt && with_srcs && sflag) {
1468 over_lmqt = false;
1469 goto again_under_lmqt;
1470 }
dc4eb53a 1471 } else {
438ef2d0 1472 br_multicast_select_own_querier(br, group, skb);
a65056ec 1473 br_multicast_count(br, port, skb, igmp_type,
1080ab95 1474 BR_MCAST_DIR_RX);
eb1d1641 1475 netif_rx(skb);
dc4eb53a 1476 }
8ef2a9a5
YH
1477}
1478
1479static void br_multicast_send_query(struct net_bridge *br,
cc0fdd80 1480 struct net_bridge_port *port,
90010b36 1481 struct bridge_mcast_own_query *own_query)
8ef2a9a5 1482{
90010b36 1483 struct bridge_mcast_other_query *other_query = NULL;
5e923585
NA
1484 struct br_ip br_group;
1485 unsigned long time;
8ef2a9a5 1486
13cefad2
NA
1487 if (!netif_running(br->dev) ||
1488 !br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
675779ad 1489 !br_opt_get(br, BROPT_MULTICAST_QUERIER))
8ef2a9a5
YH
1490 return;
1491
eab3227b 1492 memset(&br_group.dst, 0, sizeof(br_group.dst));
08b202b6 1493
90010b36
LL
1494 if (port ? (own_query == &port->ip4_own_query) :
1495 (own_query == &br->ip4_own_query)) {
1496 other_query = &br->ip4_other_query;
cc0fdd80 1497 br_group.proto = htons(ETH_P_IP);
dfd56b8b 1498#if IS_ENABLED(CONFIG_IPV6)
cc0fdd80 1499 } else {
90010b36 1500 other_query = &br->ip6_other_query;
cc0fdd80 1501 br_group.proto = htons(ETH_P_IPV6);
08b202b6 1502#endif
cc0fdd80
LL
1503 }
1504
90010b36 1505 if (!other_query || timer_pending(&other_query->timer))
cc0fdd80
LL
1506 return;
1507
42c11ccf
NA
1508 __br_multicast_send_query(br, port, NULL, NULL, &br_group, false, 0,
1509 NULL);
eb1d1641 1510
eb1d1641 1511 time = jiffies;
90010b36 1512 time += own_query->startup_sent < br->multicast_startup_query_count ?
eb1d1641
HX
1513 br->multicast_startup_query_interval :
1514 br->multicast_query_interval;
90010b36 1515 mod_timer(&own_query->timer, time);
eb1d1641
HX
1516}
1517
90010b36
LL
1518static void
1519br_multicast_port_query_expired(struct net_bridge_port *port,
1520 struct bridge_mcast_own_query *query)
eb1d1641 1521{
eb1d1641
HX
1522 struct net_bridge *br = port->br;
1523
1524 spin_lock(&br->multicast_lock);
02a780c0
DC
1525 if (port->state == BR_STATE_DISABLED ||
1526 port->state == BR_STATE_BLOCKING)
eb1d1641
HX
1527 goto out;
1528
cc0fdd80
LL
1529 if (query->startup_sent < br->multicast_startup_query_count)
1530 query->startup_sent++;
eb1d1641 1531
cc0fdd80 1532 br_multicast_send_query(port->br, port, query);
eb1d1641
HX
1533
1534out:
1535 spin_unlock(&br->multicast_lock);
1536}
1537
88c1f37f 1538static void br_ip4_multicast_port_query_expired(struct timer_list *t)
cc0fdd80 1539{
88c1f37f 1540 struct net_bridge_port *port = from_timer(port, t, ip4_own_query.timer);
cc0fdd80 1541
90010b36 1542 br_multicast_port_query_expired(port, &port->ip4_own_query);
cc0fdd80
LL
1543}
1544
1545#if IS_ENABLED(CONFIG_IPV6)
88c1f37f 1546static void br_ip6_multicast_port_query_expired(struct timer_list *t)
cc0fdd80 1547{
88c1f37f 1548 struct net_bridge_port *port = from_timer(port, t, ip6_own_query.timer);
cc0fdd80 1549
90010b36 1550 br_multicast_port_query_expired(port, &port->ip6_own_query);
cc0fdd80
LL
1551}
1552#endif
1553
42c11ccf
NA
1554static void br_multicast_port_group_rexmit(struct timer_list *t)
1555{
1556 struct net_bridge_port_group *pg = from_timer(pg, t, rexmit_timer);
1557 struct bridge_mcast_other_query *other_query = NULL;
085b53c8 1558 struct net_bridge *br = pg->key.port->br;
42c11ccf
NA
1559 bool need_rexmit = false;
1560
1561 spin_lock(&br->multicast_lock);
1562 if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
1563 !br_opt_get(br, BROPT_MULTICAST_ENABLED) ||
1564 !br_opt_get(br, BROPT_MULTICAST_QUERIER))
1565 goto out;
1566
085b53c8 1567 if (pg->key.addr.proto == htons(ETH_P_IP))
42c11ccf
NA
1568 other_query = &br->ip4_other_query;
1569#if IS_ENABLED(CONFIG_IPV6)
1570 else
1571 other_query = &br->ip6_other_query;
1572#endif
1573
1574 if (!other_query || timer_pending(&other_query->timer))
1575 goto out;
1576
1577 if (pg->grp_query_rexmit_cnt) {
1578 pg->grp_query_rexmit_cnt--;
085b53c8
NA
1579 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1580 &pg->key.addr, false, 1, NULL);
42c11ccf 1581 }
085b53c8
NA
1582 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1583 &pg->key.addr, true, 0, &need_rexmit);
42c11ccf
NA
1584
1585 if (pg->grp_query_rexmit_cnt || need_rexmit)
1586 mod_timer(&pg->rexmit_timer, jiffies +
1587 br->multicast_last_member_interval);
1588out:
1589 spin_unlock(&br->multicast_lock);
1590}
1591
147c1e9b
NF
1592static void br_mc_disabled_update(struct net_device *dev, bool value)
1593{
1594 struct switchdev_attr attr = {
1595 .orig_dev = dev,
1596 .id = SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
1597 .flags = SWITCHDEV_F_DEFER,
13cefad2 1598 .u.mc_disabled = !value,
147c1e9b
NF
1599 };
1600
1601 switchdev_port_attr_set(dev, &attr);
1602}
1603
1080ab95 1604int br_multicast_add_port(struct net_bridge_port *port)
eb1d1641 1605{
7f0aec7a 1606 port->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
eb1d1641 1607
88c1f37f
AP
1608 timer_setup(&port->multicast_router_timer,
1609 br_multicast_router_expired, 0);
1610 timer_setup(&port->ip4_own_query.timer,
1611 br_ip4_multicast_port_query_expired, 0);
cc0fdd80 1612#if IS_ENABLED(CONFIG_IPV6)
88c1f37f
AP
1613 timer_setup(&port->ip6_own_query.timer,
1614 br_ip6_multicast_port_query_expired, 0);
cc0fdd80 1615#endif
13cefad2
NA
1616 br_mc_disabled_update(port->dev,
1617 br_opt_get(port->br, BROPT_MULTICAST_ENABLED));
147c1e9b 1618
1080ab95
NA
1619 port->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats);
1620 if (!port->mcast_stats)
1621 return -ENOMEM;
1622
1623 return 0;
eb1d1641
HX
1624}
1625
1626void br_multicast_del_port(struct net_bridge_port *port)
1627{
e10177ab
SA
1628 struct net_bridge *br = port->br;
1629 struct net_bridge_port_group *pg;
e12cec65 1630 HLIST_HEAD(deleted_head);
e10177ab
SA
1631 struct hlist_node *n;
1632
1633 /* Take care of the remaining groups, only perm ones should be left */
1634 spin_lock_bh(&br->multicast_lock);
1635 hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
681590bd 1636 br_multicast_find_del_pg(br, pg);
e12cec65 1637 hlist_move_list(&br->mcast_gc_list, &deleted_head);
e10177ab 1638 spin_unlock_bh(&br->multicast_lock);
e12cec65 1639 br_multicast_gc(&deleted_head);
eb1d1641 1640 del_timer_sync(&port->multicast_router_timer);
1080ab95 1641 free_percpu(port->mcast_stats);
eb1d1641
HX
1642}
1643
90010b36 1644static void br_multicast_enable(struct bridge_mcast_own_query *query)
561f1103 1645{
cc0fdd80 1646 query->startup_sent = 0;
561f1103 1647
cc0fdd80
LL
1648 if (try_to_del_timer_sync(&query->timer) >= 0 ||
1649 del_timer(&query->timer))
1650 mod_timer(&query->timer, jiffies);
561f1103
HX
1651}
1652
7cb3f921 1653static void __br_multicast_enable_port(struct net_bridge_port *port)
eb1d1641
HX
1654{
1655 struct net_bridge *br = port->br;
1656
13cefad2 1657 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED) || !netif_running(br->dev))
7cb3f921 1658 return;
eb1d1641 1659
90010b36 1660 br_multicast_enable(&port->ip4_own_query);
cc0fdd80 1661#if IS_ENABLED(CONFIG_IPV6)
90010b36 1662 br_multicast_enable(&port->ip6_own_query);
cc0fdd80 1663#endif
7f0aec7a
NA
1664 if (port->multicast_router == MDB_RTR_TYPE_PERM &&
1665 hlist_unhashed(&port->rlist))
754bc547 1666 br_multicast_add_router(br, port);
7cb3f921 1667}
eb1d1641 1668
7cb3f921
NA
1669void br_multicast_enable_port(struct net_bridge_port *port)
1670{
1671 struct net_bridge *br = port->br;
1672
1673 spin_lock(&br->multicast_lock);
1674 __br_multicast_enable_port(port);
eb1d1641
HX
1675 spin_unlock(&br->multicast_lock);
1676}
1677
1678void br_multicast_disable_port(struct net_bridge_port *port)
1679{
1680 struct net_bridge *br = port->br;
1681 struct net_bridge_port_group *pg;
b67bfe0d 1682 struct hlist_node *n;
eb1d1641
HX
1683
1684 spin_lock(&br->multicast_lock);
b67bfe0d 1685 hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
9d06b6d8 1686 if (!(pg->flags & MDB_PG_FLAGS_PERMANENT))
681590bd 1687 br_multicast_find_del_pg(br, pg);
eb1d1641 1688
f12e7d95
NF
1689 __del_port_router(port);
1690
eb1d1641 1691 del_timer(&port->multicast_router_timer);
90010b36 1692 del_timer(&port->ip4_own_query.timer);
cc0fdd80 1693#if IS_ENABLED(CONFIG_IPV6)
90010b36 1694 del_timer(&port->ip6_own_query.timer);
cc0fdd80 1695#endif
eb1d1641
HX
1696 spin_unlock(&br->multicast_lock);
1697}
1698
e6231bca
NA
1699static int __grp_src_delete_marked(struct net_bridge_port_group *pg)
1700{
1701 struct net_bridge_group_src *ent;
1702 struct hlist_node *tmp;
1703 int deleted = 0;
1704
1705 hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node)
1706 if (ent->flags & BR_SGRP_F_DELETE) {
1707 br_multicast_del_group_src(ent);
1708 deleted++;
1709 }
1710
1711 return deleted;
1712}
1713
b0812368
NA
1714static void __grp_src_mod_timer(struct net_bridge_group_src *src,
1715 unsigned long expires)
1716{
1717 mod_timer(&src->timer, expires);
1718 br_multicast_fwd_src_handle(src);
1719}
1720
5bf1e00b
NA
1721static void __grp_src_query_marked_and_rexmit(struct net_bridge_port_group *pg)
1722{
1723 struct bridge_mcast_other_query *other_query = NULL;
085b53c8 1724 struct net_bridge *br = pg->key.port->br;
5bf1e00b
NA
1725 u32 lmqc = br->multicast_last_member_count;
1726 unsigned long lmqt, lmi, now = jiffies;
1727 struct net_bridge_group_src *ent;
1728
1729 if (!netif_running(br->dev) ||
1730 !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1731 return;
1732
085b53c8 1733 if (pg->key.addr.proto == htons(ETH_P_IP))
5bf1e00b
NA
1734 other_query = &br->ip4_other_query;
1735#if IS_ENABLED(CONFIG_IPV6)
1736 else
1737 other_query = &br->ip6_other_query;
1738#endif
1739
1740 lmqt = now + br_multicast_lmqt(br);
1741 hlist_for_each_entry(ent, &pg->src_list, node) {
1742 if (ent->flags & BR_SGRP_F_SEND) {
1743 ent->flags &= ~BR_SGRP_F_SEND;
1744 if (ent->timer.expires > lmqt) {
1745 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) &&
1746 other_query &&
1747 !timer_pending(&other_query->timer))
1748 ent->src_query_rexmit_cnt = lmqc;
b0812368 1749 __grp_src_mod_timer(ent, lmqt);
5bf1e00b
NA
1750 }
1751 }
1752 }
1753
1754 if (!br_opt_get(br, BROPT_MULTICAST_QUERIER) ||
1755 !other_query || timer_pending(&other_query->timer))
1756 return;
1757
085b53c8
NA
1758 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1759 &pg->key.addr, true, 1, NULL);
5bf1e00b
NA
1760
1761 lmi = now + br->multicast_last_member_interval;
1762 if (!timer_pending(&pg->rexmit_timer) ||
1763 time_after(pg->rexmit_timer.expires, lmi))
1764 mod_timer(&pg->rexmit_timer, lmi);
1765}
1766
1767static void __grp_send_query_and_rexmit(struct net_bridge_port_group *pg)
1768{
1769 struct bridge_mcast_other_query *other_query = NULL;
085b53c8 1770 struct net_bridge *br = pg->key.port->br;
5bf1e00b
NA
1771 unsigned long now = jiffies, lmi;
1772
1773 if (!netif_running(br->dev) ||
1774 !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1775 return;
1776
085b53c8 1777 if (pg->key.addr.proto == htons(ETH_P_IP))
5bf1e00b
NA
1778 other_query = &br->ip4_other_query;
1779#if IS_ENABLED(CONFIG_IPV6)
1780 else
1781 other_query = &br->ip6_other_query;
1782#endif
1783
1784 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) &&
1785 other_query && !timer_pending(&other_query->timer)) {
1786 lmi = now + br->multicast_last_member_interval;
1787 pg->grp_query_rexmit_cnt = br->multicast_last_member_count - 1;
085b53c8
NA
1788 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1789 &pg->key.addr, false, 0, NULL);
5bf1e00b
NA
1790 if (!timer_pending(&pg->rexmit_timer) ||
1791 time_after(pg->rexmit_timer.expires, lmi))
1792 mod_timer(&pg->rexmit_timer, lmi);
1793 }
1794
1795 if (pg->filter_mode == MCAST_EXCLUDE &&
1796 (!timer_pending(&pg->timer) ||
1797 time_after(pg->timer.expires, now + br_multicast_lmqt(br))))
1798 mod_timer(&pg->timer, now + br_multicast_lmqt(br));
1799}
1800
0436862e
NA
1801/* State Msg type New state Actions
1802 * INCLUDE (A) IS_IN (B) INCLUDE (A+B) (B)=GMI
1803 * INCLUDE (A) ALLOW (B) INCLUDE (A+B) (B)=GMI
1804 * EXCLUDE (X,Y) ALLOW (A) EXCLUDE (X+A,Y-A) (A)=GMI
1805 */
54bea721 1806static bool br_multicast_isinc_allow(struct net_bridge_port_group *pg, void *h_addr,
474ddb37
NA
1807 void *srcs, u32 nsrcs, size_t addr_size,
1808 int grec_type)
0436862e 1809{
085b53c8 1810 struct net_bridge *br = pg->key.port->br;
0436862e
NA
1811 struct net_bridge_group_src *ent;
1812 unsigned long now = jiffies;
1813 bool changed = false;
1814 struct br_ip src_ip;
1815 u32 src_idx;
1816
1817 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 1818 src_ip.proto = pg->key.addr.proto;
0436862e 1819 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 1820 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
0436862e
NA
1821 ent = br_multicast_find_group_src(pg, &src_ip);
1822 if (!ent) {
1823 ent = br_multicast_new_group_src(pg, &src_ip);
1824 if (ent)
1825 changed = true;
1826 }
1827
1828 if (ent)
b0812368 1829 __grp_src_mod_timer(ent, now + br_multicast_gmi(br));
0436862e
NA
1830 }
1831
474ddb37
NA
1832 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
1833 changed = true;
1834
0436862e
NA
1835 return changed;
1836}
1837
e6231bca
NA
1838/* State Msg type New state Actions
1839 * INCLUDE (A) IS_EX (B) EXCLUDE (A*B,B-A) (B-A)=0
1840 * Delete (A-B)
1841 * Group Timer=GMI
1842 */
54bea721 1843static void __grp_src_isexc_incl(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
1844 void *srcs, u32 nsrcs, size_t addr_size,
1845 int grec_type)
e6231bca
NA
1846{
1847 struct net_bridge_group_src *ent;
1848 struct br_ip src_ip;
1849 u32 src_idx;
1850
1851 hlist_for_each_entry(ent, &pg->src_list, node)
1852 ent->flags |= BR_SGRP_F_DELETE;
1853
1854 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 1855 src_ip.proto = pg->key.addr.proto;
e6231bca 1856 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 1857 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
e6231bca
NA
1858 ent = br_multicast_find_group_src(pg, &src_ip);
1859 if (ent)
1860 ent->flags &= ~BR_SGRP_F_DELETE;
1861 else
b0812368
NA
1862 ent = br_multicast_new_group_src(pg, &src_ip);
1863 if (ent)
1864 br_multicast_fwd_src_handle(ent);
e6231bca
NA
1865 }
1866
ddc255d9
NA
1867 br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type);
1868
e6231bca
NA
1869 __grp_src_delete_marked(pg);
1870}
1871
1872/* State Msg type New state Actions
1873 * EXCLUDE (X,Y) IS_EX (A) EXCLUDE (A-Y,Y*A) (A-X-Y)=GMI
1874 * Delete (X-A)
1875 * Delete (Y-A)
1876 * Group Timer=GMI
1877 */
54bea721 1878static bool __grp_src_isexc_excl(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
1879 void *srcs, u32 nsrcs, size_t addr_size,
1880 int grec_type)
e6231bca 1881{
085b53c8 1882 struct net_bridge *br = pg->key.port->br;
e6231bca
NA
1883 struct net_bridge_group_src *ent;
1884 unsigned long now = jiffies;
1885 bool changed = false;
1886 struct br_ip src_ip;
1887 u32 src_idx;
1888
1889 hlist_for_each_entry(ent, &pg->src_list, node)
1890 ent->flags |= BR_SGRP_F_DELETE;
1891
1892 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 1893 src_ip.proto = pg->key.addr.proto;
e6231bca 1894 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 1895 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
e6231bca
NA
1896 ent = br_multicast_find_group_src(pg, &src_ip);
1897 if (ent) {
1898 ent->flags &= ~BR_SGRP_F_DELETE;
1899 } else {
1900 ent = br_multicast_new_group_src(pg, &src_ip);
1901 if (ent) {
b0812368
NA
1902 __grp_src_mod_timer(ent,
1903 now + br_multicast_gmi(br));
e6231bca
NA
1904 changed = true;
1905 }
1906 }
e6231bca
NA
1907 }
1908
ddc255d9
NA
1909 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
1910 changed = true;
1911
e6231bca
NA
1912 if (__grp_src_delete_marked(pg))
1913 changed = true;
1914
1915 return changed;
1916}
1917
54bea721 1918static bool br_multicast_isexc(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
1919 void *srcs, u32 nsrcs, size_t addr_size,
1920 int grec_type)
e6231bca 1921{
085b53c8 1922 struct net_bridge *br = pg->key.port->br;
e6231bca
NA
1923 bool changed = false;
1924
1925 switch (pg->filter_mode) {
1926 case MCAST_INCLUDE:
ddc255d9
NA
1927 __grp_src_isexc_incl(pg, h_addr, srcs, nsrcs, addr_size,
1928 grec_type);
8266a049 1929 br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE);
e6231bca
NA
1930 changed = true;
1931 break;
1932 case MCAST_EXCLUDE:
ddc255d9
NA
1933 changed = __grp_src_isexc_excl(pg, h_addr, srcs, nsrcs, addr_size,
1934 grec_type);
e6231bca
NA
1935 break;
1936 }
1937
1938 pg->filter_mode = MCAST_EXCLUDE;
1939 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br));
1940
1941 return changed;
1942}
1943
5bf1e00b
NA
1944/* State Msg type New state Actions
1945 * INCLUDE (A) TO_IN (B) INCLUDE (A+B) (B)=GMI
1946 * Send Q(G,A-B)
1947 */
54bea721 1948static bool __grp_src_toin_incl(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
1949 void *srcs, u32 nsrcs, size_t addr_size,
1950 int grec_type)
5bf1e00b 1951{
085b53c8 1952 struct net_bridge *br = pg->key.port->br;
5bf1e00b
NA
1953 u32 src_idx, to_send = pg->src_ents;
1954 struct net_bridge_group_src *ent;
1955 unsigned long now = jiffies;
1956 bool changed = false;
1957 struct br_ip src_ip;
1958
1959 hlist_for_each_entry(ent, &pg->src_list, node)
1960 ent->flags |= BR_SGRP_F_SEND;
1961
1962 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 1963 src_ip.proto = pg->key.addr.proto;
5bf1e00b 1964 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 1965 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
5bf1e00b
NA
1966 ent = br_multicast_find_group_src(pg, &src_ip);
1967 if (ent) {
1968 ent->flags &= ~BR_SGRP_F_SEND;
1969 to_send--;
1970 } else {
1971 ent = br_multicast_new_group_src(pg, &src_ip);
1972 if (ent)
1973 changed = true;
1974 }
1975 if (ent)
b0812368 1976 __grp_src_mod_timer(ent, now + br_multicast_gmi(br));
5bf1e00b
NA
1977 }
1978
ddc255d9
NA
1979 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
1980 changed = true;
1981
5bf1e00b
NA
1982 if (to_send)
1983 __grp_src_query_marked_and_rexmit(pg);
1984
1985 return changed;
1986}
1987
1988/* State Msg type New state Actions
1989 * EXCLUDE (X,Y) TO_IN (A) EXCLUDE (X+A,Y-A) (A)=GMI
1990 * Send Q(G,X-A)
1991 * Send Q(G)
1992 */
54bea721 1993static bool __grp_src_toin_excl(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
1994 void *srcs, u32 nsrcs, size_t addr_size,
1995 int grec_type)
5bf1e00b 1996{
085b53c8 1997 struct net_bridge *br = pg->key.port->br;
5bf1e00b
NA
1998 u32 src_idx, to_send = pg->src_ents;
1999 struct net_bridge_group_src *ent;
2000 unsigned long now = jiffies;
2001 bool changed = false;
2002 struct br_ip src_ip;
2003
2004 hlist_for_each_entry(ent, &pg->src_list, node)
2005 if (timer_pending(&ent->timer))
2006 ent->flags |= BR_SGRP_F_SEND;
2007
2008 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 2009 src_ip.proto = pg->key.addr.proto;
5bf1e00b 2010 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 2011 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
5bf1e00b
NA
2012 ent = br_multicast_find_group_src(pg, &src_ip);
2013 if (ent) {
2014 if (timer_pending(&ent->timer)) {
2015 ent->flags &= ~BR_SGRP_F_SEND;
2016 to_send--;
2017 }
2018 } else {
2019 ent = br_multicast_new_group_src(pg, &src_ip);
2020 if (ent)
2021 changed = true;
2022 }
2023 if (ent)
b0812368 2024 __grp_src_mod_timer(ent, now + br_multicast_gmi(br));
5bf1e00b
NA
2025 }
2026
ddc255d9
NA
2027 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
2028 changed = true;
2029
5bf1e00b
NA
2030 if (to_send)
2031 __grp_src_query_marked_and_rexmit(pg);
2032
2033 __grp_send_query_and_rexmit(pg);
2034
2035 return changed;
2036}
2037
54bea721 2038static bool br_multicast_toin(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
2039 void *srcs, u32 nsrcs, size_t addr_size,
2040 int grec_type)
5bf1e00b
NA
2041{
2042 bool changed = false;
2043
2044 switch (pg->filter_mode) {
2045 case MCAST_INCLUDE:
ddc255d9
NA
2046 changed = __grp_src_toin_incl(pg, h_addr, srcs, nsrcs, addr_size,
2047 grec_type);
5bf1e00b
NA
2048 break;
2049 case MCAST_EXCLUDE:
ddc255d9
NA
2050 changed = __grp_src_toin_excl(pg, h_addr, srcs, nsrcs, addr_size,
2051 grec_type);
5bf1e00b
NA
2052 break;
2053 }
2054
ddc255d9
NA
2055 if (br_multicast_eht_should_del_pg(pg)) {
2056 br_multicast_find_del_pg(pg->key.port->br, pg);
2057 /* a notification has already been sent and we shouldn't
2058 * access pg after the delete so we have to return false
2059 */
2060 changed = false;
2061 }
2062
5bf1e00b
NA
2063 return changed;
2064}
2065
2066/* State Msg type New state Actions
2067 * INCLUDE (A) TO_EX (B) EXCLUDE (A*B,B-A) (B-A)=0
2068 * Delete (A-B)
2069 * Send Q(G,A*B)
2070 * Group Timer=GMI
2071 */
54bea721 2072static void __grp_src_toex_incl(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
2073 void *srcs, u32 nsrcs, size_t addr_size,
2074 int grec_type)
5bf1e00b
NA
2075{
2076 struct net_bridge_group_src *ent;
2077 u32 src_idx, to_send = 0;
2078 struct br_ip src_ip;
2079
2080 hlist_for_each_entry(ent, &pg->src_list, node)
2081 ent->flags = (ent->flags & ~BR_SGRP_F_SEND) | BR_SGRP_F_DELETE;
2082
2083 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 2084 src_ip.proto = pg->key.addr.proto;
5bf1e00b 2085 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 2086 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
5bf1e00b
NA
2087 ent = br_multicast_find_group_src(pg, &src_ip);
2088 if (ent) {
2089 ent->flags = (ent->flags & ~BR_SGRP_F_DELETE) |
2090 BR_SGRP_F_SEND;
2091 to_send++;
2092 } else {
b0812368 2093 ent = br_multicast_new_group_src(pg, &src_ip);
5bf1e00b 2094 }
b0812368
NA
2095 if (ent)
2096 br_multicast_fwd_src_handle(ent);
5bf1e00b
NA
2097 }
2098
ddc255d9
NA
2099 br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type);
2100
5bf1e00b
NA
2101 __grp_src_delete_marked(pg);
2102 if (to_send)
2103 __grp_src_query_marked_and_rexmit(pg);
2104}
2105
2106/* State Msg type New state Actions
2107 * EXCLUDE (X,Y) TO_EX (A) EXCLUDE (A-Y,Y*A) (A-X-Y)=Group Timer
2108 * Delete (X-A)
2109 * Delete (Y-A)
2110 * Send Q(G,A-Y)
2111 * Group Timer=GMI
2112 */
54bea721 2113static bool __grp_src_toex_excl(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
2114 void *srcs, u32 nsrcs, size_t addr_size,
2115 int grec_type)
5bf1e00b
NA
2116{
2117 struct net_bridge_group_src *ent;
2118 u32 src_idx, to_send = 0;
2119 bool changed = false;
2120 struct br_ip src_ip;
2121
2122 hlist_for_each_entry(ent, &pg->src_list, node)
2123 ent->flags = (ent->flags & ~BR_SGRP_F_SEND) | BR_SGRP_F_DELETE;
2124
2125 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 2126 src_ip.proto = pg->key.addr.proto;
5bf1e00b 2127 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 2128 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
5bf1e00b
NA
2129 ent = br_multicast_find_group_src(pg, &src_ip);
2130 if (ent) {
2131 ent->flags &= ~BR_SGRP_F_DELETE;
2132 } else {
2133 ent = br_multicast_new_group_src(pg, &src_ip);
2134 if (ent) {
b0812368 2135 __grp_src_mod_timer(ent, pg->timer.expires);
5bf1e00b
NA
2136 changed = true;
2137 }
2138 }
2139 if (ent && timer_pending(&ent->timer)) {
2140 ent->flags |= BR_SGRP_F_SEND;
2141 to_send++;
2142 }
5bf1e00b
NA
2143 }
2144
ddc255d9
NA
2145 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
2146 changed = true;
2147
5bf1e00b
NA
2148 if (__grp_src_delete_marked(pg))
2149 changed = true;
2150 if (to_send)
2151 __grp_src_query_marked_and_rexmit(pg);
2152
2153 return changed;
2154}
2155
54bea721 2156static bool br_multicast_toex(struct net_bridge_port_group *pg, void *h_addr,
ddc255d9
NA
2157 void *srcs, u32 nsrcs, size_t addr_size,
2158 int grec_type)
5bf1e00b 2159{
085b53c8 2160 struct net_bridge *br = pg->key.port->br;
5bf1e00b
NA
2161 bool changed = false;
2162
2163 switch (pg->filter_mode) {
2164 case MCAST_INCLUDE:
ddc255d9
NA
2165 __grp_src_toex_incl(pg, h_addr, srcs, nsrcs, addr_size,
2166 grec_type);
8266a049 2167 br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE);
5bf1e00b
NA
2168 changed = true;
2169 break;
2170 case MCAST_EXCLUDE:
ddc255d9
NA
2171 changed = __grp_src_toex_excl(pg, h_addr, srcs, nsrcs, addr_size,
2172 grec_type);
5bf1e00b
NA
2173 break;
2174 }
2175
2176 pg->filter_mode = MCAST_EXCLUDE;
2177 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br));
2178
2179 return changed;
2180}
2181
109865fe
NA
2182/* State Msg type New state Actions
2183 * INCLUDE (A) BLOCK (B) INCLUDE (A) Send Q(G,A*B)
2184 */
0ad57c99 2185static bool __grp_src_block_incl(struct net_bridge_port_group *pg, void *h_addr,
474ddb37 2186 void *srcs, u32 nsrcs, size_t addr_size, int grec_type)
109865fe
NA
2187{
2188 struct net_bridge_group_src *ent;
2189 u32 src_idx, to_send = 0;
0ad57c99 2190 bool changed = false;
109865fe
NA
2191 struct br_ip src_ip;
2192
2193 hlist_for_each_entry(ent, &pg->src_list, node)
2194 ent->flags &= ~BR_SGRP_F_SEND;
2195
2196 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 2197 src_ip.proto = pg->key.addr.proto;
109865fe 2198 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 2199 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
109865fe
NA
2200 ent = br_multicast_find_group_src(pg, &src_ip);
2201 if (ent) {
2202 ent->flags |= BR_SGRP_F_SEND;
2203 to_send++;
2204 }
109865fe
NA
2205 }
2206
474ddb37
NA
2207 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
2208 changed = true;
2209
109865fe
NA
2210 if (to_send)
2211 __grp_src_query_marked_and_rexmit(pg);
2212
0ad57c99 2213 return changed;
109865fe
NA
2214}
2215
2216/* State Msg type New state Actions
2217 * EXCLUDE (X,Y) BLOCK (A) EXCLUDE (X+(A-Y),Y) (A-X-Y)=Group Timer
2218 * Send Q(G,A-Y)
2219 */
54bea721 2220static bool __grp_src_block_excl(struct net_bridge_port_group *pg, void *h_addr,
474ddb37 2221 void *srcs, u32 nsrcs, size_t addr_size, int grec_type)
109865fe
NA
2222{
2223 struct net_bridge_group_src *ent;
2224 u32 src_idx, to_send = 0;
2225 bool changed = false;
2226 struct br_ip src_ip;
2227
2228 hlist_for_each_entry(ent, &pg->src_list, node)
2229 ent->flags &= ~BR_SGRP_F_SEND;
2230
2231 memset(&src_ip, 0, sizeof(src_ip));
085b53c8 2232 src_ip.proto = pg->key.addr.proto;
109865fe 2233 for (src_idx = 0; src_idx < nsrcs; src_idx++) {
e7cfcf2c 2234 memcpy(&src_ip.src, srcs + (src_idx * addr_size), addr_size);
109865fe
NA
2235 ent = br_multicast_find_group_src(pg, &src_ip);
2236 if (!ent) {
2237 ent = br_multicast_new_group_src(pg, &src_ip);
2238 if (ent) {
b0812368 2239 __grp_src_mod_timer(ent, pg->timer.expires);
109865fe
NA
2240 changed = true;
2241 }
2242 }
2243 if (ent && timer_pending(&ent->timer)) {
2244 ent->flags |= BR_SGRP_F_SEND;
2245 to_send++;
2246 }
109865fe
NA
2247 }
2248
474ddb37
NA
2249 if (br_multicast_eht_handle(pg, h_addr, srcs, nsrcs, addr_size, grec_type))
2250 changed = true;
2251
109865fe
NA
2252 if (to_send)
2253 __grp_src_query_marked_and_rexmit(pg);
2254
2255 return changed;
2256}
2257
54bea721 2258static bool br_multicast_block(struct net_bridge_port_group *pg, void *h_addr,
474ddb37 2259 void *srcs, u32 nsrcs, size_t addr_size, int grec_type)
109865fe
NA
2260{
2261 bool changed = false;
2262
2263 switch (pg->filter_mode) {
2264 case MCAST_INCLUDE:
474ddb37
NA
2265 changed = __grp_src_block_incl(pg, h_addr, srcs, nsrcs, addr_size,
2266 grec_type);
109865fe
NA
2267 break;
2268 case MCAST_EXCLUDE:
474ddb37
NA
2269 changed = __grp_src_block_excl(pg, h_addr, srcs, nsrcs, addr_size,
2270 grec_type);
109865fe
NA
2271 break;
2272 }
2273
e87e4b5c
NA
2274 if ((pg->filter_mode == MCAST_INCLUDE && hlist_empty(&pg->src_list)) ||
2275 br_multicast_eht_should_del_pg(pg)) {
2276 br_multicast_find_del_pg(pg->key.port->br, pg);
2277 /* a notification has already been sent and we shouldn't
2278 * access pg after the delete so we have to return false
2279 */
2280 changed = false;
2281 }
2282
109865fe
NA
2283 return changed;
2284}
2285
0436862e
NA
2286static struct net_bridge_port_group *
2287br_multicast_find_port(struct net_bridge_mdb_entry *mp,
2288 struct net_bridge_port *p,
2289 const unsigned char *src)
2290{
071445c6 2291 struct net_bridge *br __maybe_unused = mp->br;
0436862e 2292 struct net_bridge_port_group *pg;
0436862e
NA
2293
2294 for (pg = mlock_dereference(mp->ports, br);
2295 pg;
2296 pg = mlock_dereference(pg->next, br))
2297 if (br_port_group_equal(pg, p, src))
2298 return pg;
2299
2300 return NULL;
2301}
2302
8ef2a9a5
YH
2303static int br_ip4_multicast_igmp3_report(struct net_bridge *br,
2304 struct net_bridge_port *port,
06499098
VY
2305 struct sk_buff *skb,
2306 u16 vid)
eb1d1641 2307{
0436862e
NA
2308 bool igmpv2 = br->multicast_igmp_version == 2;
2309 struct net_bridge_mdb_entry *mdst;
2310 struct net_bridge_port_group *pg;
6db6f0ea 2311 const unsigned char *src;
eb1d1641
HX
2312 struct igmpv3_report *ih;
2313 struct igmpv3_grec *grec;
0436862e 2314 int i, len, num, type;
54bea721 2315 __be32 group, *h_addr;
0436862e 2316 bool changed = false;
0436862e 2317 int err = 0;
e57f6185 2318 u16 nsrcs;
eb1d1641 2319
eb1d1641
HX
2320 ih = igmpv3_report_hdr(skb);
2321 num = ntohs(ih->ngrec);
c2d4fbd2 2322 len = skb_transport_offset(skb) + sizeof(*ih);
eb1d1641
HX
2323
2324 for (i = 0; i < num; i++) {
2325 len += sizeof(*grec);
ba5ea614 2326 if (!ip_mc_may_pull(skb, len))
eb1d1641
HX
2327 return -EINVAL;
2328
fd218cf9 2329 grec = (void *)(skb->data + len - sizeof(*grec));
eb1d1641
HX
2330 group = grec->grec_mca;
2331 type = grec->grec_type;
e57f6185 2332 nsrcs = ntohs(grec->grec_nsrcs);
eb1d1641 2333
e57f6185 2334 len += nsrcs * 4;
ba5ea614 2335 if (!ip_mc_may_pull(skb, len))
eb1d1641
HX
2336 return -EINVAL;
2337
eb1d1641
HX
2338 switch (type) {
2339 case IGMPV3_MODE_IS_INCLUDE:
2340 case IGMPV3_MODE_IS_EXCLUDE:
2341 case IGMPV3_CHANGE_TO_INCLUDE:
2342 case IGMPV3_CHANGE_TO_EXCLUDE:
2343 case IGMPV3_ALLOW_NEW_SOURCES:
2344 case IGMPV3_BLOCK_OLD_SOURCES:
2345 break;
2346
2347 default:
2348 continue;
2349 }
2350
6db6f0ea 2351 src = eth_hdr(skb)->h_source;
0436862e
NA
2352 if (nsrcs == 0 &&
2353 (type == IGMPV3_CHANGE_TO_INCLUDE ||
2354 type == IGMPV3_MODE_IS_INCLUDE)) {
2355 if (!port || igmpv2) {
2356 br_ip4_multicast_leave_group(br, port, group, vid, src);
2357 continue;
2358 }
bc8c20ac 2359 } else {
6db6f0ea 2360 err = br_ip4_multicast_add_group(br, port, group, vid,
0436862e 2361 src, igmpv2);
bc8c20ac
SA
2362 if (err)
2363 break;
2364 }
0436862e
NA
2365
2366 if (!port || igmpv2)
2367 continue;
2368
2369 spin_lock_bh(&br->multicast_lock);
2370 mdst = br_mdb_ip4_get(br, group, vid);
2371 if (!mdst)
2372 goto unlock_continue;
2373 pg = br_multicast_find_port(mdst, port, src);
2374 if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT))
2375 goto unlock_continue;
54bea721 2376 /* reload grec and host addr */
0436862e 2377 grec = (void *)(skb->data + len - sizeof(*grec) - (nsrcs * 4));
54bea721 2378 h_addr = &ip_hdr(skb)->saddr;
0436862e
NA
2379 switch (type) {
2380 case IGMPV3_ALLOW_NEW_SOURCES:
54bea721 2381 changed = br_multicast_isinc_allow(pg, h_addr, grec->grec_src,
474ddb37 2382 nsrcs, sizeof(__be32), type);
0436862e 2383 break;
e6231bca 2384 case IGMPV3_MODE_IS_INCLUDE:
54bea721 2385 changed = br_multicast_isinc_allow(pg, h_addr, grec->grec_src,
474ddb37 2386 nsrcs, sizeof(__be32), type);
e6231bca
NA
2387 break;
2388 case IGMPV3_MODE_IS_EXCLUDE:
54bea721 2389 changed = br_multicast_isexc(pg, h_addr, grec->grec_src,
ddc255d9 2390 nsrcs, sizeof(__be32), type);
e6231bca 2391 break;
5bf1e00b 2392 case IGMPV3_CHANGE_TO_INCLUDE:
54bea721 2393 changed = br_multicast_toin(pg, h_addr, grec->grec_src,
ddc255d9 2394 nsrcs, sizeof(__be32), type);
5bf1e00b
NA
2395 break;
2396 case IGMPV3_CHANGE_TO_EXCLUDE:
54bea721 2397 changed = br_multicast_toex(pg, h_addr, grec->grec_src,
ddc255d9 2398 nsrcs, sizeof(__be32), type);
5bf1e00b 2399 break;
109865fe 2400 case IGMPV3_BLOCK_OLD_SOURCES:
54bea721 2401 changed = br_multicast_block(pg, h_addr, grec->grec_src,
474ddb37 2402 nsrcs, sizeof(__be32), type);
109865fe 2403 break;
0436862e
NA
2404 }
2405 if (changed)
2406 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB);
2407unlock_continue:
2408 spin_unlock_bh(&br->multicast_lock);
eb1d1641
HX
2409 }
2410
2411 return err;
2412}
2413
dfd56b8b 2414#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
2415static int br_ip6_multicast_mld2_report(struct net_bridge *br,
2416 struct net_bridge_port *port,
06499098
VY
2417 struct sk_buff *skb,
2418 u16 vid)
08b202b6 2419{
0436862e
NA
2420 bool mldv1 = br->multicast_mld_version == 1;
2421 struct net_bridge_mdb_entry *mdst;
2422 struct net_bridge_port_group *pg;
ba5ea614 2423 unsigned int nsrcs_offset;
6db6f0ea 2424 const unsigned char *src;
08b202b6 2425 struct icmp6hdr *icmp6h;
54bea721 2426 struct in6_addr *h_addr;
08b202b6 2427 struct mld2_grec *grec;
ba5ea614 2428 unsigned int grec_len;
0436862e
NA
2429 bool changed = false;
2430 int i, len, num;
08b202b6
YH
2431 int err = 0;
2432
ba5ea614 2433 if (!ipv6_mc_may_pull(skb, sizeof(*icmp6h)))
08b202b6
YH
2434 return -EINVAL;
2435
2436 icmp6h = icmp6_hdr(skb);
2437 num = ntohs(icmp6h->icmp6_dataun.un_data16[1]);
c2d4fbd2 2438 len = skb_transport_offset(skb) + sizeof(*icmp6h);
08b202b6
YH
2439
2440 for (i = 0; i < num; i++) {
e57f6185
NA
2441 __be16 *_nsrcs, __nsrcs;
2442 u16 nsrcs;
08b202b6 2443
ba5ea614
LL
2444 nsrcs_offset = len + offsetof(struct mld2_grec, grec_nsrcs);
2445
2446 if (skb_transport_offset(skb) + ipv6_transport_len(skb) <
5fc6266a 2447 nsrcs_offset + sizeof(__nsrcs))
ba5ea614
LL
2448 return -EINVAL;
2449
e57f6185
NA
2450 _nsrcs = skb_header_pointer(skb, nsrcs_offset,
2451 sizeof(__nsrcs), &__nsrcs);
2452 if (!_nsrcs)
08b202b6
YH
2453 return -EINVAL;
2454
e57f6185
NA
2455 nsrcs = ntohs(*_nsrcs);
2456 grec_len = struct_size(grec, grec_src, nsrcs);
ba5ea614
LL
2457
2458 if (!ipv6_mc_may_pull(skb, len + grec_len))
08b202b6
YH
2459 return -EINVAL;
2460
2461 grec = (struct mld2_grec *)(skb->data + len);
ba5ea614 2462 len += grec_len;
08b202b6 2463
08b202b6
YH
2464 switch (grec->grec_type) {
2465 case MLD2_MODE_IS_INCLUDE:
2466 case MLD2_MODE_IS_EXCLUDE:
2467 case MLD2_CHANGE_TO_INCLUDE:
2468 case MLD2_CHANGE_TO_EXCLUDE:
2469 case MLD2_ALLOW_NEW_SOURCES:
2470 case MLD2_BLOCK_OLD_SOURCES:
2471 break;
2472
2473 default:
2474 continue;
2475 }
2476
6db6f0ea 2477 src = eth_hdr(skb)->h_source;
bc8c20ac
SA
2478 if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE ||
2479 grec->grec_type == MLD2_MODE_IS_INCLUDE) &&
e57f6185 2480 nsrcs == 0) {
0436862e
NA
2481 if (!port || mldv1) {
2482 br_ip6_multicast_leave_group(br, port,
2483 &grec->grec_mca,
2484 vid, src);
2485 continue;
2486 }
bc8c20ac
SA
2487 } else {
2488 err = br_ip6_multicast_add_group(br, port,
6db6f0ea 2489 &grec->grec_mca, vid,
0436862e 2490 src, mldv1);
9264251e 2491 if (err)
bc8c20ac
SA
2492 break;
2493 }
0436862e
NA
2494
2495 if (!port || mldv1)
2496 continue;
2497
2498 spin_lock_bh(&br->multicast_lock);
2499 mdst = br_mdb_ip6_get(br, &grec->grec_mca, vid);
2500 if (!mdst)
2501 goto unlock_continue;
2502 pg = br_multicast_find_port(mdst, port, src);
2503 if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT))
2504 goto unlock_continue;
54bea721 2505 h_addr = &ipv6_hdr(skb)->saddr;
0436862e
NA
2506 switch (grec->grec_type) {
2507 case MLD2_ALLOW_NEW_SOURCES:
54bea721
NA
2508 changed = br_multicast_isinc_allow(pg, h_addr,
2509 grec->grec_src, nsrcs,
474ddb37
NA
2510 sizeof(struct in6_addr),
2511 grec->grec_type);
0436862e 2512 break;
e6231bca 2513 case MLD2_MODE_IS_INCLUDE:
54bea721
NA
2514 changed = br_multicast_isinc_allow(pg, h_addr,
2515 grec->grec_src, nsrcs,
474ddb37
NA
2516 sizeof(struct in6_addr),
2517 grec->grec_type);
e6231bca
NA
2518 break;
2519 case MLD2_MODE_IS_EXCLUDE:
54bea721
NA
2520 changed = br_multicast_isexc(pg, h_addr,
2521 grec->grec_src, nsrcs,
ddc255d9
NA
2522 sizeof(struct in6_addr),
2523 grec->grec_type);
e6231bca 2524 break;
5bf1e00b 2525 case MLD2_CHANGE_TO_INCLUDE:
54bea721
NA
2526 changed = br_multicast_toin(pg, h_addr,
2527 grec->grec_src, nsrcs,
ddc255d9
NA
2528 sizeof(struct in6_addr),
2529 grec->grec_type);
5bf1e00b
NA
2530 break;
2531 case MLD2_CHANGE_TO_EXCLUDE:
54bea721
NA
2532 changed = br_multicast_toex(pg, h_addr,
2533 grec->grec_src, nsrcs,
ddc255d9
NA
2534 sizeof(struct in6_addr),
2535 grec->grec_type);
5bf1e00b 2536 break;
109865fe 2537 case MLD2_BLOCK_OLD_SOURCES:
54bea721
NA
2538 changed = br_multicast_block(pg, h_addr,
2539 grec->grec_src, nsrcs,
474ddb37
NA
2540 sizeof(struct in6_addr),
2541 grec->grec_type);
109865fe 2542 break;
0436862e
NA
2543 }
2544 if (changed)
2545 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB);
2546unlock_continue:
2547 spin_unlock_bh(&br->multicast_lock);
08b202b6
YH
2548 }
2549
2550 return err;
2551}
2552#endif
2553
dc4eb53a 2554static bool br_ip4_multicast_select_querier(struct net_bridge *br,
2cd41431 2555 struct net_bridge_port *port,
dc4eb53a
LL
2556 __be32 saddr)
2557{
2558 if (!timer_pending(&br->ip4_own_query.timer) &&
2559 !timer_pending(&br->ip4_other_query.timer))
2560 goto update;
2561
deb96566 2562 if (!br->ip4_querier.addr.src.ip4)
dc4eb53a
LL
2563 goto update;
2564
deb96566 2565 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.src.ip4))
dc4eb53a
LL
2566 goto update;
2567
2568 return false;
2569
2570update:
deb96566 2571 br->ip4_querier.addr.src.ip4 = saddr;
dc4eb53a 2572
2cd41431
LL
2573 /* update protected by general multicast_lock by caller */
2574 rcu_assign_pointer(br->ip4_querier.port, port);
2575
dc4eb53a
LL
2576 return true;
2577}
2578
2579#if IS_ENABLED(CONFIG_IPV6)
2580static bool br_ip6_multicast_select_querier(struct net_bridge *br,
2cd41431 2581 struct net_bridge_port *port,
dc4eb53a
LL
2582 struct in6_addr *saddr)
2583{
2584 if (!timer_pending(&br->ip6_own_query.timer) &&
2585 !timer_pending(&br->ip6_other_query.timer))
2586 goto update;
2587
deb96566 2588 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.src.ip6) <= 0)
dc4eb53a
LL
2589 goto update;
2590
2591 return false;
2592
2593update:
deb96566 2594 br->ip6_querier.addr.src.ip6 = *saddr;
dc4eb53a 2595
2cd41431
LL
2596 /* update protected by general multicast_lock by caller */
2597 rcu_assign_pointer(br->ip6_querier.port, port);
2598
dc4eb53a
LL
2599 return true;
2600}
2601#endif
2602
2603static bool br_multicast_select_querier(struct net_bridge *br,
2cd41431 2604 struct net_bridge_port *port,
dc4eb53a
LL
2605 struct br_ip *saddr)
2606{
2607 switch (saddr->proto) {
2608 case htons(ETH_P_IP):
deb96566 2609 return br_ip4_multicast_select_querier(br, port, saddr->src.ip4);
dc4eb53a
LL
2610#if IS_ENABLED(CONFIG_IPV6)
2611 case htons(ETH_P_IPV6):
deb96566 2612 return br_ip6_multicast_select_querier(br, port, &saddr->src.ip6);
dc4eb53a
LL
2613#endif
2614 }
2615
2616 return false;
2617}
2618
cc0fdd80 2619static void
90010b36
LL
2620br_multicast_update_query_timer(struct net_bridge *br,
2621 struct bridge_mcast_other_query *query,
2622 unsigned long max_delay)
b00589af 2623{
90010b36
LL
2624 if (!timer_pending(&query->timer))
2625 query->delay_time = jiffies + max_delay;
b00589af 2626
90010b36 2627 mod_timer(&query->timer, jiffies + br->multicast_querier_interval);
b00589af
LL
2628}
2629
6d549648
NF
2630static void br_port_mc_router_state_change(struct net_bridge_port *p,
2631 bool is_mc_router)
2632{
2633 struct switchdev_attr attr = {
2634 .orig_dev = p->dev,
2635 .id = SWITCHDEV_ATTR_ID_PORT_MROUTER,
2636 .flags = SWITCHDEV_F_DEFER,
2637 .u.mrouter = is_mc_router,
2638 };
2639
2640 switchdev_port_attr_set(p->dev, &attr);
2641}
2642
7e80c124 2643/*
7c77602f 2644 * Add port to router_list
7e80c124 2645 * list is maintained ordered by pointer value
2646 * and locked by br->multicast_lock and RCU
2647 */
0909e117
HX
2648static void br_multicast_add_router(struct net_bridge *br,
2649 struct net_bridge_port *port)
2650{
dcdca2c4 2651 struct net_bridge_port *p;
b67bfe0d 2652 struct hlist_node *slot = NULL;
dcdca2c4 2653
1a040eac
NA
2654 if (!hlist_unhashed(&port->rlist))
2655 return;
2656
b67bfe0d 2657 hlist_for_each_entry(p, &br->router_list, rlist) {
7e80c124 2658 if ((unsigned long) port >= (unsigned long) p)
2659 break;
b67bfe0d 2660 slot = &p->rlist;
dcdca2c4 2661 }
2662
7e80c124 2663 if (slot)
1d023284 2664 hlist_add_behind_rcu(&port->rlist, slot);
dcdca2c4 2665 else
2666 hlist_add_head_rcu(&port->rlist, &br->router_list);
949f1e39 2667 br_rtr_notify(br->dev, port, RTM_NEWMDB);
6d549648 2668 br_port_mc_router_state_change(port, true);
0909e117
HX
2669}
2670
eb1d1641
HX
2671static void br_multicast_mark_router(struct net_bridge *br,
2672 struct net_bridge_port *port)
2673{
2674 unsigned long now = jiffies;
eb1d1641
HX
2675
2676 if (!port) {
77041420
YG
2677 if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) {
2678 if (!timer_pending(&br->multicast_router_timer))
2679 br_mc_router_state_change(br, true);
eb1d1641
HX
2680 mod_timer(&br->multicast_router_timer,
2681 now + br->multicast_querier_interval);
77041420 2682 }
eb1d1641
HX
2683 return;
2684 }
2685
a55d8246
NA
2686 if (port->multicast_router == MDB_RTR_TYPE_DISABLED ||
2687 port->multicast_router == MDB_RTR_TYPE_PERM)
eb1d1641
HX
2688 return;
2689
0909e117 2690 br_multicast_add_router(br, port);
eb1d1641 2691
eb1d1641
HX
2692 mod_timer(&port->multicast_router_timer,
2693 now + br->multicast_querier_interval);
2694}
2695
2696static void br_multicast_query_received(struct net_bridge *br,
2697 struct net_bridge_port *port,
90010b36 2698 struct bridge_mcast_other_query *query,
dc4eb53a 2699 struct br_ip *saddr,
b00589af 2700 unsigned long max_delay)
eb1d1641 2701{
2cd41431 2702 if (!br_multicast_select_querier(br, port, saddr))
eb1d1641
HX
2703 return;
2704
dc4eb53a 2705 br_multicast_update_query_timer(br, query, max_delay);
278e2148 2706 br_multicast_mark_router(br, port);
eb1d1641
HX
2707}
2708
9c2e955c 2709static void br_ip4_multicast_query(struct net_bridge *br,
2710 struct net_bridge_port *port,
2711 struct sk_buff *skb,
2712 u16 vid)
eb1d1641 2713{
ba5ea614 2714 unsigned int transport_len = ip_transport_len(skb);
b71d1d42 2715 const struct iphdr *iph = ip_hdr(skb);
eb1d1641
HX
2716 struct igmphdr *ih = igmp_hdr(skb);
2717 struct net_bridge_mdb_entry *mp;
2718 struct igmpv3_query *ih3;
2719 struct net_bridge_port_group *p;
e8051688 2720 struct net_bridge_port_group __rcu **pp;
dc4eb53a 2721 struct br_ip saddr;
eb1d1641
HX
2722 unsigned long max_delay;
2723 unsigned long now = jiffies;
2724 __be32 group;
2725
2726 spin_lock(&br->multicast_lock);
2727 if (!netif_running(br->dev) ||
2728 (port && port->state == BR_STATE_DISABLED))
2729 goto out;
2730
eb1d1641
HX
2731 group = ih->group;
2732
ba5ea614 2733 if (transport_len == sizeof(*ih)) {
eb1d1641
HX
2734 max_delay = ih->code * (HZ / IGMP_TIMER_SCALE);
2735
2736 if (!max_delay) {
2737 max_delay = 10 * HZ;
2738 group = 0;
2739 }
ba5ea614 2740 } else if (transport_len >= sizeof(*ih3)) {
eb1d1641 2741 ih3 = igmpv3_query_hdr(skb);
23550b83
NA
2742 if (ih3->nsrcs ||
2743 (br->multicast_igmp_version == 3 && group && ih3->suppress))
bec68ff1 2744 goto out;
eb1d1641 2745
0ba8c9ec
YH
2746 max_delay = ih3->code ?
2747 IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1;
9afd85c9 2748 } else {
9ed973cc
LL
2749 goto out;
2750 }
2751
dc4eb53a
LL
2752 if (!group) {
2753 saddr.proto = htons(ETH_P_IP);
deb96566 2754 saddr.src.ip4 = iph->saddr;
b00589af 2755
dc4eb53a
LL
2756 br_multicast_query_received(br, port, &br->ip4_other_query,
2757 &saddr, max_delay);
eb1d1641 2758 goto out;
dc4eb53a 2759 }
eb1d1641 2760
19e3a9c9 2761 mp = br_mdb_ip4_get(br, group, vid);
eb1d1641
HX
2762 if (!mp)
2763 goto out;
2764
2765 max_delay *= br->multicast_last_member_count;
2766
ff0fd34e 2767 if (mp->host_joined &&
eb1d1641
HX
2768 (timer_pending(&mp->timer) ?
2769 time_after(mp->timer.expires, now + max_delay) :
2770 try_to_del_timer_sync(&mp->timer) >= 0))
2771 mod_timer(&mp->timer, now + max_delay);
2772
e8051688
ED
2773 for (pp = &mp->ports;
2774 (p = mlock_dereference(*pp, br)) != NULL;
2775 pp = &p->next) {
eb1d1641
HX
2776 if (timer_pending(&p->timer) ?
2777 time_after(p->timer.expires, now + max_delay) :
23550b83
NA
2778 try_to_del_timer_sync(&p->timer) >= 0 &&
2779 (br->multicast_igmp_version == 2 ||
2780 p->filter_mode == MCAST_EXCLUDE))
24f9cdcb 2781 mod_timer(&p->timer, now + max_delay);
eb1d1641
HX
2782 }
2783
2784out:
2785 spin_unlock(&br->multicast_lock);
eb1d1641
HX
2786}
2787
dfd56b8b 2788#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
2789static int br_ip6_multicast_query(struct net_bridge *br,
2790 struct net_bridge_port *port,
06499098
VY
2791 struct sk_buff *skb,
2792 u16 vid)
08b202b6 2793{
ba5ea614 2794 unsigned int transport_len = ipv6_transport_len(skb);
eca2a43b 2795 struct mld_msg *mld;
08b202b6
YH
2796 struct net_bridge_mdb_entry *mp;
2797 struct mld2_query *mld2q;
e8051688
ED
2798 struct net_bridge_port_group *p;
2799 struct net_bridge_port_group __rcu **pp;
dc4eb53a 2800 struct br_ip saddr;
08b202b6
YH
2801 unsigned long max_delay;
2802 unsigned long now = jiffies;
856ce5d0 2803 unsigned int offset = skb_transport_offset(skb);
b71d1d42 2804 const struct in6_addr *group = NULL;
9ed973cc 2805 bool is_general_query;
08b202b6
YH
2806 int err = 0;
2807
2808 spin_lock(&br->multicast_lock);
2809 if (!netif_running(br->dev) ||
2810 (port && port->state == BR_STATE_DISABLED))
2811 goto out;
2812
ba5ea614 2813 if (transport_len == sizeof(*mld)) {
856ce5d0 2814 if (!pskb_may_pull(skb, offset + sizeof(*mld))) {
08b202b6
YH
2815 err = -EINVAL;
2816 goto out;
2817 }
2818 mld = (struct mld_msg *) icmp6_hdr(skb);
4715213d 2819 max_delay = msecs_to_jiffies(ntohs(mld->mld_maxdelay));
08b202b6
YH
2820 if (max_delay)
2821 group = &mld->mld_mca;
248ba8ec 2822 } else {
856ce5d0 2823 if (!pskb_may_pull(skb, offset + sizeof(*mld2q))) {
08b202b6
YH
2824 err = -EINVAL;
2825 goto out;
2826 }
2827 mld2q = (struct mld2_query *)icmp6_hdr(skb);
2828 if (!mld2q->mld2q_nsrcs)
2829 group = &mld2q->mld2q_mca;
23550b83
NA
2830 if (br->multicast_mld_version == 2 &&
2831 !ipv6_addr_any(&mld2q->mld2q_mca) &&
2832 mld2q->mld2q_suppress)
2833 goto out;
e3f5b170
DB
2834
2835 max_delay = max(msecs_to_jiffies(mldv2_mrc(mld2q)), 1UL);
08b202b6
YH
2836 }
2837
9ed973cc
LL
2838 is_general_query = group && ipv6_addr_any(group);
2839
dc4eb53a
LL
2840 if (is_general_query) {
2841 saddr.proto = htons(ETH_P_IPV6);
deb96566 2842 saddr.src.ip6 = ipv6_hdr(skb)->saddr;
b00589af 2843
dc4eb53a
LL
2844 br_multicast_query_received(br, port, &br->ip6_other_query,
2845 &saddr, max_delay);
08b202b6 2846 goto out;
6c03ee8b
LL
2847 } else if (!group) {
2848 goto out;
dc4eb53a 2849 }
08b202b6 2850
19e3a9c9 2851 mp = br_mdb_ip6_get(br, group, vid);
08b202b6
YH
2852 if (!mp)
2853 goto out;
2854
2855 max_delay *= br->multicast_last_member_count;
ff0fd34e 2856 if (mp->host_joined &&
08b202b6
YH
2857 (timer_pending(&mp->timer) ?
2858 time_after(mp->timer.expires, now + max_delay) :
2859 try_to_del_timer_sync(&mp->timer) >= 0))
2860 mod_timer(&mp->timer, now + max_delay);
2861
e8051688
ED
2862 for (pp = &mp->ports;
2863 (p = mlock_dereference(*pp, br)) != NULL;
2864 pp = &p->next) {
08b202b6
YH
2865 if (timer_pending(&p->timer) ?
2866 time_after(p->timer.expires, now + max_delay) :
23550b83
NA
2867 try_to_del_timer_sync(&p->timer) >= 0 &&
2868 (br->multicast_mld_version == 1 ||
2869 p->filter_mode == MCAST_EXCLUDE))
24f9cdcb 2870 mod_timer(&p->timer, now + max_delay);
08b202b6
YH
2871 }
2872
2873out:
2874 spin_unlock(&br->multicast_lock);
2875 return err;
2876}
2877#endif
2878
90010b36
LL
2879static void
2880br_multicast_leave_group(struct net_bridge *br,
2881 struct net_bridge_port *port,
2882 struct br_ip *group,
2883 struct bridge_mcast_other_query *other_query,
6db6f0ea
FF
2884 struct bridge_mcast_own_query *own_query,
2885 const unsigned char *src)
eb1d1641 2886{
eb1d1641
HX
2887 struct net_bridge_mdb_entry *mp;
2888 struct net_bridge_port_group *p;
2889 unsigned long now;
2890 unsigned long time;
2891
eb1d1641
HX
2892 spin_lock(&br->multicast_lock);
2893 if (!netif_running(br->dev) ||
544586f7 2894 (port && port->state == BR_STATE_DISABLED))
eb1d1641
HX
2895 goto out;
2896
19e3a9c9 2897 mp = br_mdb_ip_get(br, group);
eb1d1641
HX
2898 if (!mp)
2899 goto out;
2900
544586f7
SA
2901 if (port && (port->flags & BR_MULTICAST_FAST_LEAVE)) {
2902 struct net_bridge_port_group __rcu **pp;
2903
2904 for (pp = &mp->ports;
2905 (p = mlock_dereference(*pp, br)) != NULL;
2906 pp = &p->next) {
6db6f0ea 2907 if (!br_port_group_equal(p, port, src))
544586f7
SA
2908 continue;
2909
5c725b6b
NA
2910 if (p->flags & MDB_PG_FLAGS_PERMANENT)
2911 break;
2912
681590bd
NA
2913 p->flags |= MDB_PG_FLAGS_FAST_LEAVE;
2914 br_multicast_del_pg(mp, p, pp);
544586f7
SA
2915 }
2916 goto out;
2917 }
2918
2919 if (timer_pending(&other_query->timer))
2920 goto out;
2921
675779ad 2922 if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) {
438ef2d0 2923 __br_multicast_send_query(br, port, NULL, NULL, &mp->addr,
42c11ccf 2924 false, 0, NULL);
6b7df111
CW
2925
2926 time = jiffies + br->multicast_last_member_count *
2927 br->multicast_last_member_interval;
cc0fdd80 2928
90010b36 2929 mod_timer(&own_query->timer, time);
6b7df111
CW
2930
2931 for (p = mlock_dereference(mp->ports, br);
2932 p != NULL;
2933 p = mlock_dereference(p->next, br)) {
6db6f0ea 2934 if (!br_port_group_equal(p, port, src))
6b7df111
CW
2935 continue;
2936
2937 if (!hlist_unhashed(&p->mglist) &&
2938 (timer_pending(&p->timer) ?
2939 time_after(p->timer.expires, time) :
2940 try_to_del_timer_sync(&p->timer) >= 0)) {
2941 mod_timer(&p->timer, time);
2942 }
2943
2944 break;
2945 }
2946 }
2947
eb1d1641
HX
2948 now = jiffies;
2949 time = now + br->multicast_last_member_count *
2950 br->multicast_last_member_interval;
2951
2952 if (!port) {
ff0fd34e 2953 if (mp->host_joined &&
eb1d1641
HX
2954 (timer_pending(&mp->timer) ?
2955 time_after(mp->timer.expires, time) :
2956 try_to_del_timer_sync(&mp->timer) >= 0)) {
2957 mod_timer(&mp->timer, time);
eb1d1641 2958 }
454594f3
LL
2959
2960 goto out;
2961 }
2962
2963 for (p = mlock_dereference(mp->ports, br);
2964 p != NULL;
2965 p = mlock_dereference(p->next, br)) {
085b53c8 2966 if (p->key.port != port)
454594f3
LL
2967 continue;
2968
2969 if (!hlist_unhashed(&p->mglist) &&
2970 (timer_pending(&p->timer) ?
2971 time_after(p->timer.expires, time) :
2972 try_to_del_timer_sync(&p->timer) >= 0)) {
2973 mod_timer(&p->timer, time);
2974 }
2975
2976 break;
eb1d1641 2977 }
eb1d1641
HX
2978out:
2979 spin_unlock(&br->multicast_lock);
2980}
2981
8ef2a9a5
YH
2982static void br_ip4_multicast_leave_group(struct net_bridge *br,
2983 struct net_bridge_port *port,
b0e9a30d 2984 __be32 group,
6db6f0ea
FF
2985 __u16 vid,
2986 const unsigned char *src)
8ef2a9a5
YH
2987{
2988 struct br_ip br_group;
90010b36 2989 struct bridge_mcast_own_query *own_query;
8ef2a9a5
YH
2990
2991 if (ipv4_is_local_multicast(group))
2992 return;
2993
90010b36
LL
2994 own_query = port ? &port->ip4_own_query : &br->ip4_own_query;
2995
1515a63f 2996 memset(&br_group, 0, sizeof(br_group));
eab3227b 2997 br_group.dst.ip4 = group;
8ef2a9a5 2998 br_group.proto = htons(ETH_P_IP);
b0e9a30d 2999 br_group.vid = vid;
8ef2a9a5 3000
90010b36 3001 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
6db6f0ea 3002 own_query, src);
8ef2a9a5
YH
3003}
3004
dfd56b8b 3005#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
3006static void br_ip6_multicast_leave_group(struct net_bridge *br,
3007 struct net_bridge_port *port,
b0e9a30d 3008 const struct in6_addr *group,
6db6f0ea
FF
3009 __u16 vid,
3010 const unsigned char *src)
08b202b6
YH
3011{
3012 struct br_ip br_group;
90010b36 3013 struct bridge_mcast_own_query *own_query;
08b202b6 3014
3c3769e6 3015 if (ipv6_addr_is_ll_all_nodes(group))
08b202b6
YH
3016 return;
3017
90010b36
LL
3018 own_query = port ? &port->ip6_own_query : &br->ip6_own_query;
3019
1515a63f 3020 memset(&br_group, 0, sizeof(br_group));
eab3227b 3021 br_group.dst.ip6 = *group;
08b202b6 3022 br_group.proto = htons(ETH_P_IPV6);
b0e9a30d 3023 br_group.vid = vid;
08b202b6 3024
90010b36 3025 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
6db6f0ea 3026 own_query, src);
08b202b6
YH
3027}
3028#endif
8ef2a9a5 3029
1080ab95
NA
3030static void br_multicast_err_count(const struct net_bridge *br,
3031 const struct net_bridge_port *p,
3032 __be16 proto)
3033{
3034 struct bridge_mcast_stats __percpu *stats;
3035 struct bridge_mcast_stats *pstats;
3036
675779ad 3037 if (!br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED))
1080ab95
NA
3038 return;
3039
3040 if (p)
3041 stats = p->mcast_stats;
3042 else
3043 stats = br->mcast_stats;
3044 if (WARN_ON(!stats))
3045 return;
3046
3047 pstats = this_cpu_ptr(stats);
3048
3049 u64_stats_update_begin(&pstats->syncp);
3050 switch (proto) {
3051 case htons(ETH_P_IP):
3052 pstats->mstats.igmp_parse_errors++;
3053 break;
3054#if IS_ENABLED(CONFIG_IPV6)
3055 case htons(ETH_P_IPV6):
3056 pstats->mstats.mld_parse_errors++;
3057 break;
3058#endif
3059 }
3060 u64_stats_update_end(&pstats->syncp);
3061}
3062
91b02d3d
NA
3063static void br_multicast_pim(struct net_bridge *br,
3064 struct net_bridge_port *port,
3065 const struct sk_buff *skb)
3066{
3067 unsigned int offset = skb_transport_offset(skb);
3068 struct pimhdr *pimhdr, _pimhdr;
3069
3070 pimhdr = skb_header_pointer(skb, offset, sizeof(_pimhdr), &_pimhdr);
3071 if (!pimhdr || pim_hdr_version(pimhdr) != PIM_VERSION ||
3072 pim_hdr_type(pimhdr) != PIM_TYPE_HELLO)
3073 return;
3074
3075 br_multicast_mark_router(br, port);
3076}
3077
4b3087c7
LL
3078static int br_ip4_multicast_mrd_rcv(struct net_bridge *br,
3079 struct net_bridge_port *port,
3080 struct sk_buff *skb)
3081{
3082 if (ip_hdr(skb)->protocol != IPPROTO_IGMP ||
3083 igmp_hdr(skb)->type != IGMP_MRDISC_ADV)
3084 return -ENOMSG;
3085
3086 br_multicast_mark_router(br, port);
3087
3088 return 0;
3089}
3090
eb1d1641
HX
3091static int br_multicast_ipv4_rcv(struct net_bridge *br,
3092 struct net_bridge_port *port,
06499098
VY
3093 struct sk_buff *skb,
3094 u16 vid)
eb1d1641 3095{
6db6f0ea 3096 const unsigned char *src;
eb1d1641 3097 struct igmphdr *ih;
eb1d1641
HX
3098 int err;
3099
ba5ea614 3100 err = ip_mc_check_igmp(skb);
eb1d1641 3101
9afd85c9 3102 if (err == -ENOMSG) {
91b02d3d 3103 if (!ipv4_is_local_multicast(ip_hdr(skb)->daddr)) {
bd4265fe 3104 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
91b02d3d
NA
3105 } else if (pim_ipv4_all_pim_routers(ip_hdr(skb)->daddr)) {
3106 if (ip_hdr(skb)->protocol == IPPROTO_PIM)
3107 br_multicast_pim(br, port, skb);
4b3087c7 3108 } else if (ipv4_is_all_snoopers(ip_hdr(skb)->daddr)) {
08e71623 3109 br_ip4_multicast_mrd_rcv(br, port, skb);
91b02d3d 3110 }
4b3087c7 3111
eb1d1641 3112 return 0;
9afd85c9 3113 } else if (err < 0) {
1080ab95 3114 br_multicast_err_count(br, port, skb->protocol);
9afd85c9 3115 return err;
bd4265fe 3116 }
eb1d1641 3117
9afd85c9 3118 ih = igmp_hdr(skb);
6db6f0ea 3119 src = eth_hdr(skb)->h_source;
1080ab95 3120 BR_INPUT_SKB_CB(skb)->igmp = ih->type;
eb1d1641
HX
3121
3122 switch (ih->type) {
3123 case IGMP_HOST_MEMBERSHIP_REPORT:
3124 case IGMPV2_HOST_MEMBERSHIP_REPORT:
62b2bcb4 3125 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
8b671779
NA
3126 err = br_ip4_multicast_add_group(br, port, ih->group, vid, src,
3127 true);
eb1d1641
HX
3128 break;
3129 case IGMPV3_HOST_MEMBERSHIP_REPORT:
ba5ea614 3130 err = br_ip4_multicast_igmp3_report(br, port, skb, vid);
eb1d1641
HX
3131 break;
3132 case IGMP_HOST_MEMBERSHIP_QUERY:
ba5ea614 3133 br_ip4_multicast_query(br, port, skb, vid);
eb1d1641
HX
3134 break;
3135 case IGMP_HOST_LEAVE_MESSAGE:
6db6f0ea 3136 br_ip4_multicast_leave_group(br, port, ih->group, vid, src);
eb1d1641
HX
3137 break;
3138 }
3139
a65056ec 3140 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp,
1080ab95
NA
3141 BR_MCAST_DIR_RX);
3142
eb1d1641
HX
3143 return err;
3144}
3145
dfd56b8b 3146#if IS_ENABLED(CONFIG_IPV6)
4b3087c7
LL
3147static int br_ip6_multicast_mrd_rcv(struct net_bridge *br,
3148 struct net_bridge_port *port,
3149 struct sk_buff *skb)
3150{
3151 int ret;
3152
3153 if (ipv6_hdr(skb)->nexthdr != IPPROTO_ICMPV6)
3154 return -ENOMSG;
3155
3156 ret = ipv6_mc_check_icmpv6(skb);
3157 if (ret < 0)
3158 return ret;
3159
3160 if (icmp6_hdr(skb)->icmp6_type != ICMPV6_MRDISC_ADV)
3161 return -ENOMSG;
3162
3163 br_multicast_mark_router(br, port);
3164
3165 return 0;
3166}
3167
08b202b6
YH
3168static int br_multicast_ipv6_rcv(struct net_bridge *br,
3169 struct net_bridge_port *port,
06499098
VY
3170 struct sk_buff *skb,
3171 u16 vid)
08b202b6 3172{
6db6f0ea 3173 const unsigned char *src;
9afd85c9 3174 struct mld_msg *mld;
08b202b6
YH
3175 int err;
3176
ba5ea614 3177 err = ipv6_mc_check_mld(skb);
08b202b6 3178
9afd85c9
LL
3179 if (err == -ENOMSG) {
3180 if (!ipv6_addr_is_ll_all_nodes(&ipv6_hdr(skb)->daddr))
3181 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
4b3087c7
LL
3182
3183 if (ipv6_addr_is_all_snoopers(&ipv6_hdr(skb)->daddr)) {
3184 err = br_ip6_multicast_mrd_rcv(br, port, skb);
3185
3186 if (err < 0 && err != -ENOMSG) {
3187 br_multicast_err_count(br, port, skb->protocol);
3188 return err;
3189 }
3190 }
3191
08b202b6 3192 return 0;
9afd85c9 3193 } else if (err < 0) {
1080ab95 3194 br_multicast_err_count(br, port, skb->protocol);
9afd85c9 3195 return err;
08b202b6
YH
3196 }
3197
9afd85c9 3198 mld = (struct mld_msg *)skb_transport_header(skb);
1080ab95 3199 BR_INPUT_SKB_CB(skb)->igmp = mld->mld_type;
08b202b6 3200
9afd85c9 3201 switch (mld->mld_type) {
08b202b6 3202 case ICMPV6_MGM_REPORT:
6db6f0ea 3203 src = eth_hdr(skb)->h_source;
fc2af6c7 3204 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
6db6f0ea 3205 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid,
8b671779 3206 src, true);
08b202b6 3207 break;
08b202b6 3208 case ICMPV6_MLD2_REPORT:
ba5ea614 3209 err = br_ip6_multicast_mld2_report(br, port, skb, vid);
08b202b6
YH
3210 break;
3211 case ICMPV6_MGM_QUERY:
ba5ea614 3212 err = br_ip6_multicast_query(br, port, skb, vid);
08b202b6
YH
3213 break;
3214 case ICMPV6_MGM_REDUCTION:
6db6f0ea
FF
3215 src = eth_hdr(skb)->h_source;
3216 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src);
9afd85c9 3217 break;
08b202b6
YH
3218 }
3219
a65056ec 3220 br_multicast_count(br, port, skb, BR_INPUT_SKB_CB(skb)->igmp,
1080ab95
NA
3221 BR_MCAST_DIR_RX);
3222
08b202b6
YH
3223 return err;
3224}
3225#endif
3226
eb1d1641 3227int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
06499098 3228 struct sk_buff *skb, u16 vid)
eb1d1641 3229{
1080ab95
NA
3230 int ret = 0;
3231
1fafc7a9
YH
3232 BR_INPUT_SKB_CB(skb)->igmp = 0;
3233 BR_INPUT_SKB_CB(skb)->mrouters_only = 0;
3234
13cefad2 3235 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
eb1d1641
HX
3236 return 0;
3237
3238 switch (skb->protocol) {
3239 case htons(ETH_P_IP):
1080ab95
NA
3240 ret = br_multicast_ipv4_rcv(br, port, skb, vid);
3241 break;
dfd56b8b 3242#if IS_ENABLED(CONFIG_IPV6)
08b202b6 3243 case htons(ETH_P_IPV6):
1080ab95
NA
3244 ret = br_multicast_ipv6_rcv(br, port, skb, vid);
3245 break;
08b202b6 3246#endif
eb1d1641
HX
3247 }
3248
1080ab95 3249 return ret;
eb1d1641
HX
3250}
3251
cc0fdd80 3252static void br_multicast_query_expired(struct net_bridge *br,
2cd41431
LL
3253 struct bridge_mcast_own_query *query,
3254 struct bridge_mcast_querier *querier)
cc0fdd80
LL
3255{
3256 spin_lock(&br->multicast_lock);
3257 if (query->startup_sent < br->multicast_startup_query_count)
3258 query->startup_sent++;
3259
71d9f614 3260 RCU_INIT_POINTER(querier->port, NULL);
cc0fdd80
LL
3261 br_multicast_send_query(br, NULL, query);
3262 spin_unlock(&br->multicast_lock);
3263}
3264
88c1f37f 3265static void br_ip4_multicast_query_expired(struct timer_list *t)
eb1d1641 3266{
88c1f37f 3267 struct net_bridge *br = from_timer(br, t, ip4_own_query.timer);
eb1d1641 3268
2cd41431 3269 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier);
cc0fdd80 3270}
eb1d1641 3271
cc0fdd80 3272#if IS_ENABLED(CONFIG_IPV6)
88c1f37f 3273static void br_ip6_multicast_query_expired(struct timer_list *t)
cc0fdd80 3274{
88c1f37f 3275 struct net_bridge *br = from_timer(br, t, ip6_own_query.timer);
eb1d1641 3276
2cd41431 3277 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier);
eb1d1641 3278}
cc0fdd80 3279#endif
eb1d1641 3280
e12cec65 3281static void br_multicast_gc_work(struct work_struct *work)
8b671779
NA
3282{
3283 struct net_bridge *br = container_of(work, struct net_bridge,
e12cec65 3284 mcast_gc_work);
8b671779
NA
3285 HLIST_HEAD(deleted_head);
3286
3287 spin_lock_bh(&br->multicast_lock);
e12cec65 3288 hlist_move_list(&br->mcast_gc_list, &deleted_head);
8b671779
NA
3289 spin_unlock_bh(&br->multicast_lock);
3290
e12cec65 3291 br_multicast_gc(&deleted_head);
8b671779
NA
3292}
3293
eb1d1641
HX
3294void br_multicast_init(struct net_bridge *br)
3295{
d08c6bc0 3296 br->hash_max = BR_MULTICAST_DEFAULT_HASH_MAX;
eb1d1641 3297
7f0aec7a 3298 br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
eb1d1641
HX
3299 br->multicast_last_member_count = 2;
3300 br->multicast_startup_query_count = 2;
3301
3302 br->multicast_last_member_interval = HZ;
3303 br->multicast_query_response_interval = 10 * HZ;
3304 br->multicast_startup_query_interval = 125 * HZ / 4;
3305 br->multicast_query_interval = 125 * HZ;
3306 br->multicast_querier_interval = 255 * HZ;
3307 br->multicast_membership_interval = 260 * HZ;
3308
90010b36 3309 br->ip4_other_query.delay_time = 0;
2cd41431 3310 br->ip4_querier.port = NULL;
aa2ae3e7 3311 br->multicast_igmp_version = 2;
cc0fdd80 3312#if IS_ENABLED(CONFIG_IPV6)
aa2ae3e7 3313 br->multicast_mld_version = 1;
90010b36 3314 br->ip6_other_query.delay_time = 0;
2cd41431 3315 br->ip6_querier.port = NULL;
cc0fdd80 3316#endif
6919622a 3317 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, true);
675779ad 3318 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true);
b00589af 3319
eb1d1641 3320 spin_lock_init(&br->multicast_lock);
88c1f37f
AP
3321 timer_setup(&br->multicast_router_timer,
3322 br_multicast_local_router_expired, 0);
3323 timer_setup(&br->ip4_other_query.timer,
3324 br_ip4_multicast_querier_expired, 0);
3325 timer_setup(&br->ip4_own_query.timer,
3326 br_ip4_multicast_query_expired, 0);
cc0fdd80 3327#if IS_ENABLED(CONFIG_IPV6)
88c1f37f
AP
3328 timer_setup(&br->ip6_other_query.timer,
3329 br_ip6_multicast_querier_expired, 0);
3330 timer_setup(&br->ip6_own_query.timer,
3331 br_ip6_multicast_query_expired, 0);
cc0fdd80 3332#endif
19e3a9c9 3333 INIT_HLIST_HEAD(&br->mdb_list);
e12cec65
NA
3334 INIT_HLIST_HEAD(&br->mcast_gc_list);
3335 INIT_WORK(&br->mcast_gc_work, br_multicast_gc_work);
eb1d1641
HX
3336}
3337
4effd28c
LL
3338static void br_ip4_multicast_join_snoopers(struct net_bridge *br)
3339{
3340 struct in_device *in_dev = in_dev_get(br->dev);
3341
3342 if (!in_dev)
3343 return;
3344
9fb20801 3345 __ip_mc_inc_group(in_dev, htonl(INADDR_ALLSNOOPERS_GROUP), GFP_ATOMIC);
4effd28c
LL
3346 in_dev_put(in_dev);
3347}
3348
3349#if IS_ENABLED(CONFIG_IPV6)
3350static void br_ip6_multicast_join_snoopers(struct net_bridge *br)
3351{
3352 struct in6_addr addr;
3353
3354 ipv6_addr_set(&addr, htonl(0xff020000), 0, 0, htonl(0x6a));
3355 ipv6_dev_mc_inc(br->dev, &addr);
3356}
3357#else
3358static inline void br_ip6_multicast_join_snoopers(struct net_bridge *br)
3359{
3360}
3361#endif
3362
851d0a73 3363void br_multicast_join_snoopers(struct net_bridge *br)
4effd28c
LL
3364{
3365 br_ip4_multicast_join_snoopers(br);
3366 br_ip6_multicast_join_snoopers(br);
3367}
3368
3369static void br_ip4_multicast_leave_snoopers(struct net_bridge *br)
3370{
3371 struct in_device *in_dev = in_dev_get(br->dev);
3372
3373 if (WARN_ON(!in_dev))
3374 return;
3375
9fb20801 3376 __ip_mc_dec_group(in_dev, htonl(INADDR_ALLSNOOPERS_GROUP), GFP_ATOMIC);
4effd28c
LL
3377 in_dev_put(in_dev);
3378}
3379
3380#if IS_ENABLED(CONFIG_IPV6)
3381static void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
3382{
3383 struct in6_addr addr;
3384
3385 ipv6_addr_set(&addr, htonl(0xff020000), 0, 0, htonl(0x6a));
3386 ipv6_dev_mc_dec(br->dev, &addr);
3387}
3388#else
3389static inline void br_ip6_multicast_leave_snoopers(struct net_bridge *br)
3390{
3391}
3392#endif
3393
851d0a73 3394void br_multicast_leave_snoopers(struct net_bridge *br)
4effd28c
LL
3395{
3396 br_ip4_multicast_leave_snoopers(br);
3397 br_ip6_multicast_leave_snoopers(br);
3398}
3399
cc0fdd80 3400static void __br_multicast_open(struct net_bridge *br,
90010b36 3401 struct bridge_mcast_own_query *query)
eb1d1641 3402{
cc0fdd80 3403 query->startup_sent = 0;
eb1d1641 3404
13cefad2 3405 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
eb1d1641
HX
3406 return;
3407
cc0fdd80
LL
3408 mod_timer(&query->timer, jiffies);
3409}
3410
3411void br_multicast_open(struct net_bridge *br)
3412{
90010b36 3413 __br_multicast_open(br, &br->ip4_own_query);
cc0fdd80 3414#if IS_ENABLED(CONFIG_IPV6)
90010b36 3415 __br_multicast_open(br, &br->ip6_own_query);
cc0fdd80 3416#endif
eb1d1641
HX
3417}
3418
3419void br_multicast_stop(struct net_bridge *br)
3420{
eb1d1641 3421 del_timer_sync(&br->multicast_router_timer);
90010b36
LL
3422 del_timer_sync(&br->ip4_other_query.timer);
3423 del_timer_sync(&br->ip4_own_query.timer);
cc0fdd80 3424#if IS_ENABLED(CONFIG_IPV6)
90010b36
LL
3425 del_timer_sync(&br->ip6_other_query.timer);
3426 del_timer_sync(&br->ip6_own_query.timer);
cc0fdd80 3427#endif
e10177ab
SA
3428}
3429
3430void br_multicast_dev_del(struct net_bridge *br)
3431{
e10177ab 3432 struct net_bridge_mdb_entry *mp;
8b671779 3433 HLIST_HEAD(deleted_head);
19e3a9c9 3434 struct hlist_node *tmp;
eb1d1641
HX
3435
3436 spin_lock_bh(&br->multicast_lock);
e12cec65
NA
3437 hlist_for_each_entry_safe(mp, tmp, &br->mdb_list, mdb_node)
3438 br_multicast_del_mdb_entry(mp);
3439 hlist_move_list(&br->mcast_gc_list, &deleted_head);
eb1d1641 3440 spin_unlock_bh(&br->multicast_lock);
19e3a9c9 3441
e12cec65
NA
3442 br_multicast_gc(&deleted_head);
3443 cancel_work_sync(&br->mcast_gc_work);
8b671779 3444
4329596c 3445 rcu_barrier();
eb1d1641 3446}
0909e117
HX
3447
3448int br_multicast_set_router(struct net_bridge *br, unsigned long val)
3449{
6ae4ae8e 3450 int err = -EINVAL;
0909e117
HX
3451
3452 spin_lock_bh(&br->multicast_lock);
0909e117
HX
3453
3454 switch (val) {
7f0aec7a
NA
3455 case MDB_RTR_TYPE_DISABLED:
3456 case MDB_RTR_TYPE_PERM:
77041420 3457 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM);
0909e117 3458 del_timer(&br->multicast_router_timer);
77041420
YG
3459 br->multicast_router = val;
3460 err = 0;
3461 break;
7f0aec7a 3462 case MDB_RTR_TYPE_TEMP_QUERY:
77041420
YG
3463 if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY)
3464 br_mc_router_state_change(br, false);
0909e117
HX
3465 br->multicast_router = val;
3466 err = 0;
3467 break;
0909e117
HX
3468 }
3469
0909e117
HX
3470 spin_unlock_bh(&br->multicast_lock);
3471
3472 return err;
3473}
3474
7f0aec7a
NA
3475static void __del_port_router(struct net_bridge_port *p)
3476{
3477 if (hlist_unhashed(&p->rlist))
3478 return;
3479 hlist_del_init_rcu(&p->rlist);
3480 br_rtr_notify(p->br->dev, p, RTM_DELMDB);
6d549648 3481 br_port_mc_router_state_change(p, false);
f12e7d95
NF
3482
3483 /* don't allow timer refresh */
3484 if (p->multicast_router == MDB_RTR_TYPE_TEMP)
3485 p->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
7f0aec7a
NA
3486}
3487
0909e117
HX
3488int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
3489{
3490 struct net_bridge *br = p->br;
a55d8246 3491 unsigned long now = jiffies;
6ae4ae8e 3492 int err = -EINVAL;
0909e117
HX
3493
3494 spin_lock(&br->multicast_lock);
4950cfd1 3495 if (p->multicast_router == val) {
a55d8246
NA
3496 /* Refresh the temp router port timer */
3497 if (p->multicast_router == MDB_RTR_TYPE_TEMP)
3498 mod_timer(&p->multicast_router_timer,
3499 now + br->multicast_querier_interval);
4950cfd1
NA
3500 err = 0;
3501 goto unlock;
3502 }
0909e117 3503 switch (val) {
7f0aec7a
NA
3504 case MDB_RTR_TYPE_DISABLED:
3505 p->multicast_router = MDB_RTR_TYPE_DISABLED;
3506 __del_port_router(p);
3507 del_timer(&p->multicast_router_timer);
3508 break;
3509 case MDB_RTR_TYPE_TEMP_QUERY:
3510 p->multicast_router = MDB_RTR_TYPE_TEMP_QUERY;
3511 __del_port_router(p);
3512 break;
3513 case MDB_RTR_TYPE_PERM:
3514 p->multicast_router = MDB_RTR_TYPE_PERM;
0909e117 3515 del_timer(&p->multicast_router_timer);
0909e117
HX
3516 br_multicast_add_router(br, p);
3517 break;
a55d8246
NA
3518 case MDB_RTR_TYPE_TEMP:
3519 p->multicast_router = MDB_RTR_TYPE_TEMP;
3520 br_multicast_mark_router(br, p);
3521 break;
7f0aec7a
NA
3522 default:
3523 goto unlock;
0909e117 3524 }
7f0aec7a
NA
3525 err = 0;
3526unlock:
0909e117
HX
3527 spin_unlock(&br->multicast_lock);
3528
3529 return err;
3530}
561f1103 3531
cc0fdd80 3532static void br_multicast_start_querier(struct net_bridge *br,
90010b36 3533 struct bridge_mcast_own_query *query)
561f1103
HX
3534{
3535 struct net_bridge_port *port;
74857216 3536
cc0fdd80 3537 __br_multicast_open(br, query);
74857216 3538
c5b493ce
NA
3539 rcu_read_lock();
3540 list_for_each_entry_rcu(port, &br->port_list, list) {
74857216
HX
3541 if (port->state == BR_STATE_DISABLED ||
3542 port->state == BR_STATE_BLOCKING)
3543 continue;
3544
90010b36
LL
3545 if (query == &br->ip4_own_query)
3546 br_multicast_enable(&port->ip4_own_query);
cc0fdd80
LL
3547#if IS_ENABLED(CONFIG_IPV6)
3548 else
90010b36 3549 br_multicast_enable(&port->ip6_own_query);
cc0fdd80 3550#endif
74857216 3551 }
c5b493ce 3552 rcu_read_unlock();
74857216
HX
3553}
3554
3555int br_multicast_toggle(struct net_bridge *br, unsigned long val)
3556{
7cb3f921 3557 struct net_bridge_port *port;
851d0a73 3558 bool change_snoopers = false;
561f1103 3559
ef5e0d82 3560 spin_lock_bh(&br->multicast_lock);
13cefad2 3561 if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val)
561f1103
HX
3562 goto unlock;
3563
13cefad2
NA
3564 br_mc_disabled_update(br->dev, val);
3565 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val);
4effd28c 3566 if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
851d0a73 3567 change_snoopers = true;
561f1103 3568 goto unlock;
4effd28c 3569 }
561f1103 3570
3a7fda06
HX
3571 if (!netif_running(br->dev))
3572 goto unlock;
3573
7cb3f921
NA
3574 br_multicast_open(br);
3575 list_for_each_entry(port, &br->port_list, list)
3576 __br_multicast_enable_port(port);
561f1103 3577
851d0a73
JH
3578 change_snoopers = true;
3579
561f1103 3580unlock:
ef5e0d82 3581 spin_unlock_bh(&br->multicast_lock);
561f1103 3582
851d0a73
JH
3583 /* br_multicast_join_snoopers has the potential to cause
3584 * an MLD Report/Leave to be delivered to br_multicast_rcv,
3585 * which would in turn call br_multicast_add_group, which would
3586 * attempt to acquire multicast_lock. This function should be
3587 * called after the lock has been released to avoid deadlocks on
3588 * multicast_lock.
3589 *
3590 * br_multicast_leave_snoopers does not have the problem since
3591 * br_multicast_rcv first checks BROPT_MULTICAST_ENABLED, and
3592 * returns without calling br_multicast_ipv4/6_rcv if it's not
3593 * enabled. Moved both functions out just for symmetry.
3594 */
3595 if (change_snoopers) {
3596 if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
3597 br_multicast_join_snoopers(br);
3598 else
3599 br_multicast_leave_snoopers(br);
3600 }
3601
a26d94bf 3602 return 0;
561f1103 3603}
b195167f 3604
9341b988
IS
3605bool br_multicast_enabled(const struct net_device *dev)
3606{
3607 struct net_bridge *br = netdev_priv(dev);
3608
13cefad2 3609 return !!br_opt_get(br, BROPT_MULTICAST_ENABLED);
9341b988
IS
3610}
3611EXPORT_SYMBOL_GPL(br_multicast_enabled);
3612
0912bda4
YG
3613bool br_multicast_router(const struct net_device *dev)
3614{
3615 struct net_bridge *br = netdev_priv(dev);
3616 bool is_router;
3617
3618 spin_lock_bh(&br->multicast_lock);
3619 is_router = br_multicast_is_router(br);
3620 spin_unlock_bh(&br->multicast_lock);
3621 return is_router;
3622}
3623EXPORT_SYMBOL_GPL(br_multicast_router);
3624
c5c23260
HX
3625int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
3626{
b00589af
LL
3627 unsigned long max_delay;
3628
c5c23260
HX
3629 val = !!val;
3630
3631 spin_lock_bh(&br->multicast_lock);
675779ad 3632 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) == val)
c5c23260
HX
3633 goto unlock;
3634
675779ad 3635 br_opt_toggle(br, BROPT_MULTICAST_QUERIER, !!val);
b00589af
LL
3636 if (!val)
3637 goto unlock;
3638
3639 max_delay = br->multicast_query_response_interval;
b00589af 3640
90010b36
LL
3641 if (!timer_pending(&br->ip4_other_query.timer))
3642 br->ip4_other_query.delay_time = jiffies + max_delay;
cc0fdd80 3643
90010b36 3644 br_multicast_start_querier(br, &br->ip4_own_query);
cc0fdd80
LL
3645
3646#if IS_ENABLED(CONFIG_IPV6)
90010b36
LL
3647 if (!timer_pending(&br->ip6_other_query.timer))
3648 br->ip6_other_query.delay_time = jiffies + max_delay;
cc0fdd80 3649
90010b36 3650 br_multicast_start_querier(br, &br->ip6_own_query);
cc0fdd80 3651#endif
c5c23260
HX
3652
3653unlock:
3654 spin_unlock_bh(&br->multicast_lock);
3655
3656 return 0;
3657}
3658
5e923585
NA
3659int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val)
3660{
3661 /* Currently we support only version 2 and 3 */
3662 switch (val) {
3663 case 2:
3664 case 3:
3665 break;
3666 default:
3667 return -EINVAL;
3668 }
3669
3670 spin_lock_bh(&br->multicast_lock);
3671 br->multicast_igmp_version = val;
3672 spin_unlock_bh(&br->multicast_lock);
3673
3674 return 0;
3675}
3676
aa2ae3e7
NA
3677#if IS_ENABLED(CONFIG_IPV6)
3678int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val)
3679{
3680 /* Currently we support version 1 and 2 */
3681 switch (val) {
3682 case 1:
3683 case 2:
3684 break;
3685 default:
3686 return -EINVAL;
3687 }
3688
3689 spin_lock_bh(&br->multicast_lock);
3690 br->multicast_mld_version = val;
3691 spin_unlock_bh(&br->multicast_lock);
3692
3693 return 0;
3694}
3695#endif
3696
07f8ac4a
LL
3697/**
3698 * br_multicast_list_adjacent - Returns snooped multicast addresses
3699 * @dev: The bridge port adjacent to which to retrieve addresses
3700 * @br_ip_list: The list to store found, snooped multicast IP addresses in
3701 *
3702 * Creates a list of IP addresses (struct br_ip_list) sensed by the multicast
3703 * snooping feature on all bridge ports of dev's bridge device, excluding
3704 * the addresses from dev itself.
3705 *
3706 * Returns the number of items added to br_ip_list.
3707 *
3708 * Notes:
3709 * - br_ip_list needs to be initialized by caller
3710 * - br_ip_list might contain duplicates in the end
3711 * (needs to be taken care of by caller)
3712 * - br_ip_list needs to be freed by caller
3713 */
3714int br_multicast_list_adjacent(struct net_device *dev,
3715 struct list_head *br_ip_list)
3716{
3717 struct net_bridge *br;
3718 struct net_bridge_port *port;
3719 struct net_bridge_port_group *group;
3720 struct br_ip_list *entry;
3721 int count = 0;
3722
3723 rcu_read_lock();
35f861e3 3724 if (!br_ip_list || !netif_is_bridge_port(dev))
07f8ac4a
LL
3725 goto unlock;
3726
3727 port = br_port_get_rcu(dev);
3728 if (!port || !port->br)
3729 goto unlock;
3730
3731 br = port->br;
3732
3733 list_for_each_entry_rcu(port, &br->port_list, list) {
3734 if (!port->dev || port->dev == dev)
3735 continue;
3736
3737 hlist_for_each_entry_rcu(group, &port->mglist, mglist) {
3738 entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
3739 if (!entry)
3740 goto unlock;
3741
085b53c8 3742 entry->addr = group->key.addr;
07f8ac4a
LL
3743 list_add(&entry->list, br_ip_list);
3744 count++;
3745 }
3746 }
3747
3748unlock:
3749 rcu_read_unlock();
3750 return count;
3751}
3752EXPORT_SYMBOL_GPL(br_multicast_list_adjacent);
2cd41431 3753
c34963e2
LL
3754/**
3755 * br_multicast_has_querier_anywhere - Checks for a querier on a bridge
3756 * @dev: The bridge port providing the bridge on which to check for a querier
3757 * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
3758 *
3759 * Checks whether the given interface has a bridge on top and if so returns
3760 * true if a valid querier exists anywhere on the bridged link layer.
3761 * Otherwise returns false.
3762 */
3763bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto)
3764{
3765 struct net_bridge *br;
3766 struct net_bridge_port *port;
3767 struct ethhdr eth;
3768 bool ret = false;
3769
3770 rcu_read_lock();
35f861e3 3771 if (!netif_is_bridge_port(dev))
c34963e2
LL
3772 goto unlock;
3773
3774 port = br_port_get_rcu(dev);
3775 if (!port || !port->br)
3776 goto unlock;
3777
3778 br = port->br;
3779
3780 memset(&eth, 0, sizeof(eth));
3781 eth.h_proto = htons(proto);
3782
955062b0 3783 ret = br_multicast_querier_exists(br, &eth, NULL);
c34963e2
LL
3784
3785unlock:
3786 rcu_read_unlock();
3787 return ret;
3788}
3789EXPORT_SYMBOL_GPL(br_multicast_has_querier_anywhere);
3790
2cd41431
LL
3791/**
3792 * br_multicast_has_querier_adjacent - Checks for a querier behind a bridge port
3793 * @dev: The bridge port adjacent to which to check for a querier
3794 * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
3795 *
3796 * Checks whether the given interface has a bridge on top and if so returns
3797 * true if a selected querier is behind one of the other ports of this
3798 * bridge. Otherwise returns false.
3799 */
3800bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto)
3801{
3802 struct net_bridge *br;
3803 struct net_bridge_port *port;
3804 bool ret = false;
3805
3806 rcu_read_lock();
35f861e3 3807 if (!netif_is_bridge_port(dev))
2cd41431
LL
3808 goto unlock;
3809
3810 port = br_port_get_rcu(dev);
3811 if (!port || !port->br)
3812 goto unlock;
3813
3814 br = port->br;
3815
3816 switch (proto) {
3817 case ETH_P_IP:
3818 if (!timer_pending(&br->ip4_other_query.timer) ||
3819 rcu_dereference(br->ip4_querier.port) == port)
3820 goto unlock;
3821 break;
3993c4e1 3822#if IS_ENABLED(CONFIG_IPV6)
2cd41431
LL
3823 case ETH_P_IPV6:
3824 if (!timer_pending(&br->ip6_other_query.timer) ||
3825 rcu_dereference(br->ip6_querier.port) == port)
3826 goto unlock;
3827 break;
3993c4e1 3828#endif
2cd41431
LL
3829 default:
3830 goto unlock;
3831 }
3832
3833 ret = true;
3834unlock:
3835 rcu_read_unlock();
3836 return ret;
3837}
3838EXPORT_SYMBOL_GPL(br_multicast_has_querier_adjacent);
1080ab95
NA
3839
3840static void br_mcast_stats_add(struct bridge_mcast_stats __percpu *stats,
a65056ec 3841 const struct sk_buff *skb, u8 type, u8 dir)
1080ab95
NA
3842{
3843 struct bridge_mcast_stats *pstats = this_cpu_ptr(stats);
a65056ec
NA
3844 __be16 proto = skb->protocol;
3845 unsigned int t_len;
1080ab95
NA
3846
3847 u64_stats_update_begin(&pstats->syncp);
3848 switch (proto) {
3849 case htons(ETH_P_IP):
a65056ec 3850 t_len = ntohs(ip_hdr(skb)->tot_len) - ip_hdrlen(skb);
1080ab95
NA
3851 switch (type) {
3852 case IGMP_HOST_MEMBERSHIP_REPORT:
3853 pstats->mstats.igmp_v1reports[dir]++;
3854 break;
3855 case IGMPV2_HOST_MEMBERSHIP_REPORT:
3856 pstats->mstats.igmp_v2reports[dir]++;
3857 break;
3858 case IGMPV3_HOST_MEMBERSHIP_REPORT:
3859 pstats->mstats.igmp_v3reports[dir]++;
3860 break;
3861 case IGMP_HOST_MEMBERSHIP_QUERY:
a65056ec
NA
3862 if (t_len != sizeof(struct igmphdr)) {
3863 pstats->mstats.igmp_v3queries[dir]++;
3864 } else {
3865 unsigned int offset = skb_transport_offset(skb);
3866 struct igmphdr *ih, _ihdr;
3867
3868 ih = skb_header_pointer(skb, offset,
3869 sizeof(_ihdr), &_ihdr);
3870 if (!ih)
3871 break;
3872 if (!ih->code)
3873 pstats->mstats.igmp_v1queries[dir]++;
3874 else
3875 pstats->mstats.igmp_v2queries[dir]++;
3876 }
1080ab95
NA
3877 break;
3878 case IGMP_HOST_LEAVE_MESSAGE:
3879 pstats->mstats.igmp_leaves[dir]++;
3880 break;
3881 }
3882 break;
3883#if IS_ENABLED(CONFIG_IPV6)
3884 case htons(ETH_P_IPV6):
a65056ec
NA
3885 t_len = ntohs(ipv6_hdr(skb)->payload_len) +
3886 sizeof(struct ipv6hdr);
3887 t_len -= skb_network_header_len(skb);
1080ab95
NA
3888 switch (type) {
3889 case ICMPV6_MGM_REPORT:
3890 pstats->mstats.mld_v1reports[dir]++;
3891 break;
3892 case ICMPV6_MLD2_REPORT:
3893 pstats->mstats.mld_v2reports[dir]++;
3894 break;
3895 case ICMPV6_MGM_QUERY:
a65056ec
NA
3896 if (t_len != sizeof(struct mld_msg))
3897 pstats->mstats.mld_v2queries[dir]++;
3898 else
3899 pstats->mstats.mld_v1queries[dir]++;
1080ab95
NA
3900 break;
3901 case ICMPV6_MGM_REDUCTION:
3902 pstats->mstats.mld_leaves[dir]++;
3903 break;
3904 }
3905 break;
3906#endif /* CONFIG_IPV6 */
3907 }
3908 u64_stats_update_end(&pstats->syncp);
3909}
3910
3911void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p,
a65056ec 3912 const struct sk_buff *skb, u8 type, u8 dir)
1080ab95
NA
3913{
3914 struct bridge_mcast_stats __percpu *stats;
3915
3916 /* if multicast_disabled is true then igmp type can't be set */
675779ad 3917 if (!type || !br_opt_get(br, BROPT_MULTICAST_STATS_ENABLED))
1080ab95
NA
3918 return;
3919
3920 if (p)
3921 stats = p->mcast_stats;
3922 else
3923 stats = br->mcast_stats;
3924 if (WARN_ON(!stats))
3925 return;
3926
a65056ec 3927 br_mcast_stats_add(stats, skb, type, dir);
1080ab95
NA
3928}
3929
3930int br_multicast_init_stats(struct net_bridge *br)
3931{
3932 br->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats);
3933 if (!br->mcast_stats)
3934 return -ENOMEM;
3935
3936 return 0;
3937}
3938
b6fe0440
IS
3939void br_multicast_uninit_stats(struct net_bridge *br)
3940{
3941 free_percpu(br->mcast_stats);
3942}
3943
b3b6a84c
AB
3944/* noinline for https://bugs.llvm.org/show_bug.cgi?id=45802#c9 */
3945static noinline_for_stack void mcast_stats_add_dir(u64 *dst, u64 *src)
1080ab95
NA
3946{
3947 dst[BR_MCAST_DIR_RX] += src[BR_MCAST_DIR_RX];
3948 dst[BR_MCAST_DIR_TX] += src[BR_MCAST_DIR_TX];
3949}
3950
3951void br_multicast_get_stats(const struct net_bridge *br,
3952 const struct net_bridge_port *p,
3953 struct br_mcast_stats *dest)
3954{
3955 struct bridge_mcast_stats __percpu *stats;
3956 struct br_mcast_stats tdst;
3957 int i;
3958
3959 memset(dest, 0, sizeof(*dest));
3960 if (p)
3961 stats = p->mcast_stats;
3962 else
3963 stats = br->mcast_stats;
3964 if (WARN_ON(!stats))
3965 return;
3966
3967 memset(&tdst, 0, sizeof(tdst));
3968 for_each_possible_cpu(i) {
3969 struct bridge_mcast_stats *cpu_stats = per_cpu_ptr(stats, i);
3970 struct br_mcast_stats temp;
3971 unsigned int start;
3972
3973 do {
3974 start = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
3975 memcpy(&temp, &cpu_stats->mstats, sizeof(temp));
3976 } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start));
3977
a65056ec
NA
3978 mcast_stats_add_dir(tdst.igmp_v1queries, temp.igmp_v1queries);
3979 mcast_stats_add_dir(tdst.igmp_v2queries, temp.igmp_v2queries);
3980 mcast_stats_add_dir(tdst.igmp_v3queries, temp.igmp_v3queries);
1080ab95
NA
3981 mcast_stats_add_dir(tdst.igmp_leaves, temp.igmp_leaves);
3982 mcast_stats_add_dir(tdst.igmp_v1reports, temp.igmp_v1reports);
3983 mcast_stats_add_dir(tdst.igmp_v2reports, temp.igmp_v2reports);
3984 mcast_stats_add_dir(tdst.igmp_v3reports, temp.igmp_v3reports);
3985 tdst.igmp_parse_errors += temp.igmp_parse_errors;
3986
a65056ec
NA
3987 mcast_stats_add_dir(tdst.mld_v1queries, temp.mld_v1queries);
3988 mcast_stats_add_dir(tdst.mld_v2queries, temp.mld_v2queries);
1080ab95
NA
3989 mcast_stats_add_dir(tdst.mld_leaves, temp.mld_leaves);
3990 mcast_stats_add_dir(tdst.mld_v1reports, temp.mld_v1reports);
3991 mcast_stats_add_dir(tdst.mld_v2reports, temp.mld_v2reports);
3992 tdst.mld_parse_errors += temp.mld_parse_errors;
3993 }
3994 memcpy(dest, &tdst, sizeof(*dest));
3995}
19e3a9c9
NA
3996
3997int br_mdb_hash_init(struct net_bridge *br)
3998{
085b53c8
NA
3999 int err;
4000
4001 err = rhashtable_init(&br->sg_port_tbl, &br_sg_port_rht_params);
4002 if (err)
4003 return err;
4004
4005 err = rhashtable_init(&br->mdb_hash_tbl, &br_mdb_rht_params);
4006 if (err) {
4007 rhashtable_destroy(&br->sg_port_tbl);
4008 return err;
4009 }
4010
4011 return 0;
19e3a9c9
NA
4012}
4013
4014void br_mdb_hash_fini(struct net_bridge *br)
4015{
085b53c8 4016 rhashtable_destroy(&br->sg_port_tbl);
19e3a9c9
NA
4017 rhashtable_destroy(&br->mdb_hash_tbl);
4018}