bridge: multicast: notify on group delete
[deliverable/linux.git] / net / bridge / br_multicast.c
CommitLineData
eb1d1641
HX
1/*
2 * Bridge multicast support.
3 *
4 * Copyright (c) 2010 Herbert Xu <herbert@gondor.apana.org.au>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
9 * any later version.
10 *
11 */
12
13#include <linux/err.h>
07f8ac4a 14#include <linux/export.h>
eb1d1641
HX
15#include <linux/if_ether.h>
16#include <linux/igmp.h>
17#include <linux/jhash.h>
18#include <linux/kernel.h>
b195167f 19#include <linux/log2.h>
eb1d1641
HX
20#include <linux/netdevice.h>
21#include <linux/netfilter_bridge.h>
22#include <linux/random.h>
23#include <linux/rculist.h>
24#include <linux/skbuff.h>
25#include <linux/slab.h>
26#include <linux/timer.h>
1c8ad5bf 27#include <linux/inetdevice.h>
eb1d1641 28#include <net/ip.h>
dfd56b8b 29#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
30#include <net/ipv6.h>
31#include <net/mld.h>
d4c4f07d 32#include <net/ip6_checksum.h>
3c3769e6 33#include <net/addrconf.h>
08b202b6 34#endif
eb1d1641
HX
35
36#include "br_private.h"
37
cc0fdd80 38static void br_multicast_start_querier(struct net_bridge *br,
90010b36 39 struct bridge_mcast_own_query *query);
754bc547
SA
40static void br_multicast_add_router(struct net_bridge *br,
41 struct net_bridge_port *port);
2ce297fc 42unsigned int br_mdb_rehash_seq;
c83b8fab 43
8ef2a9a5
YH
44static inline int br_ip_equal(const struct br_ip *a, const struct br_ip *b)
45{
46 if (a->proto != b->proto)
47 return 0;
b0e9a30d
VY
48 if (a->vid != b->vid)
49 return 0;
8ef2a9a5
YH
50 switch (a->proto) {
51 case htons(ETH_P_IP):
52 return a->u.ip4 == b->u.ip4;
dfd56b8b 53#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
54 case htons(ETH_P_IPV6):
55 return ipv6_addr_equal(&a->u.ip6, &b->u.ip6);
56#endif
8ef2a9a5
YH
57 }
58 return 0;
59}
60
b0e9a30d
VY
61static inline int __br_ip4_hash(struct net_bridge_mdb_htable *mdb, __be32 ip,
62 __u16 vid)
eb1d1641 63{
b0e9a30d 64 return jhash_2words((__force u32)ip, vid, mdb->secret) & (mdb->max - 1);
eb1d1641
HX
65}
66
dfd56b8b 67#if IS_ENABLED(CONFIG_IPV6)
08b202b6 68static inline int __br_ip6_hash(struct net_bridge_mdb_htable *mdb,
b0e9a30d
VY
69 const struct in6_addr *ip,
70 __u16 vid)
08b202b6 71{
b0e9a30d
VY
72 return jhash_2words(ipv6_addr_hash(ip), vid,
73 mdb->secret) & (mdb->max - 1);
08b202b6
YH
74}
75#endif
76
8ef2a9a5
YH
77static inline int br_ip_hash(struct net_bridge_mdb_htable *mdb,
78 struct br_ip *ip)
79{
80 switch (ip->proto) {
81 case htons(ETH_P_IP):
b0e9a30d 82 return __br_ip4_hash(mdb, ip->u.ip4, ip->vid);
dfd56b8b 83#if IS_ENABLED(CONFIG_IPV6)
08b202b6 84 case htons(ETH_P_IPV6):
b0e9a30d 85 return __br_ip6_hash(mdb, &ip->u.ip6, ip->vid);
08b202b6 86#endif
8ef2a9a5
YH
87 }
88 return 0;
eb1d1641
HX
89}
90
91static struct net_bridge_mdb_entry *__br_mdb_ip_get(
8ef2a9a5 92 struct net_bridge_mdb_htable *mdb, struct br_ip *dst, int hash)
eb1d1641
HX
93{
94 struct net_bridge_mdb_entry *mp;
eb1d1641 95
b67bfe0d 96 hlist_for_each_entry_rcu(mp, &mdb->mhash[hash], hlist[mdb->ver]) {
8ef2a9a5 97 if (br_ip_equal(&mp->addr, dst))
eb1d1641
HX
98 return mp;
99 }
100
101 return NULL;
102}
103
cfd56754
CW
104struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge_mdb_htable *mdb,
105 struct br_ip *dst)
7f285fa7
HX
106{
107 if (!mdb)
108 return NULL;
109
110 return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst));
111}
112
8ef2a9a5 113static struct net_bridge_mdb_entry *br_mdb_ip4_get(
b0e9a30d 114 struct net_bridge_mdb_htable *mdb, __be32 dst, __u16 vid)
eb1d1641 115{
8ef2a9a5
YH
116 struct br_ip br_dst;
117
118 br_dst.u.ip4 = dst;
119 br_dst.proto = htons(ETH_P_IP);
b0e9a30d 120 br_dst.vid = vid;
0821ec55 121
7f285fa7 122 return br_mdb_ip_get(mdb, &br_dst);
8ef2a9a5
YH
123}
124
dfd56b8b 125#if IS_ENABLED(CONFIG_IPV6)
08b202b6 126static struct net_bridge_mdb_entry *br_mdb_ip6_get(
b0e9a30d
VY
127 struct net_bridge_mdb_htable *mdb, const struct in6_addr *dst,
128 __u16 vid)
08b202b6
YH
129{
130 struct br_ip br_dst;
0821ec55 131
4e3fd7a0 132 br_dst.u.ip6 = *dst;
08b202b6 133 br_dst.proto = htons(ETH_P_IPV6);
b0e9a30d 134 br_dst.vid = vid;
08b202b6 135
7f285fa7 136 return br_mdb_ip_get(mdb, &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{
e8051688 143 struct net_bridge_mdb_htable *mdb = rcu_dereference(br->mdb);
8ef2a9a5
YH
144 struct br_ip ip;
145
7f285fa7 146 if (br->multicast_disabled)
eb1d1641
HX
147 return NULL;
148
8ef2a9a5 149 if (BR_INPUT_SKB_CB(skb)->igmp)
eb1d1641
HX
150 return NULL;
151
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):
8ef2a9a5
YH
157 ip.u.ip4 = ip_hdr(skb)->daddr;
158 break;
dfd56b8b 159#if IS_ENABLED(CONFIG_IPV6)
08b202b6 160 case htons(ETH_P_IPV6):
4e3fd7a0 161 ip.u.ip6 = ipv6_hdr(skb)->daddr;
08b202b6
YH
162 break;
163#endif
8ef2a9a5
YH
164 default:
165 return NULL;
eb1d1641
HX
166 }
167
8ef2a9a5 168 return br_mdb_ip_get(mdb, &ip);
eb1d1641
HX
169}
170
171static void br_mdb_free(struct rcu_head *head)
172{
173 struct net_bridge_mdb_htable *mdb =
174 container_of(head, struct net_bridge_mdb_htable, rcu);
175 struct net_bridge_mdb_htable *old = mdb->old;
176
177 mdb->old = NULL;
178 kfree(old->mhash);
179 kfree(old);
180}
181
182static int br_mdb_copy(struct net_bridge_mdb_htable *new,
183 struct net_bridge_mdb_htable *old,
184 int elasticity)
185{
186 struct net_bridge_mdb_entry *mp;
eb1d1641
HX
187 int maxlen;
188 int len;
189 int i;
190
191 for (i = 0; i < old->max; i++)
b67bfe0d 192 hlist_for_each_entry(mp, &old->mhash[i], hlist[old->ver])
eb1d1641 193 hlist_add_head(&mp->hlist[new->ver],
8ef2a9a5 194 &new->mhash[br_ip_hash(new, &mp->addr)]);
eb1d1641
HX
195
196 if (!elasticity)
197 return 0;
198
199 maxlen = 0;
200 for (i = 0; i < new->max; i++) {
201 len = 0;
b67bfe0d 202 hlist_for_each_entry(mp, &new->mhash[i], hlist[new->ver])
eb1d1641
HX
203 len++;
204 if (len > maxlen)
205 maxlen = len;
206 }
207
208 return maxlen > elasticity ? -EINVAL : 0;
209}
210
cfd56754 211void br_multicast_free_pg(struct rcu_head *head)
eb1d1641
HX
212{
213 struct net_bridge_port_group *p =
214 container_of(head, struct net_bridge_port_group, rcu);
215
216 kfree(p);
217}
218
219static void br_multicast_free_group(struct rcu_head *head)
220{
221 struct net_bridge_mdb_entry *mp =
222 container_of(head, struct net_bridge_mdb_entry, rcu);
223
224 kfree(mp);
225}
226
227static void br_multicast_group_expired(unsigned long data)
228{
229 struct net_bridge_mdb_entry *mp = (void *)data;
230 struct net_bridge *br = mp->br;
231 struct net_bridge_mdb_htable *mdb;
232
233 spin_lock(&br->multicast_lock);
234 if (!netif_running(br->dev) || timer_pending(&mp->timer))
235 goto out;
236
8a870178 237 mp->mglist = false;
eb1d1641
HX
238
239 if (mp->ports)
240 goto out;
241
e8051688
ED
242 mdb = mlock_dereference(br->mdb, br);
243
eb1d1641
HX
244 hlist_del_rcu(&mp->hlist[mdb->ver]);
245 mdb->size--;
246
eb1d1641
HX
247 call_rcu_bh(&mp->rcu, br_multicast_free_group);
248
249out:
250 spin_unlock(&br->multicast_lock);
251}
252
253static void br_multicast_del_pg(struct net_bridge *br,
254 struct net_bridge_port_group *pg)
255{
e8051688 256 struct net_bridge_mdb_htable *mdb;
eb1d1641
HX
257 struct net_bridge_mdb_entry *mp;
258 struct net_bridge_port_group *p;
e8051688
ED
259 struct net_bridge_port_group __rcu **pp;
260
261 mdb = mlock_dereference(br->mdb, br);
eb1d1641 262
8ef2a9a5 263 mp = br_mdb_ip_get(mdb, &pg->addr);
eb1d1641
HX
264 if (WARN_ON(!mp))
265 return;
266
e8051688
ED
267 for (pp = &mp->ports;
268 (p = mlock_dereference(*pp, br)) != NULL;
269 pp = &p->next) {
eb1d1641
HX
270 if (p != pg)
271 continue;
272
83f6a740 273 rcu_assign_pointer(*pp, p->next);
eb1d1641
HX
274 hlist_del_init(&p->mglist);
275 del_timer(&p->timer);
ef8299de
NA
276 br_mdb_notify(br->dev, p->port, &pg->addr, RTM_DELMDB,
277 p->state);
eb1d1641
HX
278 call_rcu_bh(&p->rcu, br_multicast_free_pg);
279
454594f3 280 if (!mp->ports && !mp->mglist &&
eb1d1641
HX
281 netif_running(br->dev))
282 mod_timer(&mp->timer, jiffies);
283
284 return;
285 }
286
287 WARN_ON(1);
288}
289
290static void br_multicast_port_group_expired(unsigned long data)
291{
292 struct net_bridge_port_group *pg = (void *)data;
293 struct net_bridge *br = pg->port->br;
294
295 spin_lock(&br->multicast_lock);
296 if (!netif_running(br->dev) || timer_pending(&pg->timer) ||
ccb1c31a 297 hlist_unhashed(&pg->mglist) || pg->state & MDB_PERMANENT)
eb1d1641
HX
298 goto out;
299
300 br_multicast_del_pg(br, pg);
301
302out:
303 spin_unlock(&br->multicast_lock);
304}
305
e8051688 306static int br_mdb_rehash(struct net_bridge_mdb_htable __rcu **mdbp, int max,
eb1d1641
HX
307 int elasticity)
308{
e8051688 309 struct net_bridge_mdb_htable *old = rcu_dereference_protected(*mdbp, 1);
eb1d1641
HX
310 struct net_bridge_mdb_htable *mdb;
311 int err;
312
313 mdb = kmalloc(sizeof(*mdb), GFP_ATOMIC);
314 if (!mdb)
315 return -ENOMEM;
316
317 mdb->max = max;
318 mdb->old = old;
319
320 mdb->mhash = kzalloc(max * sizeof(*mdb->mhash), GFP_ATOMIC);
321 if (!mdb->mhash) {
322 kfree(mdb);
323 return -ENOMEM;
324 }
325
326 mdb->size = old ? old->size : 0;
327 mdb->ver = old ? old->ver ^ 1 : 0;
328
329 if (!old || elasticity)
330 get_random_bytes(&mdb->secret, sizeof(mdb->secret));
331 else
332 mdb->secret = old->secret;
333
334 if (!old)
335 goto out;
336
337 err = br_mdb_copy(mdb, old, elasticity);
338 if (err) {
339 kfree(mdb->mhash);
340 kfree(mdb);
341 return err;
342 }
343
2ce297fc 344 br_mdb_rehash_seq++;
eb1d1641
HX
345 call_rcu_bh(&mdb->rcu, br_mdb_free);
346
347out:
348 rcu_assign_pointer(*mdbp, mdb);
349
350 return 0;
351}
352
8ef2a9a5
YH
353static struct sk_buff *br_ip4_multicast_alloc_query(struct net_bridge *br,
354 __be32 group)
eb1d1641
HX
355{
356 struct sk_buff *skb;
357 struct igmphdr *ih;
358 struct ethhdr *eth;
359 struct iphdr *iph;
360
361 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*iph) +
362 sizeof(*ih) + 4);
363 if (!skb)
364 goto out;
365
366 skb->protocol = htons(ETH_P_IP);
367
368 skb_reset_mac_header(skb);
369 eth = eth_hdr(skb);
370
e5a727f6 371 ether_addr_copy(eth->h_source, br->dev->dev_addr);
eb1d1641
HX
372 eth->h_dest[0] = 1;
373 eth->h_dest[1] = 0;
374 eth->h_dest[2] = 0x5e;
375 eth->h_dest[3] = 0;
376 eth->h_dest[4] = 0;
377 eth->h_dest[5] = 1;
378 eth->h_proto = htons(ETH_P_IP);
379 skb_put(skb, sizeof(*eth));
380
381 skb_set_network_header(skb, skb->len);
382 iph = ip_hdr(skb);
383
384 iph->version = 4;
385 iph->ihl = 6;
386 iph->tos = 0xc0;
387 iph->tot_len = htons(sizeof(*iph) + sizeof(*ih) + 4);
388 iph->id = 0;
389 iph->frag_off = htons(IP_DF);
390 iph->ttl = 1;
391 iph->protocol = IPPROTO_IGMP;
1c8ad5bf
CW
392 iph->saddr = br->multicast_query_use_ifaddr ?
393 inet_select_addr(br->dev, 0, RT_SCOPE_LINK) : 0;
eb1d1641
HX
394 iph->daddr = htonl(INADDR_ALLHOSTS_GROUP);
395 ((u8 *)&iph[1])[0] = IPOPT_RA;
396 ((u8 *)&iph[1])[1] = 4;
397 ((u8 *)&iph[1])[2] = 0;
398 ((u8 *)&iph[1])[3] = 0;
399 ip_send_check(iph);
400 skb_put(skb, 24);
401
402 skb_set_transport_header(skb, skb->len);
403 ih = igmp_hdr(skb);
404 ih->type = IGMP_HOST_MEMBERSHIP_QUERY;
405 ih->code = (group ? br->multicast_last_member_interval :
406 br->multicast_query_response_interval) /
407 (HZ / IGMP_TIMER_SCALE);
408 ih->group = group;
409 ih->csum = 0;
410 ih->csum = ip_compute_csum((void *)ih, sizeof(struct igmphdr));
411 skb_put(skb, sizeof(*ih));
412
413 __skb_pull(skb, sizeof(*eth));
414
415out:
416 return skb;
417}
418
dfd56b8b 419#if IS_ENABLED(CONFIG_IPV6)
08b202b6 420static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
b71d1d42 421 const struct in6_addr *group)
08b202b6
YH
422{
423 struct sk_buff *skb;
424 struct ipv6hdr *ip6h;
425 struct mld_msg *mldq;
426 struct ethhdr *eth;
427 u8 *hopopt;
428 unsigned long interval;
429
430 skb = netdev_alloc_skb_ip_align(br->dev, sizeof(*eth) + sizeof(*ip6h) +
431 8 + sizeof(*mldq));
432 if (!skb)
433 goto out;
434
435 skb->protocol = htons(ETH_P_IPV6);
436
437 /* Ethernet header */
438 skb_reset_mac_header(skb);
439 eth = eth_hdr(skb);
440
e5a727f6 441 ether_addr_copy(eth->h_source, br->dev->dev_addr);
08b202b6
YH
442 eth->h_proto = htons(ETH_P_IPV6);
443 skb_put(skb, sizeof(*eth));
444
445 /* IPv6 header + HbH option */
446 skb_set_network_header(skb, skb->len);
447 ip6h = ipv6_hdr(skb);
448
449 *(__force __be32 *)ip6h = htonl(0x60000000);
76d66158 450 ip6h->payload_len = htons(8 + sizeof(*mldq));
08b202b6
YH
451 ip6h->nexthdr = IPPROTO_HOPOPTS;
452 ip6h->hop_limit = 1;
a7bff75b 453 ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1));
d1d81d4c
UW
454 if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0,
455 &ip6h->saddr)) {
456 kfree_skb(skb);
457 return NULL;
458 }
36cff5a1 459 ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest);
08b202b6
YH
460
461 hopopt = (u8 *)(ip6h + 1);
462 hopopt[0] = IPPROTO_ICMPV6; /* next hdr */
463 hopopt[1] = 0; /* length of HbH */
464 hopopt[2] = IPV6_TLV_ROUTERALERT; /* Router Alert */
465 hopopt[3] = 2; /* Length of RA Option */
466 hopopt[4] = 0; /* Type = 0x0000 (MLD) */
467 hopopt[5] = 0;
1de5a71c
EZ
468 hopopt[6] = IPV6_TLV_PAD1; /* Pad1 */
469 hopopt[7] = IPV6_TLV_PAD1; /* Pad1 */
08b202b6
YH
470
471 skb_put(skb, sizeof(*ip6h) + 8);
472
473 /* ICMPv6 */
474 skb_set_transport_header(skb, skb->len);
475 mldq = (struct mld_msg *) icmp6_hdr(skb);
476
32de868c
LL
477 interval = ipv6_addr_any(group) ?
478 br->multicast_query_response_interval :
479 br->multicast_last_member_interval;
08b202b6
YH
480
481 mldq->mld_type = ICMPV6_MGM_QUERY;
482 mldq->mld_code = 0;
483 mldq->mld_cksum = 0;
484 mldq->mld_maxdelay = htons((u16)jiffies_to_msecs(interval));
485 mldq->mld_reserved = 0;
4e3fd7a0 486 mldq->mld_mca = *group;
08b202b6
YH
487
488 /* checksum */
489 mldq->mld_cksum = csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
490 sizeof(*mldq), IPPROTO_ICMPV6,
491 csum_partial(mldq,
492 sizeof(*mldq), 0));
493 skb_put(skb, sizeof(*mldq));
494
495 __skb_pull(skb, sizeof(*eth));
496
497out:
498 return skb;
499}
500#endif
501
8ef2a9a5
YH
502static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br,
503 struct br_ip *addr)
504{
505 switch (addr->proto) {
506 case htons(ETH_P_IP):
507 return br_ip4_multicast_alloc_query(br, addr->u.ip4);
dfd56b8b 508#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
509 case htons(ETH_P_IPV6):
510 return br_ip6_multicast_alloc_query(br, &addr->u.ip6);
511#endif
8ef2a9a5
YH
512 }
513 return NULL;
514}
515
eb1d1641 516static struct net_bridge_mdb_entry *br_multicast_get_group(
8ef2a9a5
YH
517 struct net_bridge *br, struct net_bridge_port *port,
518 struct br_ip *group, int hash)
eb1d1641 519{
e8051688 520 struct net_bridge_mdb_htable *mdb;
eb1d1641 521 struct net_bridge_mdb_entry *mp;
95c96174
ED
522 unsigned int count = 0;
523 unsigned int max;
eb1d1641
HX
524 int elasticity;
525 int err;
526
e8051688 527 mdb = rcu_dereference_protected(br->mdb, 1);
b67bfe0d 528 hlist_for_each_entry(mp, &mdb->mhash[hash], hlist[mdb->ver]) {
eb1d1641 529 count++;
8ef2a9a5 530 if (unlikely(br_ip_equal(group, &mp->addr)))
eb1d1641 531 return mp;
eb1d1641
HX
532 }
533
534 elasticity = 0;
535 max = mdb->max;
536
537 if (unlikely(count > br->hash_elasticity && count)) {
538 if (net_ratelimit())
28a16c97 539 br_info(br, "Multicast hash table "
540 "chain limit reached: %s\n",
541 port ? port->dev->name : br->dev->name);
eb1d1641
HX
542
543 elasticity = br->hash_elasticity;
544 }
545
546 if (mdb->size >= max) {
547 max *= 2;
036be6db
TG
548 if (unlikely(max > br->hash_max)) {
549 br_warn(br, "Multicast hash table maximum of %d "
550 "reached, disabling snooping: %s\n",
551 br->hash_max,
552 port ? port->dev->name : br->dev->name);
eb1d1641
HX
553 err = -E2BIG;
554disable:
555 br->multicast_disabled = 1;
556 goto err;
557 }
558 }
559
560 if (max > mdb->max || elasticity) {
561 if (mdb->old) {
562 if (net_ratelimit())
28a16c97 563 br_info(br, "Multicast hash table "
564 "on fire: %s\n",
565 port ? port->dev->name : br->dev->name);
eb1d1641
HX
566 err = -EEXIST;
567 goto err;
568 }
569
570 err = br_mdb_rehash(&br->mdb, max, elasticity);
571 if (err) {
28a16c97 572 br_warn(br, "Cannot rehash multicast "
573 "hash table, disabling snooping: %s, %d, %d\n",
574 port ? port->dev->name : br->dev->name,
575 mdb->size, err);
eb1d1641
HX
576 goto disable;
577 }
578
579 err = -EAGAIN;
580 goto err;
581 }
582
583 return NULL;
584
585err:
586 mp = ERR_PTR(err);
587 return mp;
588}
589
cfd56754
CW
590struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
591 struct net_bridge_port *port, struct br_ip *group)
eb1d1641 592{
e8051688 593 struct net_bridge_mdb_htable *mdb;
eb1d1641
HX
594 struct net_bridge_mdb_entry *mp;
595 int hash;
4c0833bc 596 int err;
eb1d1641 597
e8051688 598 mdb = rcu_dereference_protected(br->mdb, 1);
eb1d1641 599 if (!mdb) {
4c0833bc
TK
600 err = br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0);
601 if (err)
602 return ERR_PTR(err);
eb1d1641
HX
603 goto rehash;
604 }
605
606 hash = br_ip_hash(mdb, group);
607 mp = br_multicast_get_group(br, port, group, hash);
608 switch (PTR_ERR(mp)) {
609 case 0:
610 break;
611
612 case -EAGAIN:
613rehash:
e8051688 614 mdb = rcu_dereference_protected(br->mdb, 1);
eb1d1641
HX
615 hash = br_ip_hash(mdb, group);
616 break;
617
618 default:
619 goto out;
620 }
621
622 mp = kzalloc(sizeof(*mp), GFP_ATOMIC);
623 if (unlikely(!mp))
4c0833bc 624 return ERR_PTR(-ENOMEM);
eb1d1641
HX
625
626 mp->br = br;
8ef2a9a5 627 mp->addr = *group;
1faabf2a
ED
628 setup_timer(&mp->timer, br_multicast_group_expired,
629 (unsigned long)mp);
630
eb1d1641
HX
631 hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]);
632 mdb->size++;
633
634out:
635 return mp;
636}
637
cfd56754
CW
638struct net_bridge_port_group *br_multicast_new_port_group(
639 struct net_bridge_port *port,
640 struct br_ip *group,
ccb1c31a
AW
641 struct net_bridge_port_group __rcu *next,
642 unsigned char state)
cfd56754
CW
643{
644 struct net_bridge_port_group *p;
645
646 p = kzalloc(sizeof(*p), GFP_ATOMIC);
647 if (unlikely(!p))
648 return NULL;
649
650 p->addr = *group;
651 p->port = port;
ccb1c31a 652 p->state = state;
eca2a43b 653 rcu_assign_pointer(p->next, next);
cfd56754
CW
654 hlist_add_head(&p->mglist, &port->mglist);
655 setup_timer(&p->timer, br_multicast_port_group_expired,
656 (unsigned long)p);
657 return p;
658}
659
eb1d1641 660static int br_multicast_add_group(struct net_bridge *br,
8ef2a9a5
YH
661 struct net_bridge_port *port,
662 struct br_ip *group)
eb1d1641
HX
663{
664 struct net_bridge_mdb_entry *mp;
665 struct net_bridge_port_group *p;
e8051688 666 struct net_bridge_port_group __rcu **pp;
454594f3 667 unsigned long now = jiffies;
eb1d1641
HX
668 int err;
669
eb1d1641
HX
670 spin_lock(&br->multicast_lock);
671 if (!netif_running(br->dev) ||
672 (port && port->state == BR_STATE_DISABLED))
673 goto out;
674
675 mp = br_multicast_new_group(br, port, group);
676 err = PTR_ERR(mp);
4c0833bc 677 if (IS_ERR(mp))
eb1d1641
HX
678 goto err;
679
680 if (!port) {
8a870178 681 mp->mglist = true;
454594f3 682 mod_timer(&mp->timer, now + br->multicast_membership_interval);
eb1d1641
HX
683 goto out;
684 }
685
e8051688
ED
686 for (pp = &mp->ports;
687 (p = mlock_dereference(*pp, br)) != NULL;
688 pp = &p->next) {
eb1d1641 689 if (p->port == port)
454594f3 690 goto found;
eb1d1641
HX
691 if ((unsigned long)p->port < (unsigned long)port)
692 break;
693 }
694
ccb1c31a 695 p = br_multicast_new_port_group(port, group, *pp, MDB_TEMPORARY);
eb1d1641
HX
696 if (unlikely(!p))
697 goto err;
eb1d1641 698 rcu_assign_pointer(*pp, p);
09cf0211 699 br_mdb_notify(br->dev, port, group, RTM_NEWMDB, MDB_TEMPORARY);
eb1d1641 700
454594f3
LL
701found:
702 mod_timer(&p->timer, now + br->multicast_membership_interval);
eb1d1641
HX
703out:
704 err = 0;
705
706err:
707 spin_unlock(&br->multicast_lock);
708 return err;
709}
710
8ef2a9a5
YH
711static int br_ip4_multicast_add_group(struct net_bridge *br,
712 struct net_bridge_port *port,
b0e9a30d
VY
713 __be32 group,
714 __u16 vid)
8ef2a9a5
YH
715{
716 struct br_ip br_group;
717
718 if (ipv4_is_local_multicast(group))
719 return 0;
720
721 br_group.u.ip4 = group;
722 br_group.proto = htons(ETH_P_IP);
b0e9a30d 723 br_group.vid = vid;
8ef2a9a5
YH
724
725 return br_multicast_add_group(br, port, &br_group);
726}
727
dfd56b8b 728#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
729static int br_ip6_multicast_add_group(struct net_bridge *br,
730 struct net_bridge_port *port,
b0e9a30d
VY
731 const struct in6_addr *group,
732 __u16 vid)
08b202b6
YH
733{
734 struct br_ip br_group;
735
3c3769e6 736 if (ipv6_addr_is_ll_all_nodes(group))
08b202b6
YH
737 return 0;
738
4e3fd7a0 739 br_group.u.ip6 = *group;
9cc6e0c4 740 br_group.proto = htons(ETH_P_IPV6);
b0e9a30d 741 br_group.vid = vid;
08b202b6
YH
742
743 return br_multicast_add_group(br, port, &br_group);
744}
745#endif
746
eb1d1641
HX
747static void br_multicast_router_expired(unsigned long data)
748{
749 struct net_bridge_port *port = (void *)data;
750 struct net_bridge *br = port->br;
751
752 spin_lock(&br->multicast_lock);
753 if (port->multicast_router != 1 ||
754 timer_pending(&port->multicast_router_timer) ||
755 hlist_unhashed(&port->rlist))
756 goto out;
757
758 hlist_del_init_rcu(&port->rlist);
759
760out:
761 spin_unlock(&br->multicast_lock);
762}
763
764static void br_multicast_local_router_expired(unsigned long data)
765{
766}
767
cc0fdd80 768static void br_multicast_querier_expired(struct net_bridge *br,
90010b36 769 struct bridge_mcast_own_query *query)
c83b8fab 770{
c83b8fab
HX
771 spin_lock(&br->multicast_lock);
772 if (!netif_running(br->dev) || br->multicast_disabled)
773 goto out;
774
cc0fdd80 775 br_multicast_start_querier(br, query);
c83b8fab
HX
776
777out:
778 spin_unlock(&br->multicast_lock);
779}
780
cc0fdd80
LL
781static void br_ip4_multicast_querier_expired(unsigned long data)
782{
783 struct net_bridge *br = (void *)data;
784
90010b36 785 br_multicast_querier_expired(br, &br->ip4_own_query);
cc0fdd80
LL
786}
787
788#if IS_ENABLED(CONFIG_IPV6)
789static void br_ip6_multicast_querier_expired(unsigned long data)
790{
791 struct net_bridge *br = (void *)data;
792
90010b36 793 br_multicast_querier_expired(br, &br->ip6_own_query);
cc0fdd80
LL
794}
795#endif
796
dc4eb53a
LL
797static void br_multicast_select_own_querier(struct net_bridge *br,
798 struct br_ip *ip,
799 struct sk_buff *skb)
800{
801 if (ip->proto == htons(ETH_P_IP))
802 br->ip4_querier.addr.u.ip4 = ip_hdr(skb)->saddr;
803#if IS_ENABLED(CONFIG_IPV6)
804 else
805 br->ip6_querier.addr.u.ip6 = ipv6_hdr(skb)->saddr;
806#endif
807}
808
8ef2a9a5
YH
809static void __br_multicast_send_query(struct net_bridge *br,
810 struct net_bridge_port *port,
811 struct br_ip *ip)
eb1d1641 812{
eb1d1641
HX
813 struct sk_buff *skb;
814
8ef2a9a5 815 skb = br_multicast_alloc_query(br, ip);
eb1d1641 816 if (!skb)
8ef2a9a5 817 return;
eb1d1641
HX
818
819 if (port) {
eb1d1641 820 skb->dev = port->dev;
7026b1dd
DM
821 NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, NULL, skb,
822 NULL, skb->dev,
f0b4eece 823 br_dev_queue_push_xmit);
dc4eb53a
LL
824 } else {
825 br_multicast_select_own_querier(br, ip, skb);
eb1d1641 826 netif_rx(skb);
dc4eb53a 827 }
8ef2a9a5
YH
828}
829
830static void br_multicast_send_query(struct net_bridge *br,
cc0fdd80 831 struct net_bridge_port *port,
90010b36 832 struct bridge_mcast_own_query *own_query)
8ef2a9a5
YH
833{
834 unsigned long time;
835 struct br_ip br_group;
90010b36 836 struct bridge_mcast_other_query *other_query = NULL;
8ef2a9a5
YH
837
838 if (!netif_running(br->dev) || br->multicast_disabled ||
cc0fdd80 839 !br->multicast_querier)
8ef2a9a5
YH
840 return;
841
08b202b6
YH
842 memset(&br_group.u, 0, sizeof(br_group.u));
843
90010b36
LL
844 if (port ? (own_query == &port->ip4_own_query) :
845 (own_query == &br->ip4_own_query)) {
846 other_query = &br->ip4_other_query;
cc0fdd80 847 br_group.proto = htons(ETH_P_IP);
dfd56b8b 848#if IS_ENABLED(CONFIG_IPV6)
cc0fdd80 849 } else {
90010b36 850 other_query = &br->ip6_other_query;
cc0fdd80 851 br_group.proto = htons(ETH_P_IPV6);
08b202b6 852#endif
cc0fdd80
LL
853 }
854
90010b36 855 if (!other_query || timer_pending(&other_query->timer))
cc0fdd80
LL
856 return;
857
858 __br_multicast_send_query(br, port, &br_group);
eb1d1641 859
eb1d1641 860 time = jiffies;
90010b36 861 time += own_query->startup_sent < br->multicast_startup_query_count ?
eb1d1641
HX
862 br->multicast_startup_query_interval :
863 br->multicast_query_interval;
90010b36 864 mod_timer(&own_query->timer, time);
eb1d1641
HX
865}
866
90010b36
LL
867static void
868br_multicast_port_query_expired(struct net_bridge_port *port,
869 struct bridge_mcast_own_query *query)
eb1d1641 870{
eb1d1641
HX
871 struct net_bridge *br = port->br;
872
873 spin_lock(&br->multicast_lock);
02a780c0
DC
874 if (port->state == BR_STATE_DISABLED ||
875 port->state == BR_STATE_BLOCKING)
eb1d1641
HX
876 goto out;
877
cc0fdd80
LL
878 if (query->startup_sent < br->multicast_startup_query_count)
879 query->startup_sent++;
eb1d1641 880
cc0fdd80 881 br_multicast_send_query(port->br, port, query);
eb1d1641
HX
882
883out:
884 spin_unlock(&br->multicast_lock);
885}
886
cc0fdd80
LL
887static void br_ip4_multicast_port_query_expired(unsigned long data)
888{
889 struct net_bridge_port *port = (void *)data;
890
90010b36 891 br_multicast_port_query_expired(port, &port->ip4_own_query);
cc0fdd80
LL
892}
893
894#if IS_ENABLED(CONFIG_IPV6)
895static void br_ip6_multicast_port_query_expired(unsigned long data)
896{
897 struct net_bridge_port *port = (void *)data;
898
90010b36 899 br_multicast_port_query_expired(port, &port->ip6_own_query);
cc0fdd80
LL
900}
901#endif
902
eb1d1641
HX
903void br_multicast_add_port(struct net_bridge_port *port)
904{
905 port->multicast_router = 1;
906
907 setup_timer(&port->multicast_router_timer, br_multicast_router_expired,
908 (unsigned long)port);
90010b36
LL
909 setup_timer(&port->ip4_own_query.timer,
910 br_ip4_multicast_port_query_expired, (unsigned long)port);
cc0fdd80 911#if IS_ENABLED(CONFIG_IPV6)
90010b36
LL
912 setup_timer(&port->ip6_own_query.timer,
913 br_ip6_multicast_port_query_expired, (unsigned long)port);
cc0fdd80 914#endif
eb1d1641
HX
915}
916
917void br_multicast_del_port(struct net_bridge_port *port)
918{
919 del_timer_sync(&port->multicast_router_timer);
920}
921
90010b36 922static void br_multicast_enable(struct bridge_mcast_own_query *query)
561f1103 923{
cc0fdd80 924 query->startup_sent = 0;
561f1103 925
cc0fdd80
LL
926 if (try_to_del_timer_sync(&query->timer) >= 0 ||
927 del_timer(&query->timer))
928 mod_timer(&query->timer, jiffies);
561f1103
HX
929}
930
eb1d1641
HX
931void br_multicast_enable_port(struct net_bridge_port *port)
932{
933 struct net_bridge *br = port->br;
934
935 spin_lock(&br->multicast_lock);
936 if (br->multicast_disabled || !netif_running(br->dev))
937 goto out;
938
90010b36 939 br_multicast_enable(&port->ip4_own_query);
cc0fdd80 940#if IS_ENABLED(CONFIG_IPV6)
90010b36 941 br_multicast_enable(&port->ip6_own_query);
cc0fdd80 942#endif
754bc547
SA
943 if (port->multicast_router == 2 && hlist_unhashed(&port->rlist))
944 br_multicast_add_router(br, port);
eb1d1641
HX
945
946out:
947 spin_unlock(&br->multicast_lock);
948}
949
950void br_multicast_disable_port(struct net_bridge_port *port)
951{
952 struct net_bridge *br = port->br;
953 struct net_bridge_port_group *pg;
b67bfe0d 954 struct hlist_node *n;
eb1d1641
HX
955
956 spin_lock(&br->multicast_lock);
b67bfe0d 957 hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
eb1d1641
HX
958 br_multicast_del_pg(br, pg);
959
960 if (!hlist_unhashed(&port->rlist))
961 hlist_del_init_rcu(&port->rlist);
962 del_timer(&port->multicast_router_timer);
90010b36 963 del_timer(&port->ip4_own_query.timer);
cc0fdd80 964#if IS_ENABLED(CONFIG_IPV6)
90010b36 965 del_timer(&port->ip6_own_query.timer);
cc0fdd80 966#endif
eb1d1641
HX
967 spin_unlock(&br->multicast_lock);
968}
969
8ef2a9a5
YH
970static int br_ip4_multicast_igmp3_report(struct net_bridge *br,
971 struct net_bridge_port *port,
06499098
VY
972 struct sk_buff *skb,
973 u16 vid)
eb1d1641
HX
974{
975 struct igmpv3_report *ih;
976 struct igmpv3_grec *grec;
977 int i;
978 int len;
979 int num;
980 int type;
981 int err = 0;
982 __be32 group;
983
eb1d1641
HX
984 ih = igmpv3_report_hdr(skb);
985 num = ntohs(ih->ngrec);
986 len = sizeof(*ih);
987
988 for (i = 0; i < num; i++) {
989 len += sizeof(*grec);
990 if (!pskb_may_pull(skb, len))
991 return -EINVAL;
992
fd218cf9 993 grec = (void *)(skb->data + len - sizeof(*grec));
eb1d1641
HX
994 group = grec->grec_mca;
995 type = grec->grec_type;
996
8eabf95c 997 len += ntohs(grec->grec_nsrcs) * 4;
eb1d1641
HX
998 if (!pskb_may_pull(skb, len))
999 return -EINVAL;
1000
1001 /* We treat this as an IGMPv2 report for now. */
1002 switch (type) {
1003 case IGMPV3_MODE_IS_INCLUDE:
1004 case IGMPV3_MODE_IS_EXCLUDE:
1005 case IGMPV3_CHANGE_TO_INCLUDE:
1006 case IGMPV3_CHANGE_TO_EXCLUDE:
1007 case IGMPV3_ALLOW_NEW_SOURCES:
1008 case IGMPV3_BLOCK_OLD_SOURCES:
1009 break;
1010
1011 default:
1012 continue;
1013 }
1014
b0e9a30d 1015 err = br_ip4_multicast_add_group(br, port, group, vid);
eb1d1641
HX
1016 if (err)
1017 break;
1018 }
1019
1020 return err;
1021}
1022
dfd56b8b 1023#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
1024static int br_ip6_multicast_mld2_report(struct net_bridge *br,
1025 struct net_bridge_port *port,
06499098
VY
1026 struct sk_buff *skb,
1027 u16 vid)
08b202b6
YH
1028{
1029 struct icmp6hdr *icmp6h;
1030 struct mld2_grec *grec;
1031 int i;
1032 int len;
1033 int num;
1034 int err = 0;
1035
1036 if (!pskb_may_pull(skb, sizeof(*icmp6h)))
1037 return -EINVAL;
1038
1039 icmp6h = icmp6_hdr(skb);
1040 num = ntohs(icmp6h->icmp6_dataun.un_data16[1]);
1041 len = sizeof(*icmp6h);
1042
1043 for (i = 0; i < num; i++) {
1044 __be16 *nsrcs, _nsrcs;
1045
1046 nsrcs = skb_header_pointer(skb,
1047 len + offsetof(struct mld2_grec,
649e984d 1048 grec_nsrcs),
08b202b6
YH
1049 sizeof(_nsrcs), &_nsrcs);
1050 if (!nsrcs)
1051 return -EINVAL;
1052
1053 if (!pskb_may_pull(skb,
1054 len + sizeof(*grec) +
d41db9f3 1055 sizeof(struct in6_addr) * ntohs(*nsrcs)))
08b202b6
YH
1056 return -EINVAL;
1057
1058 grec = (struct mld2_grec *)(skb->data + len);
d41db9f3
LL
1059 len += sizeof(*grec) +
1060 sizeof(struct in6_addr) * ntohs(*nsrcs);
08b202b6
YH
1061
1062 /* We treat these as MLDv1 reports for now. */
1063 switch (grec->grec_type) {
1064 case MLD2_MODE_IS_INCLUDE:
1065 case MLD2_MODE_IS_EXCLUDE:
1066 case MLD2_CHANGE_TO_INCLUDE:
1067 case MLD2_CHANGE_TO_EXCLUDE:
1068 case MLD2_ALLOW_NEW_SOURCES:
1069 case MLD2_BLOCK_OLD_SOURCES:
1070 break;
1071
1072 default:
1073 continue;
1074 }
1075
b0e9a30d
VY
1076 err = br_ip6_multicast_add_group(br, port, &grec->grec_mca,
1077 vid);
47cc84ce 1078 if (err)
08b202b6
YH
1079 break;
1080 }
1081
1082 return err;
1083}
1084#endif
1085
dc4eb53a 1086static bool br_ip4_multicast_select_querier(struct net_bridge *br,
2cd41431 1087 struct net_bridge_port *port,
dc4eb53a
LL
1088 __be32 saddr)
1089{
1090 if (!timer_pending(&br->ip4_own_query.timer) &&
1091 !timer_pending(&br->ip4_other_query.timer))
1092 goto update;
1093
1094 if (!br->ip4_querier.addr.u.ip4)
1095 goto update;
1096
1097 if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.u.ip4))
1098 goto update;
1099
1100 return false;
1101
1102update:
1103 br->ip4_querier.addr.u.ip4 = saddr;
1104
2cd41431
LL
1105 /* update protected by general multicast_lock by caller */
1106 rcu_assign_pointer(br->ip4_querier.port, port);
1107
dc4eb53a
LL
1108 return true;
1109}
1110
1111#if IS_ENABLED(CONFIG_IPV6)
1112static bool br_ip6_multicast_select_querier(struct net_bridge *br,
2cd41431 1113 struct net_bridge_port *port,
dc4eb53a
LL
1114 struct in6_addr *saddr)
1115{
1116 if (!timer_pending(&br->ip6_own_query.timer) &&
1117 !timer_pending(&br->ip6_other_query.timer))
1118 goto update;
1119
1120 if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.u.ip6) <= 0)
1121 goto update;
1122
1123 return false;
1124
1125update:
1126 br->ip6_querier.addr.u.ip6 = *saddr;
1127
2cd41431
LL
1128 /* update protected by general multicast_lock by caller */
1129 rcu_assign_pointer(br->ip6_querier.port, port);
1130
dc4eb53a
LL
1131 return true;
1132}
1133#endif
1134
1135static bool br_multicast_select_querier(struct net_bridge *br,
2cd41431 1136 struct net_bridge_port *port,
dc4eb53a
LL
1137 struct br_ip *saddr)
1138{
1139 switch (saddr->proto) {
1140 case htons(ETH_P_IP):
2cd41431 1141 return br_ip4_multicast_select_querier(br, port, saddr->u.ip4);
dc4eb53a
LL
1142#if IS_ENABLED(CONFIG_IPV6)
1143 case htons(ETH_P_IPV6):
2cd41431 1144 return br_ip6_multicast_select_querier(br, port, &saddr->u.ip6);
dc4eb53a
LL
1145#endif
1146 }
1147
1148 return false;
1149}
1150
cc0fdd80 1151static void
90010b36
LL
1152br_multicast_update_query_timer(struct net_bridge *br,
1153 struct bridge_mcast_other_query *query,
1154 unsigned long max_delay)
b00589af 1155{
90010b36
LL
1156 if (!timer_pending(&query->timer))
1157 query->delay_time = jiffies + max_delay;
b00589af 1158
90010b36 1159 mod_timer(&query->timer, jiffies + br->multicast_querier_interval);
b00589af
LL
1160}
1161
7e80c124 1162/*
7c77602f 1163 * Add port to router_list
7e80c124 1164 * list is maintained ordered by pointer value
1165 * and locked by br->multicast_lock and RCU
1166 */
0909e117
HX
1167static void br_multicast_add_router(struct net_bridge *br,
1168 struct net_bridge_port *port)
1169{
dcdca2c4 1170 struct net_bridge_port *p;
b67bfe0d 1171 struct hlist_node *slot = NULL;
dcdca2c4 1172
1a040eac
NA
1173 if (!hlist_unhashed(&port->rlist))
1174 return;
1175
b67bfe0d 1176 hlist_for_each_entry(p, &br->router_list, rlist) {
7e80c124 1177 if ((unsigned long) port >= (unsigned long) p)
1178 break;
b67bfe0d 1179 slot = &p->rlist;
dcdca2c4 1180 }
1181
7e80c124 1182 if (slot)
1d023284 1183 hlist_add_behind_rcu(&port->rlist, slot);
dcdca2c4 1184 else
1185 hlist_add_head_rcu(&port->rlist, &br->router_list);
0909e117
HX
1186}
1187
eb1d1641
HX
1188static void br_multicast_mark_router(struct net_bridge *br,
1189 struct net_bridge_port *port)
1190{
1191 unsigned long now = jiffies;
eb1d1641
HX
1192
1193 if (!port) {
1194 if (br->multicast_router == 1)
1195 mod_timer(&br->multicast_router_timer,
1196 now + br->multicast_querier_interval);
1197 return;
1198 }
1199
1200 if (port->multicast_router != 1)
1201 return;
1202
0909e117 1203 br_multicast_add_router(br, port);
eb1d1641 1204
eb1d1641
HX
1205 mod_timer(&port->multicast_router_timer,
1206 now + br->multicast_querier_interval);
1207}
1208
1209static void br_multicast_query_received(struct net_bridge *br,
1210 struct net_bridge_port *port,
90010b36 1211 struct bridge_mcast_other_query *query,
dc4eb53a 1212 struct br_ip *saddr,
b00589af 1213 unsigned long max_delay)
eb1d1641 1214{
2cd41431 1215 if (!br_multicast_select_querier(br, port, saddr))
eb1d1641
HX
1216 return;
1217
dc4eb53a 1218 br_multicast_update_query_timer(br, query, max_delay);
eb1d1641
HX
1219 br_multicast_mark_router(br, port);
1220}
1221
8ef2a9a5
YH
1222static int br_ip4_multicast_query(struct net_bridge *br,
1223 struct net_bridge_port *port,
06499098
VY
1224 struct sk_buff *skb,
1225 u16 vid)
eb1d1641 1226{
b71d1d42 1227 const struct iphdr *iph = ip_hdr(skb);
eb1d1641
HX
1228 struct igmphdr *ih = igmp_hdr(skb);
1229 struct net_bridge_mdb_entry *mp;
1230 struct igmpv3_query *ih3;
1231 struct net_bridge_port_group *p;
e8051688 1232 struct net_bridge_port_group __rcu **pp;
dc4eb53a 1233 struct br_ip saddr;
eb1d1641
HX
1234 unsigned long max_delay;
1235 unsigned long now = jiffies;
1236 __be32 group;
bec68ff1 1237 int err = 0;
eb1d1641
HX
1238
1239 spin_lock(&br->multicast_lock);
1240 if (!netif_running(br->dev) ||
1241 (port && port->state == BR_STATE_DISABLED))
1242 goto out;
1243
eb1d1641
HX
1244 group = ih->group;
1245
1246 if (skb->len == sizeof(*ih)) {
1247 max_delay = ih->code * (HZ / IGMP_TIMER_SCALE);
1248
1249 if (!max_delay) {
1250 max_delay = 10 * HZ;
1251 group = 0;
1252 }
9afd85c9 1253 } else if (skb->len >= sizeof(*ih3)) {
eb1d1641
HX
1254 ih3 = igmpv3_query_hdr(skb);
1255 if (ih3->nsrcs)
bec68ff1 1256 goto out;
eb1d1641 1257
0ba8c9ec
YH
1258 max_delay = ih3->code ?
1259 IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1;
9afd85c9 1260 } else {
9ed973cc
LL
1261 goto out;
1262 }
1263
dc4eb53a
LL
1264 if (!group) {
1265 saddr.proto = htons(ETH_P_IP);
1266 saddr.u.ip4 = iph->saddr;
b00589af 1267
dc4eb53a
LL
1268 br_multicast_query_received(br, port, &br->ip4_other_query,
1269 &saddr, max_delay);
eb1d1641 1270 goto out;
dc4eb53a 1271 }
eb1d1641 1272
b0e9a30d 1273 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid);
eb1d1641
HX
1274 if (!mp)
1275 goto out;
1276
1277 max_delay *= br->multicast_last_member_count;
1278
8a870178 1279 if (mp->mglist &&
eb1d1641
HX
1280 (timer_pending(&mp->timer) ?
1281 time_after(mp->timer.expires, now + max_delay) :
1282 try_to_del_timer_sync(&mp->timer) >= 0))
1283 mod_timer(&mp->timer, now + max_delay);
1284
e8051688
ED
1285 for (pp = &mp->ports;
1286 (p = mlock_dereference(*pp, br)) != NULL;
1287 pp = &p->next) {
eb1d1641
HX
1288 if (timer_pending(&p->timer) ?
1289 time_after(p->timer.expires, now + max_delay) :
1290 try_to_del_timer_sync(&p->timer) >= 0)
24f9cdcb 1291 mod_timer(&p->timer, now + max_delay);
eb1d1641
HX
1292 }
1293
1294out:
1295 spin_unlock(&br->multicast_lock);
bec68ff1 1296 return err;
eb1d1641
HX
1297}
1298
dfd56b8b 1299#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
1300static int br_ip6_multicast_query(struct net_bridge *br,
1301 struct net_bridge_port *port,
06499098
VY
1302 struct sk_buff *skb,
1303 u16 vid)
08b202b6 1304{
b71d1d42 1305 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
eca2a43b 1306 struct mld_msg *mld;
08b202b6
YH
1307 struct net_bridge_mdb_entry *mp;
1308 struct mld2_query *mld2q;
e8051688
ED
1309 struct net_bridge_port_group *p;
1310 struct net_bridge_port_group __rcu **pp;
dc4eb53a 1311 struct br_ip saddr;
08b202b6
YH
1312 unsigned long max_delay;
1313 unsigned long now = jiffies;
b71d1d42 1314 const struct in6_addr *group = NULL;
9ed973cc 1315 bool is_general_query;
08b202b6
YH
1316 int err = 0;
1317
1318 spin_lock(&br->multicast_lock);
1319 if (!netif_running(br->dev) ||
1320 (port && port->state == BR_STATE_DISABLED))
1321 goto out;
1322
08b202b6
YH
1323 if (skb->len == sizeof(*mld)) {
1324 if (!pskb_may_pull(skb, sizeof(*mld))) {
1325 err = -EINVAL;
1326 goto out;
1327 }
1328 mld = (struct mld_msg *) icmp6_hdr(skb);
4715213d 1329 max_delay = msecs_to_jiffies(ntohs(mld->mld_maxdelay));
08b202b6
YH
1330 if (max_delay)
1331 group = &mld->mld_mca;
248ba8ec 1332 } else {
08b202b6
YH
1333 if (!pskb_may_pull(skb, sizeof(*mld2q))) {
1334 err = -EINVAL;
1335 goto out;
1336 }
1337 mld2q = (struct mld2_query *)icmp6_hdr(skb);
1338 if (!mld2q->mld2q_nsrcs)
1339 group = &mld2q->mld2q_mca;
e3f5b170
DB
1340
1341 max_delay = max(msecs_to_jiffies(mldv2_mrc(mld2q)), 1UL);
08b202b6
YH
1342 }
1343
9ed973cc
LL
1344 is_general_query = group && ipv6_addr_any(group);
1345
dc4eb53a
LL
1346 if (is_general_query) {
1347 saddr.proto = htons(ETH_P_IPV6);
1348 saddr.u.ip6 = ip6h->saddr;
b00589af 1349
dc4eb53a
LL
1350 br_multicast_query_received(br, port, &br->ip6_other_query,
1351 &saddr, max_delay);
08b202b6 1352 goto out;
6c03ee8b
LL
1353 } else if (!group) {
1354 goto out;
dc4eb53a 1355 }
08b202b6 1356
b0e9a30d 1357 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid);
08b202b6
YH
1358 if (!mp)
1359 goto out;
1360
1361 max_delay *= br->multicast_last_member_count;
8a870178 1362 if (mp->mglist &&
08b202b6
YH
1363 (timer_pending(&mp->timer) ?
1364 time_after(mp->timer.expires, now + max_delay) :
1365 try_to_del_timer_sync(&mp->timer) >= 0))
1366 mod_timer(&mp->timer, now + max_delay);
1367
e8051688
ED
1368 for (pp = &mp->ports;
1369 (p = mlock_dereference(*pp, br)) != NULL;
1370 pp = &p->next) {
08b202b6
YH
1371 if (timer_pending(&p->timer) ?
1372 time_after(p->timer.expires, now + max_delay) :
1373 try_to_del_timer_sync(&p->timer) >= 0)
24f9cdcb 1374 mod_timer(&p->timer, now + max_delay);
08b202b6
YH
1375 }
1376
1377out:
1378 spin_unlock(&br->multicast_lock);
1379 return err;
1380}
1381#endif
1382
90010b36
LL
1383static void
1384br_multicast_leave_group(struct net_bridge *br,
1385 struct net_bridge_port *port,
1386 struct br_ip *group,
1387 struct bridge_mcast_other_query *other_query,
1388 struct bridge_mcast_own_query *own_query)
eb1d1641
HX
1389{
1390 struct net_bridge_mdb_htable *mdb;
1391 struct net_bridge_mdb_entry *mp;
1392 struct net_bridge_port_group *p;
1393 unsigned long now;
1394 unsigned long time;
1395
eb1d1641
HX
1396 spin_lock(&br->multicast_lock);
1397 if (!netif_running(br->dev) ||
1398 (port && port->state == BR_STATE_DISABLED) ||
90010b36 1399 timer_pending(&other_query->timer))
eb1d1641
HX
1400 goto out;
1401
e8051688 1402 mdb = mlock_dereference(br->mdb, br);
eb1d1641
HX
1403 mp = br_mdb_ip_get(mdb, group);
1404 if (!mp)
1405 goto out;
1406
cc0fdd80 1407 if (br->multicast_querier) {
6b7df111
CW
1408 __br_multicast_send_query(br, port, &mp->addr);
1409
1410 time = jiffies + br->multicast_last_member_count *
1411 br->multicast_last_member_interval;
cc0fdd80 1412
90010b36 1413 mod_timer(&own_query->timer, time);
6b7df111
CW
1414
1415 for (p = mlock_dereference(mp->ports, br);
1416 p != NULL;
1417 p = mlock_dereference(p->next, br)) {
1418 if (p->port != port)
1419 continue;
1420
1421 if (!hlist_unhashed(&p->mglist) &&
1422 (timer_pending(&p->timer) ?
1423 time_after(p->timer.expires, time) :
1424 try_to_del_timer_sync(&p->timer) >= 0)) {
1425 mod_timer(&p->timer, time);
1426 }
1427
1428 break;
1429 }
1430 }
1431
c2d3babf 1432 if (port && (port->flags & BR_MULTICAST_FAST_LEAVE)) {
50426b59
AW
1433 struct net_bridge_port_group __rcu **pp;
1434
1435 for (pp = &mp->ports;
1436 (p = mlock_dereference(*pp, br)) != NULL;
1437 pp = &p->next) {
1438 if (p->port != port)
1439 continue;
1440
1441 rcu_assign_pointer(*pp, p->next);
1442 hlist_del_init(&p->mglist);
1443 del_timer(&p->timer);
09cf0211
NA
1444 br_mdb_notify(br->dev, port, group, RTM_DELMDB,
1445 p->state);
50426b59
AW
1446 call_rcu_bh(&p->rcu, br_multicast_free_pg);
1447
454594f3 1448 if (!mp->ports && !mp->mglist &&
50426b59
AW
1449 netif_running(br->dev))
1450 mod_timer(&mp->timer, jiffies);
1451 }
1452 goto out;
1453 }
1454
eb1d1641
HX
1455 now = jiffies;
1456 time = now + br->multicast_last_member_count *
1457 br->multicast_last_member_interval;
1458
1459 if (!port) {
454594f3 1460 if (mp->mglist &&
eb1d1641
HX
1461 (timer_pending(&mp->timer) ?
1462 time_after(mp->timer.expires, time) :
1463 try_to_del_timer_sync(&mp->timer) >= 0)) {
1464 mod_timer(&mp->timer, time);
eb1d1641 1465 }
454594f3
LL
1466
1467 goto out;
1468 }
1469
1470 for (p = mlock_dereference(mp->ports, br);
1471 p != NULL;
1472 p = mlock_dereference(p->next, br)) {
1473 if (p->port != port)
1474 continue;
1475
1476 if (!hlist_unhashed(&p->mglist) &&
1477 (timer_pending(&p->timer) ?
1478 time_after(p->timer.expires, time) :
1479 try_to_del_timer_sync(&p->timer) >= 0)) {
1480 mod_timer(&p->timer, time);
1481 }
1482
1483 break;
eb1d1641 1484 }
eb1d1641
HX
1485out:
1486 spin_unlock(&br->multicast_lock);
1487}
1488
8ef2a9a5
YH
1489static void br_ip4_multicast_leave_group(struct net_bridge *br,
1490 struct net_bridge_port *port,
b0e9a30d
VY
1491 __be32 group,
1492 __u16 vid)
8ef2a9a5
YH
1493{
1494 struct br_ip br_group;
90010b36 1495 struct bridge_mcast_own_query *own_query;
8ef2a9a5
YH
1496
1497 if (ipv4_is_local_multicast(group))
1498 return;
1499
90010b36
LL
1500 own_query = port ? &port->ip4_own_query : &br->ip4_own_query;
1501
8ef2a9a5
YH
1502 br_group.u.ip4 = group;
1503 br_group.proto = htons(ETH_P_IP);
b0e9a30d 1504 br_group.vid = vid;
8ef2a9a5 1505
90010b36
LL
1506 br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
1507 own_query);
8ef2a9a5
YH
1508}
1509
dfd56b8b 1510#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
1511static void br_ip6_multicast_leave_group(struct net_bridge *br,
1512 struct net_bridge_port *port,
b0e9a30d
VY
1513 const struct in6_addr *group,
1514 __u16 vid)
08b202b6
YH
1515{
1516 struct br_ip br_group;
90010b36 1517 struct bridge_mcast_own_query *own_query;
08b202b6 1518
3c3769e6 1519 if (ipv6_addr_is_ll_all_nodes(group))
08b202b6
YH
1520 return;
1521
90010b36
LL
1522 own_query = port ? &port->ip6_own_query : &br->ip6_own_query;
1523
4e3fd7a0 1524 br_group.u.ip6 = *group;
08b202b6 1525 br_group.proto = htons(ETH_P_IPV6);
b0e9a30d 1526 br_group.vid = vid;
08b202b6 1527
90010b36
LL
1528 br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
1529 own_query);
08b202b6
YH
1530}
1531#endif
8ef2a9a5 1532
eb1d1641
HX
1533static int br_multicast_ipv4_rcv(struct net_bridge *br,
1534 struct net_bridge_port *port,
06499098
VY
1535 struct sk_buff *skb,
1536 u16 vid)
eb1d1641 1537{
9afd85c9 1538 struct sk_buff *skb_trimmed = NULL;
eb1d1641 1539 struct igmphdr *ih;
eb1d1641
HX
1540 int err;
1541
9afd85c9 1542 err = ip_mc_check_igmp(skb, &skb_trimmed);
eb1d1641 1543
9afd85c9
LL
1544 if (err == -ENOMSG) {
1545 if (!ipv4_is_local_multicast(ip_hdr(skb)->daddr))
bd4265fe 1546 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
eb1d1641 1547 return 0;
9afd85c9
LL
1548 } else if (err < 0) {
1549 return err;
bd4265fe 1550 }
eb1d1641 1551
eb1d1641 1552 BR_INPUT_SKB_CB(skb)->igmp = 1;
9afd85c9 1553 ih = igmp_hdr(skb);
eb1d1641
HX
1554
1555 switch (ih->type) {
1556 case IGMP_HOST_MEMBERSHIP_REPORT:
1557 case IGMPV2_HOST_MEMBERSHIP_REPORT:
62b2bcb4 1558 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
b0e9a30d 1559 err = br_ip4_multicast_add_group(br, port, ih->group, vid);
eb1d1641
HX
1560 break;
1561 case IGMPV3_HOST_MEMBERSHIP_REPORT:
9afd85c9 1562 err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid);
eb1d1641
HX
1563 break;
1564 case IGMP_HOST_MEMBERSHIP_QUERY:
9afd85c9 1565 err = br_ip4_multicast_query(br, port, skb_trimmed, vid);
eb1d1641
HX
1566 break;
1567 case IGMP_HOST_LEAVE_MESSAGE:
b0e9a30d 1568 br_ip4_multicast_leave_group(br, port, ih->group, vid);
eb1d1641
HX
1569 break;
1570 }
1571
9afd85c9
LL
1572 if (skb_trimmed)
1573 kfree_skb(skb_trimmed);
1574
eb1d1641
HX
1575 return err;
1576}
1577
dfd56b8b 1578#if IS_ENABLED(CONFIG_IPV6)
08b202b6
YH
1579static int br_multicast_ipv6_rcv(struct net_bridge *br,
1580 struct net_bridge_port *port,
06499098
VY
1581 struct sk_buff *skb,
1582 u16 vid)
08b202b6 1583{
9afd85c9
LL
1584 struct sk_buff *skb_trimmed = NULL;
1585 struct mld_msg *mld;
08b202b6
YH
1586 int err;
1587
9afd85c9 1588 err = ipv6_mc_check_mld(skb, &skb_trimmed);
08b202b6 1589
9afd85c9
LL
1590 if (err == -ENOMSG) {
1591 if (!ipv6_addr_is_ll_all_nodes(&ipv6_hdr(skb)->daddr))
1592 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
08b202b6 1593 return 0;
9afd85c9
LL
1594 } else if (err < 0) {
1595 return err;
08b202b6
YH
1596 }
1597
08b202b6 1598 BR_INPUT_SKB_CB(skb)->igmp = 1;
9afd85c9 1599 mld = (struct mld_msg *)skb_transport_header(skb);
08b202b6 1600
9afd85c9 1601 switch (mld->mld_type) {
08b202b6 1602 case ICMPV6_MGM_REPORT:
fc2af6c7 1603 BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
b0e9a30d 1604 err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid);
08b202b6 1605 break;
08b202b6 1606 case ICMPV6_MLD2_REPORT:
9afd85c9 1607 err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid);
08b202b6
YH
1608 break;
1609 case ICMPV6_MGM_QUERY:
9afd85c9 1610 err = br_ip6_multicast_query(br, port, skb_trimmed, vid);
08b202b6
YH
1611 break;
1612 case ICMPV6_MGM_REDUCTION:
b0e9a30d 1613 br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid);
9afd85c9 1614 break;
08b202b6
YH
1615 }
1616
9afd85c9
LL
1617 if (skb_trimmed)
1618 kfree_skb(skb_trimmed);
1619
08b202b6
YH
1620 return err;
1621}
1622#endif
1623
eb1d1641 1624int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
06499098 1625 struct sk_buff *skb, u16 vid)
eb1d1641 1626{
1fafc7a9
YH
1627 BR_INPUT_SKB_CB(skb)->igmp = 0;
1628 BR_INPUT_SKB_CB(skb)->mrouters_only = 0;
1629
eb1d1641
HX
1630 if (br->multicast_disabled)
1631 return 0;
1632
1633 switch (skb->protocol) {
1634 case htons(ETH_P_IP):
06499098 1635 return br_multicast_ipv4_rcv(br, port, skb, vid);
dfd56b8b 1636#if IS_ENABLED(CONFIG_IPV6)
08b202b6 1637 case htons(ETH_P_IPV6):
06499098 1638 return br_multicast_ipv6_rcv(br, port, skb, vid);
08b202b6 1639#endif
eb1d1641
HX
1640 }
1641
1642 return 0;
1643}
1644
cc0fdd80 1645static void br_multicast_query_expired(struct net_bridge *br,
2cd41431
LL
1646 struct bridge_mcast_own_query *query,
1647 struct bridge_mcast_querier *querier)
cc0fdd80
LL
1648{
1649 spin_lock(&br->multicast_lock);
1650 if (query->startup_sent < br->multicast_startup_query_count)
1651 query->startup_sent++;
1652
71d9f614 1653 RCU_INIT_POINTER(querier->port, NULL);
cc0fdd80
LL
1654 br_multicast_send_query(br, NULL, query);
1655 spin_unlock(&br->multicast_lock);
1656}
1657
1658static void br_ip4_multicast_query_expired(unsigned long data)
eb1d1641
HX
1659{
1660 struct net_bridge *br = (void *)data;
1661
2cd41431 1662 br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier);
cc0fdd80 1663}
eb1d1641 1664
cc0fdd80
LL
1665#if IS_ENABLED(CONFIG_IPV6)
1666static void br_ip6_multicast_query_expired(unsigned long data)
1667{
1668 struct net_bridge *br = (void *)data;
eb1d1641 1669
2cd41431 1670 br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier);
eb1d1641 1671}
cc0fdd80 1672#endif
eb1d1641
HX
1673
1674void br_multicast_init(struct net_bridge *br)
1675{
1676 br->hash_elasticity = 4;
1677 br->hash_max = 512;
1678
1679 br->multicast_router = 1;
c5c23260 1680 br->multicast_querier = 0;
1c8ad5bf 1681 br->multicast_query_use_ifaddr = 0;
eb1d1641
HX
1682 br->multicast_last_member_count = 2;
1683 br->multicast_startup_query_count = 2;
1684
1685 br->multicast_last_member_interval = HZ;
1686 br->multicast_query_response_interval = 10 * HZ;
1687 br->multicast_startup_query_interval = 125 * HZ / 4;
1688 br->multicast_query_interval = 125 * HZ;
1689 br->multicast_querier_interval = 255 * HZ;
1690 br->multicast_membership_interval = 260 * HZ;
1691
90010b36 1692 br->ip4_other_query.delay_time = 0;
2cd41431 1693 br->ip4_querier.port = NULL;
cc0fdd80 1694#if IS_ENABLED(CONFIG_IPV6)
90010b36 1695 br->ip6_other_query.delay_time = 0;
2cd41431 1696 br->ip6_querier.port = NULL;
cc0fdd80 1697#endif
b00589af 1698
eb1d1641
HX
1699 spin_lock_init(&br->multicast_lock);
1700 setup_timer(&br->multicast_router_timer,
1701 br_multicast_local_router_expired, 0);
90010b36
LL
1702 setup_timer(&br->ip4_other_query.timer,
1703 br_ip4_multicast_querier_expired, (unsigned long)br);
1704 setup_timer(&br->ip4_own_query.timer, br_ip4_multicast_query_expired,
eb1d1641 1705 (unsigned long)br);
cc0fdd80 1706#if IS_ENABLED(CONFIG_IPV6)
90010b36
LL
1707 setup_timer(&br->ip6_other_query.timer,
1708 br_ip6_multicast_querier_expired, (unsigned long)br);
1709 setup_timer(&br->ip6_own_query.timer, br_ip6_multicast_query_expired,
cc0fdd80
LL
1710 (unsigned long)br);
1711#endif
eb1d1641
HX
1712}
1713
cc0fdd80 1714static void __br_multicast_open(struct net_bridge *br,
90010b36 1715 struct bridge_mcast_own_query *query)
eb1d1641 1716{
cc0fdd80 1717 query->startup_sent = 0;
eb1d1641
HX
1718
1719 if (br->multicast_disabled)
1720 return;
1721
cc0fdd80
LL
1722 mod_timer(&query->timer, jiffies);
1723}
1724
1725void br_multicast_open(struct net_bridge *br)
1726{
90010b36 1727 __br_multicast_open(br, &br->ip4_own_query);
cc0fdd80 1728#if IS_ENABLED(CONFIG_IPV6)
90010b36 1729 __br_multicast_open(br, &br->ip6_own_query);
cc0fdd80 1730#endif
eb1d1641
HX
1731}
1732
1733void br_multicast_stop(struct net_bridge *br)
1734{
1735 struct net_bridge_mdb_htable *mdb;
1736 struct net_bridge_mdb_entry *mp;
b67bfe0d 1737 struct hlist_node *n;
eb1d1641
HX
1738 u32 ver;
1739 int i;
1740
1741 del_timer_sync(&br->multicast_router_timer);
90010b36
LL
1742 del_timer_sync(&br->ip4_other_query.timer);
1743 del_timer_sync(&br->ip4_own_query.timer);
cc0fdd80 1744#if IS_ENABLED(CONFIG_IPV6)
90010b36
LL
1745 del_timer_sync(&br->ip6_other_query.timer);
1746 del_timer_sync(&br->ip6_own_query.timer);
cc0fdd80 1747#endif
eb1d1641
HX
1748
1749 spin_lock_bh(&br->multicast_lock);
e8051688 1750 mdb = mlock_dereference(br->mdb, br);
eb1d1641
HX
1751 if (!mdb)
1752 goto out;
1753
1754 br->mdb = NULL;
1755
1756 ver = mdb->ver;
1757 for (i = 0; i < mdb->max; i++) {
b67bfe0d 1758 hlist_for_each_entry_safe(mp, n, &mdb->mhash[i],
eb1d1641
HX
1759 hlist[ver]) {
1760 del_timer(&mp->timer);
eb1d1641
HX
1761 call_rcu_bh(&mp->rcu, br_multicast_free_group);
1762 }
1763 }
1764
1765 if (mdb->old) {
1766 spin_unlock_bh(&br->multicast_lock);
10cc2b50 1767 rcu_barrier_bh();
eb1d1641
HX
1768 spin_lock_bh(&br->multicast_lock);
1769 WARN_ON(mdb->old);
1770 }
1771
1772 mdb->old = mdb;
1773 call_rcu_bh(&mdb->rcu, br_mdb_free);
1774
1775out:
1776 spin_unlock_bh(&br->multicast_lock);
1777}
0909e117
HX
1778
1779int br_multicast_set_router(struct net_bridge *br, unsigned long val)
1780{
6ae4ae8e 1781 int err = -EINVAL;
0909e117
HX
1782
1783 spin_lock_bh(&br->multicast_lock);
0909e117
HX
1784
1785 switch (val) {
1786 case 0:
1787 case 2:
1788 del_timer(&br->multicast_router_timer);
1789 /* fall through */
1790 case 1:
1791 br->multicast_router = val;
1792 err = 0;
1793 break;
0909e117
HX
1794 }
1795
0909e117
HX
1796 spin_unlock_bh(&br->multicast_lock);
1797
1798 return err;
1799}
1800
1801int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
1802{
1803 struct net_bridge *br = p->br;
6ae4ae8e 1804 int err = -EINVAL;
0909e117
HX
1805
1806 spin_lock(&br->multicast_lock);
0909e117
HX
1807
1808 switch (val) {
1809 case 0:
1810 case 1:
1811 case 2:
1812 p->multicast_router = val;
1813 err = 0;
1814
1815 if (val < 2 && !hlist_unhashed(&p->rlist))
1816 hlist_del_init_rcu(&p->rlist);
1817
1818 if (val == 1)
1819 break;
1820
1821 del_timer(&p->multicast_router_timer);
1822
1823 if (val == 0)
1824 break;
1825
1826 br_multicast_add_router(br, p);
1827 break;
0909e117
HX
1828 }
1829
0909e117
HX
1830 spin_unlock(&br->multicast_lock);
1831
1832 return err;
1833}
561f1103 1834
cc0fdd80 1835static void br_multicast_start_querier(struct net_bridge *br,
90010b36 1836 struct bridge_mcast_own_query *query)
561f1103
HX
1837{
1838 struct net_bridge_port *port;
74857216 1839
cc0fdd80 1840 __br_multicast_open(br, query);
74857216
HX
1841
1842 list_for_each_entry(port, &br->port_list, list) {
1843 if (port->state == BR_STATE_DISABLED ||
1844 port->state == BR_STATE_BLOCKING)
1845 continue;
1846
90010b36
LL
1847 if (query == &br->ip4_own_query)
1848 br_multicast_enable(&port->ip4_own_query);
cc0fdd80
LL
1849#if IS_ENABLED(CONFIG_IPV6)
1850 else
90010b36 1851 br_multicast_enable(&port->ip6_own_query);
cc0fdd80 1852#endif
74857216
HX
1853 }
1854}
1855
1856int br_multicast_toggle(struct net_bridge *br, unsigned long val)
1857{
3a7fda06 1858 int err = 0;
e8051688 1859 struct net_bridge_mdb_htable *mdb;
561f1103 1860
ef5e0d82 1861 spin_lock_bh(&br->multicast_lock);
561f1103
HX
1862 if (br->multicast_disabled == !val)
1863 goto unlock;
1864
1865 br->multicast_disabled = !val;
1866 if (br->multicast_disabled)
1867 goto unlock;
1868
3a7fda06
HX
1869 if (!netif_running(br->dev))
1870 goto unlock;
1871
e8051688
ED
1872 mdb = mlock_dereference(br->mdb, br);
1873 if (mdb) {
1874 if (mdb->old) {
561f1103
HX
1875 err = -EEXIST;
1876rollback:
1877 br->multicast_disabled = !!val;
1878 goto unlock;
1879 }
1880
e8051688 1881 err = br_mdb_rehash(&br->mdb, mdb->max,
561f1103
HX
1882 br->hash_elasticity);
1883 if (err)
1884 goto rollback;
1885 }
1886
90010b36 1887 br_multicast_start_querier(br, &br->ip4_own_query);
cc0fdd80 1888#if IS_ENABLED(CONFIG_IPV6)
90010b36 1889 br_multicast_start_querier(br, &br->ip6_own_query);
cc0fdd80 1890#endif
561f1103
HX
1891
1892unlock:
ef5e0d82 1893 spin_unlock_bh(&br->multicast_lock);
561f1103
HX
1894
1895 return err;
1896}
b195167f 1897
c5c23260
HX
1898int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
1899{
b00589af
LL
1900 unsigned long max_delay;
1901
c5c23260
HX
1902 val = !!val;
1903
1904 spin_lock_bh(&br->multicast_lock);
1905 if (br->multicast_querier == val)
1906 goto unlock;
1907
1908 br->multicast_querier = val;
b00589af
LL
1909 if (!val)
1910 goto unlock;
1911
1912 max_delay = br->multicast_query_response_interval;
b00589af 1913
90010b36
LL
1914 if (!timer_pending(&br->ip4_other_query.timer))
1915 br->ip4_other_query.delay_time = jiffies + max_delay;
cc0fdd80 1916
90010b36 1917 br_multicast_start_querier(br, &br->ip4_own_query);
cc0fdd80
LL
1918
1919#if IS_ENABLED(CONFIG_IPV6)
90010b36
LL
1920 if (!timer_pending(&br->ip6_other_query.timer))
1921 br->ip6_other_query.delay_time = jiffies + max_delay;
cc0fdd80 1922
90010b36 1923 br_multicast_start_querier(br, &br->ip6_own_query);
cc0fdd80 1924#endif
c5c23260
HX
1925
1926unlock:
1927 spin_unlock_bh(&br->multicast_lock);
1928
1929 return 0;
1930}
1931
b195167f
HX
1932int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val)
1933{
6ae4ae8e 1934 int err = -EINVAL;
b195167f 1935 u32 old;
e8051688 1936 struct net_bridge_mdb_htable *mdb;
b195167f 1937
fe0d692b 1938 spin_lock_bh(&br->multicast_lock);
b195167f
HX
1939 if (!is_power_of_2(val))
1940 goto unlock;
e8051688
ED
1941
1942 mdb = mlock_dereference(br->mdb, br);
1943 if (mdb && val < mdb->size)
b195167f
HX
1944 goto unlock;
1945
1946 err = 0;
1947
1948 old = br->hash_max;
1949 br->hash_max = val;
1950
e8051688
ED
1951 if (mdb) {
1952 if (mdb->old) {
b195167f
HX
1953 err = -EEXIST;
1954rollback:
1955 br->hash_max = old;
1956 goto unlock;
1957 }
1958
1959 err = br_mdb_rehash(&br->mdb, br->hash_max,
1960 br->hash_elasticity);
1961 if (err)
1962 goto rollback;
1963 }
1964
1965unlock:
fe0d692b 1966 spin_unlock_bh(&br->multicast_lock);
b195167f
HX
1967
1968 return err;
1969}
07f8ac4a
LL
1970
1971/**
1972 * br_multicast_list_adjacent - Returns snooped multicast addresses
1973 * @dev: The bridge port adjacent to which to retrieve addresses
1974 * @br_ip_list: The list to store found, snooped multicast IP addresses in
1975 *
1976 * Creates a list of IP addresses (struct br_ip_list) sensed by the multicast
1977 * snooping feature on all bridge ports of dev's bridge device, excluding
1978 * the addresses from dev itself.
1979 *
1980 * Returns the number of items added to br_ip_list.
1981 *
1982 * Notes:
1983 * - br_ip_list needs to be initialized by caller
1984 * - br_ip_list might contain duplicates in the end
1985 * (needs to be taken care of by caller)
1986 * - br_ip_list needs to be freed by caller
1987 */
1988int br_multicast_list_adjacent(struct net_device *dev,
1989 struct list_head *br_ip_list)
1990{
1991 struct net_bridge *br;
1992 struct net_bridge_port *port;
1993 struct net_bridge_port_group *group;
1994 struct br_ip_list *entry;
1995 int count = 0;
1996
1997 rcu_read_lock();
1998 if (!br_ip_list || !br_port_exists(dev))
1999 goto unlock;
2000
2001 port = br_port_get_rcu(dev);
2002 if (!port || !port->br)
2003 goto unlock;
2004
2005 br = port->br;
2006
2007 list_for_each_entry_rcu(port, &br->port_list, list) {
2008 if (!port->dev || port->dev == dev)
2009 continue;
2010
2011 hlist_for_each_entry_rcu(group, &port->mglist, mglist) {
2012 entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
2013 if (!entry)
2014 goto unlock;
2015
2016 entry->addr = group->addr;
2017 list_add(&entry->list, br_ip_list);
2018 count++;
2019 }
2020 }
2021
2022unlock:
2023 rcu_read_unlock();
2024 return count;
2025}
2026EXPORT_SYMBOL_GPL(br_multicast_list_adjacent);
2cd41431 2027
c34963e2
LL
2028/**
2029 * br_multicast_has_querier_anywhere - Checks for a querier on a bridge
2030 * @dev: The bridge port providing the bridge on which to check for a querier
2031 * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
2032 *
2033 * Checks whether the given interface has a bridge on top and if so returns
2034 * true if a valid querier exists anywhere on the bridged link layer.
2035 * Otherwise returns false.
2036 */
2037bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto)
2038{
2039 struct net_bridge *br;
2040 struct net_bridge_port *port;
2041 struct ethhdr eth;
2042 bool ret = false;
2043
2044 rcu_read_lock();
2045 if (!br_port_exists(dev))
2046 goto unlock;
2047
2048 port = br_port_get_rcu(dev);
2049 if (!port || !port->br)
2050 goto unlock;
2051
2052 br = port->br;
2053
2054 memset(&eth, 0, sizeof(eth));
2055 eth.h_proto = htons(proto);
2056
2057 ret = br_multicast_querier_exists(br, &eth);
2058
2059unlock:
2060 rcu_read_unlock();
2061 return ret;
2062}
2063EXPORT_SYMBOL_GPL(br_multicast_has_querier_anywhere);
2064
2cd41431
LL
2065/**
2066 * br_multicast_has_querier_adjacent - Checks for a querier behind a bridge port
2067 * @dev: The bridge port adjacent to which to check for a querier
2068 * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
2069 *
2070 * Checks whether the given interface has a bridge on top and if so returns
2071 * true if a selected querier is behind one of the other ports of this
2072 * bridge. Otherwise returns false.
2073 */
2074bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto)
2075{
2076 struct net_bridge *br;
2077 struct net_bridge_port *port;
2078 bool ret = false;
2079
2080 rcu_read_lock();
2081 if (!br_port_exists(dev))
2082 goto unlock;
2083
2084 port = br_port_get_rcu(dev);
2085 if (!port || !port->br)
2086 goto unlock;
2087
2088 br = port->br;
2089
2090 switch (proto) {
2091 case ETH_P_IP:
2092 if (!timer_pending(&br->ip4_other_query.timer) ||
2093 rcu_dereference(br->ip4_querier.port) == port)
2094 goto unlock;
2095 break;
3993c4e1 2096#if IS_ENABLED(CONFIG_IPV6)
2cd41431
LL
2097 case ETH_P_IPV6:
2098 if (!timer_pending(&br->ip6_other_query.timer) ||
2099 rcu_dereference(br->ip6_querier.port) == port)
2100 goto unlock;
2101 break;
3993c4e1 2102#endif
2cd41431
LL
2103 default:
2104 goto unlock;
2105 }
2106
2107 ret = true;
2108unlock:
2109 rcu_read_unlock();
2110 return ret;
2111}
2112EXPORT_SYMBOL_GPL(br_multicast_has_querier_adjacent);
This page took 0.446152 seconds and 5 git commands to generate.