xref: /openbmc/linux/net/bridge/br_mdb.c (revision e142bd91)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/err.h>
3 #include <linux/igmp.h>
4 #include <linux/kernel.h>
5 #include <linux/netdevice.h>
6 #include <linux/rculist.h>
7 #include <linux/skbuff.h>
8 #include <linux/if_ether.h>
9 #include <net/ip.h>
10 #include <net/netlink.h>
11 #include <net/switchdev.h>
12 #if IS_ENABLED(CONFIG_IPV6)
13 #include <net/ipv6.h>
14 #include <net/addrconf.h>
15 #endif
16 
17 #include "br_private.h"
18 
19 static bool
20 br_ip4_rports_get_timer(struct net_bridge_mcast_port *pmctx,
21 			unsigned long *timer)
22 {
23 	*timer = br_timer_value(&pmctx->ip4_mc_router_timer);
24 	return !hlist_unhashed(&pmctx->ip4_rlist);
25 }
26 
27 static bool
28 br_ip6_rports_get_timer(struct net_bridge_mcast_port *pmctx,
29 			unsigned long *timer)
30 {
31 #if IS_ENABLED(CONFIG_IPV6)
32 	*timer = br_timer_value(&pmctx->ip6_mc_router_timer);
33 	return !hlist_unhashed(&pmctx->ip6_rlist);
34 #else
35 	*timer = 0;
36 	return false;
37 #endif
38 }
39 
40 static size_t __br_rports_one_size(void)
41 {
42 	return nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PORT */
43 	       nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PATTR_TIMER */
44 	       nla_total_size(sizeof(u8)) +  /* MDBA_ROUTER_PATTR_TYPE */
45 	       nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PATTR_INET_TIMER */
46 	       nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PATTR_INET6_TIMER */
47 	       nla_total_size(sizeof(u32));  /* MDBA_ROUTER_PATTR_VID */
48 }
49 
50 size_t br_rports_size(const struct net_bridge_mcast *brmctx)
51 {
52 	struct net_bridge_mcast_port *pmctx;
53 	size_t size = nla_total_size(0); /* MDBA_ROUTER */
54 
55 	rcu_read_lock();
56 	hlist_for_each_entry_rcu(pmctx, &brmctx->ip4_mc_router_list,
57 				 ip4_rlist)
58 		size += __br_rports_one_size();
59 
60 #if IS_ENABLED(CONFIG_IPV6)
61 	hlist_for_each_entry_rcu(pmctx, &brmctx->ip6_mc_router_list,
62 				 ip6_rlist)
63 		size += __br_rports_one_size();
64 #endif
65 	rcu_read_unlock();
66 
67 	return size;
68 }
69 
70 int br_rports_fill_info(struct sk_buff *skb,
71 			const struct net_bridge_mcast *brmctx)
72 {
73 	u16 vid = brmctx->vlan ? brmctx->vlan->vid : 0;
74 	bool have_ip4_mc_rtr, have_ip6_mc_rtr;
75 	unsigned long ip4_timer, ip6_timer;
76 	struct nlattr *nest, *port_nest;
77 	struct net_bridge_port *p;
78 
79 	if (!brmctx->multicast_router || !br_rports_have_mc_router(brmctx))
80 		return 0;
81 
82 	nest = nla_nest_start_noflag(skb, MDBA_ROUTER);
83 	if (nest == NULL)
84 		return -EMSGSIZE;
85 
86 	list_for_each_entry_rcu(p, &brmctx->br->port_list, list) {
87 		struct net_bridge_mcast_port *pmctx;
88 
89 		if (vid) {
90 			struct net_bridge_vlan *v;
91 
92 			v = br_vlan_find(nbp_vlan_group(p), vid);
93 			if (!v)
94 				continue;
95 			pmctx = &v->port_mcast_ctx;
96 		} else {
97 			pmctx = &p->multicast_ctx;
98 		}
99 
100 		have_ip4_mc_rtr = br_ip4_rports_get_timer(pmctx, &ip4_timer);
101 		have_ip6_mc_rtr = br_ip6_rports_get_timer(pmctx, &ip6_timer);
102 
103 		if (!have_ip4_mc_rtr && !have_ip6_mc_rtr)
104 			continue;
105 
106 		port_nest = nla_nest_start_noflag(skb, MDBA_ROUTER_PORT);
107 		if (!port_nest)
108 			goto fail;
109 
110 		if (nla_put_nohdr(skb, sizeof(u32), &p->dev->ifindex) ||
111 		    nla_put_u32(skb, MDBA_ROUTER_PATTR_TIMER,
112 				max(ip4_timer, ip6_timer)) ||
113 		    nla_put_u8(skb, MDBA_ROUTER_PATTR_TYPE,
114 			       p->multicast_ctx.multicast_router) ||
115 		    (have_ip4_mc_rtr &&
116 		     nla_put_u32(skb, MDBA_ROUTER_PATTR_INET_TIMER,
117 				 ip4_timer)) ||
118 		    (have_ip6_mc_rtr &&
119 		     nla_put_u32(skb, MDBA_ROUTER_PATTR_INET6_TIMER,
120 				 ip6_timer)) ||
121 		    (vid && nla_put_u16(skb, MDBA_ROUTER_PATTR_VID, vid))) {
122 			nla_nest_cancel(skb, port_nest);
123 			goto fail;
124 		}
125 		nla_nest_end(skb, port_nest);
126 	}
127 
128 	nla_nest_end(skb, nest);
129 	return 0;
130 fail:
131 	nla_nest_cancel(skb, nest);
132 	return -EMSGSIZE;
133 }
134 
135 static void __mdb_entry_fill_flags(struct br_mdb_entry *e, unsigned char flags)
136 {
137 	e->state = flags & MDB_PG_FLAGS_PERMANENT;
138 	e->flags = 0;
139 	if (flags & MDB_PG_FLAGS_OFFLOAD)
140 		e->flags |= MDB_FLAGS_OFFLOAD;
141 	if (flags & MDB_PG_FLAGS_FAST_LEAVE)
142 		e->flags |= MDB_FLAGS_FAST_LEAVE;
143 	if (flags & MDB_PG_FLAGS_STAR_EXCL)
144 		e->flags |= MDB_FLAGS_STAR_EXCL;
145 	if (flags & MDB_PG_FLAGS_BLOCKED)
146 		e->flags |= MDB_FLAGS_BLOCKED;
147 }
148 
149 static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip,
150 				 struct nlattr **mdb_attrs)
151 {
152 	memset(ip, 0, sizeof(struct br_ip));
153 	ip->vid = entry->vid;
154 	ip->proto = entry->addr.proto;
155 	switch (ip->proto) {
156 	case htons(ETH_P_IP):
157 		ip->dst.ip4 = entry->addr.u.ip4;
158 		if (mdb_attrs && mdb_attrs[MDBE_ATTR_SOURCE])
159 			ip->src.ip4 = nla_get_in_addr(mdb_attrs[MDBE_ATTR_SOURCE]);
160 		break;
161 #if IS_ENABLED(CONFIG_IPV6)
162 	case htons(ETH_P_IPV6):
163 		ip->dst.ip6 = entry->addr.u.ip6;
164 		if (mdb_attrs && mdb_attrs[MDBE_ATTR_SOURCE])
165 			ip->src.ip6 = nla_get_in6_addr(mdb_attrs[MDBE_ATTR_SOURCE]);
166 		break;
167 #endif
168 	default:
169 		ether_addr_copy(ip->dst.mac_addr, entry->addr.u.mac_addr);
170 	}
171 
172 }
173 
174 static int __mdb_fill_srcs(struct sk_buff *skb,
175 			   struct net_bridge_port_group *p)
176 {
177 	struct net_bridge_group_src *ent;
178 	struct nlattr *nest, *nest_ent;
179 
180 	if (hlist_empty(&p->src_list))
181 		return 0;
182 
183 	nest = nla_nest_start(skb, MDBA_MDB_EATTR_SRC_LIST);
184 	if (!nest)
185 		return -EMSGSIZE;
186 
187 	hlist_for_each_entry_rcu(ent, &p->src_list, node,
188 				 lockdep_is_held(&p->key.port->br->multicast_lock)) {
189 		nest_ent = nla_nest_start(skb, MDBA_MDB_SRCLIST_ENTRY);
190 		if (!nest_ent)
191 			goto out_cancel_err;
192 		switch (ent->addr.proto) {
193 		case htons(ETH_P_IP):
194 			if (nla_put_in_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
195 					    ent->addr.src.ip4)) {
196 				nla_nest_cancel(skb, nest_ent);
197 				goto out_cancel_err;
198 			}
199 			break;
200 #if IS_ENABLED(CONFIG_IPV6)
201 		case htons(ETH_P_IPV6):
202 			if (nla_put_in6_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
203 					     &ent->addr.src.ip6)) {
204 				nla_nest_cancel(skb, nest_ent);
205 				goto out_cancel_err;
206 			}
207 			break;
208 #endif
209 		default:
210 			nla_nest_cancel(skb, nest_ent);
211 			continue;
212 		}
213 		if (nla_put_u32(skb, MDBA_MDB_SRCATTR_TIMER,
214 				br_timer_value(&ent->timer))) {
215 			nla_nest_cancel(skb, nest_ent);
216 			goto out_cancel_err;
217 		}
218 		nla_nest_end(skb, nest_ent);
219 	}
220 
221 	nla_nest_end(skb, nest);
222 
223 	return 0;
224 
225 out_cancel_err:
226 	nla_nest_cancel(skb, nest);
227 	return -EMSGSIZE;
228 }
229 
230 static int __mdb_fill_info(struct sk_buff *skb,
231 			   struct net_bridge_mdb_entry *mp,
232 			   struct net_bridge_port_group *p)
233 {
234 	bool dump_srcs_mode = false;
235 	struct timer_list *mtimer;
236 	struct nlattr *nest_ent;
237 	struct br_mdb_entry e;
238 	u8 flags = 0;
239 	int ifindex;
240 
241 	memset(&e, 0, sizeof(e));
242 	if (p) {
243 		ifindex = p->key.port->dev->ifindex;
244 		mtimer = &p->timer;
245 		flags = p->flags;
246 	} else {
247 		ifindex = mp->br->dev->ifindex;
248 		mtimer = &mp->timer;
249 	}
250 
251 	__mdb_entry_fill_flags(&e, flags);
252 	e.ifindex = ifindex;
253 	e.vid = mp->addr.vid;
254 	if (mp->addr.proto == htons(ETH_P_IP))
255 		e.addr.u.ip4 = mp->addr.dst.ip4;
256 #if IS_ENABLED(CONFIG_IPV6)
257 	else if (mp->addr.proto == htons(ETH_P_IPV6))
258 		e.addr.u.ip6 = mp->addr.dst.ip6;
259 #endif
260 	else
261 		ether_addr_copy(e.addr.u.mac_addr, mp->addr.dst.mac_addr);
262 	e.addr.proto = mp->addr.proto;
263 	nest_ent = nla_nest_start_noflag(skb,
264 					 MDBA_MDB_ENTRY_INFO);
265 	if (!nest_ent)
266 		return -EMSGSIZE;
267 
268 	if (nla_put_nohdr(skb, sizeof(e), &e) ||
269 	    nla_put_u32(skb,
270 			MDBA_MDB_EATTR_TIMER,
271 			br_timer_value(mtimer)))
272 		goto nest_err;
273 
274 	switch (mp->addr.proto) {
275 	case htons(ETH_P_IP):
276 		dump_srcs_mode = !!(mp->br->multicast_ctx.multicast_igmp_version == 3);
277 		if (mp->addr.src.ip4) {
278 			if (nla_put_in_addr(skb, MDBA_MDB_EATTR_SOURCE,
279 					    mp->addr.src.ip4))
280 				goto nest_err;
281 			break;
282 		}
283 		break;
284 #if IS_ENABLED(CONFIG_IPV6)
285 	case htons(ETH_P_IPV6):
286 		dump_srcs_mode = !!(mp->br->multicast_ctx.multicast_mld_version == 2);
287 		if (!ipv6_addr_any(&mp->addr.src.ip6)) {
288 			if (nla_put_in6_addr(skb, MDBA_MDB_EATTR_SOURCE,
289 					     &mp->addr.src.ip6))
290 				goto nest_err;
291 			break;
292 		}
293 		break;
294 #endif
295 	default:
296 		ether_addr_copy(e.addr.u.mac_addr, mp->addr.dst.mac_addr);
297 	}
298 	if (p) {
299 		if (nla_put_u8(skb, MDBA_MDB_EATTR_RTPROT, p->rt_protocol))
300 			goto nest_err;
301 		if (dump_srcs_mode &&
302 		    (__mdb_fill_srcs(skb, p) ||
303 		     nla_put_u8(skb, MDBA_MDB_EATTR_GROUP_MODE,
304 				p->filter_mode)))
305 			goto nest_err;
306 	}
307 	nla_nest_end(skb, nest_ent);
308 
309 	return 0;
310 
311 nest_err:
312 	nla_nest_cancel(skb, nest_ent);
313 	return -EMSGSIZE;
314 }
315 
316 static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
317 			    struct net_device *dev)
318 {
319 	int idx = 0, s_idx = cb->args[1], err = 0, pidx = 0, s_pidx = cb->args[2];
320 	struct net_bridge *br = netdev_priv(dev);
321 	struct net_bridge_mdb_entry *mp;
322 	struct nlattr *nest, *nest2;
323 
324 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
325 		return 0;
326 
327 	nest = nla_nest_start_noflag(skb, MDBA_MDB);
328 	if (nest == NULL)
329 		return -EMSGSIZE;
330 
331 	hlist_for_each_entry_rcu(mp, &br->mdb_list, mdb_node) {
332 		struct net_bridge_port_group *p;
333 		struct net_bridge_port_group __rcu **pp;
334 
335 		if (idx < s_idx)
336 			goto skip;
337 
338 		nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
339 		if (!nest2) {
340 			err = -EMSGSIZE;
341 			break;
342 		}
343 
344 		if (!s_pidx && mp->host_joined) {
345 			err = __mdb_fill_info(skb, mp, NULL);
346 			if (err) {
347 				nla_nest_cancel(skb, nest2);
348 				break;
349 			}
350 		}
351 
352 		for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
353 		      pp = &p->next) {
354 			if (!p->key.port)
355 				continue;
356 			if (pidx < s_pidx)
357 				goto skip_pg;
358 
359 			err = __mdb_fill_info(skb, mp, p);
360 			if (err) {
361 				nla_nest_end(skb, nest2);
362 				goto out;
363 			}
364 skip_pg:
365 			pidx++;
366 		}
367 		pidx = 0;
368 		s_pidx = 0;
369 		nla_nest_end(skb, nest2);
370 skip:
371 		idx++;
372 	}
373 
374 out:
375 	cb->args[1] = idx;
376 	cb->args[2] = pidx;
377 	nla_nest_end(skb, nest);
378 	return err;
379 }
380 
381 static int br_mdb_valid_dump_req(const struct nlmsghdr *nlh,
382 				 struct netlink_ext_ack *extack)
383 {
384 	struct br_port_msg *bpm;
385 
386 	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*bpm))) {
387 		NL_SET_ERR_MSG_MOD(extack, "Invalid header for mdb dump request");
388 		return -EINVAL;
389 	}
390 
391 	bpm = nlmsg_data(nlh);
392 	if (bpm->ifindex) {
393 		NL_SET_ERR_MSG_MOD(extack, "Filtering by device index is not supported for mdb dump request");
394 		return -EINVAL;
395 	}
396 	if (nlmsg_attrlen(nlh, sizeof(*bpm))) {
397 		NL_SET_ERR_MSG(extack, "Invalid data after header in mdb dump request");
398 		return -EINVAL;
399 	}
400 
401 	return 0;
402 }
403 
404 static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
405 {
406 	struct net_device *dev;
407 	struct net *net = sock_net(skb->sk);
408 	struct nlmsghdr *nlh = NULL;
409 	int idx = 0, s_idx;
410 
411 	if (cb->strict_check) {
412 		int err = br_mdb_valid_dump_req(cb->nlh, cb->extack);
413 
414 		if (err < 0)
415 			return err;
416 	}
417 
418 	s_idx = cb->args[0];
419 
420 	rcu_read_lock();
421 
422 	cb->seq = net->dev_base_seq;
423 
424 	for_each_netdev_rcu(net, dev) {
425 		if (dev->priv_flags & IFF_EBRIDGE) {
426 			struct net_bridge *br = netdev_priv(dev);
427 			struct br_port_msg *bpm;
428 
429 			if (idx < s_idx)
430 				goto skip;
431 
432 			nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
433 					cb->nlh->nlmsg_seq, RTM_GETMDB,
434 					sizeof(*bpm), NLM_F_MULTI);
435 			if (nlh == NULL)
436 				break;
437 
438 			bpm = nlmsg_data(nlh);
439 			memset(bpm, 0, sizeof(*bpm));
440 			bpm->ifindex = dev->ifindex;
441 			if (br_mdb_fill_info(skb, cb, dev) < 0)
442 				goto out;
443 			if (br_rports_fill_info(skb, &br->multicast_ctx) < 0)
444 				goto out;
445 
446 			cb->args[1] = 0;
447 			nlmsg_end(skb, nlh);
448 		skip:
449 			idx++;
450 		}
451 	}
452 
453 out:
454 	if (nlh)
455 		nlmsg_end(skb, nlh);
456 	rcu_read_unlock();
457 	cb->args[0] = idx;
458 	return skb->len;
459 }
460 
461 static int nlmsg_populate_mdb_fill(struct sk_buff *skb,
462 				   struct net_device *dev,
463 				   struct net_bridge_mdb_entry *mp,
464 				   struct net_bridge_port_group *pg,
465 				   int type)
466 {
467 	struct nlmsghdr *nlh;
468 	struct br_port_msg *bpm;
469 	struct nlattr *nest, *nest2;
470 
471 	nlh = nlmsg_put(skb, 0, 0, type, sizeof(*bpm), 0);
472 	if (!nlh)
473 		return -EMSGSIZE;
474 
475 	bpm = nlmsg_data(nlh);
476 	memset(bpm, 0, sizeof(*bpm));
477 	bpm->family  = AF_BRIDGE;
478 	bpm->ifindex = dev->ifindex;
479 	nest = nla_nest_start_noflag(skb, MDBA_MDB);
480 	if (nest == NULL)
481 		goto cancel;
482 	nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
483 	if (nest2 == NULL)
484 		goto end;
485 
486 	if (__mdb_fill_info(skb, mp, pg))
487 		goto end;
488 
489 	nla_nest_end(skb, nest2);
490 	nla_nest_end(skb, nest);
491 	nlmsg_end(skb, nlh);
492 	return 0;
493 
494 end:
495 	nla_nest_end(skb, nest);
496 cancel:
497 	nlmsg_cancel(skb, nlh);
498 	return -EMSGSIZE;
499 }
500 
501 static size_t rtnl_mdb_nlmsg_size(struct net_bridge_port_group *pg)
502 {
503 	size_t nlmsg_size = NLMSG_ALIGN(sizeof(struct br_port_msg)) +
504 			    nla_total_size(sizeof(struct br_mdb_entry)) +
505 			    nla_total_size(sizeof(u32));
506 	struct net_bridge_group_src *ent;
507 	size_t addr_size = 0;
508 
509 	if (!pg)
510 		goto out;
511 
512 	/* MDBA_MDB_EATTR_RTPROT */
513 	nlmsg_size += nla_total_size(sizeof(u8));
514 
515 	switch (pg->key.addr.proto) {
516 	case htons(ETH_P_IP):
517 		/* MDBA_MDB_EATTR_SOURCE */
518 		if (pg->key.addr.src.ip4)
519 			nlmsg_size += nla_total_size(sizeof(__be32));
520 		if (pg->key.port->br->multicast_ctx.multicast_igmp_version == 2)
521 			goto out;
522 		addr_size = sizeof(__be32);
523 		break;
524 #if IS_ENABLED(CONFIG_IPV6)
525 	case htons(ETH_P_IPV6):
526 		/* MDBA_MDB_EATTR_SOURCE */
527 		if (!ipv6_addr_any(&pg->key.addr.src.ip6))
528 			nlmsg_size += nla_total_size(sizeof(struct in6_addr));
529 		if (pg->key.port->br->multicast_ctx.multicast_mld_version == 1)
530 			goto out;
531 		addr_size = sizeof(struct in6_addr);
532 		break;
533 #endif
534 	}
535 
536 	/* MDBA_MDB_EATTR_GROUP_MODE */
537 	nlmsg_size += nla_total_size(sizeof(u8));
538 
539 	/* MDBA_MDB_EATTR_SRC_LIST nested attr */
540 	if (!hlist_empty(&pg->src_list))
541 		nlmsg_size += nla_total_size(0);
542 
543 	hlist_for_each_entry(ent, &pg->src_list, node) {
544 		/* MDBA_MDB_SRCLIST_ENTRY nested attr +
545 		 * MDBA_MDB_SRCATTR_ADDRESS + MDBA_MDB_SRCATTR_TIMER
546 		 */
547 		nlmsg_size += nla_total_size(0) +
548 			      nla_total_size(addr_size) +
549 			      nla_total_size(sizeof(u32));
550 	}
551 out:
552 	return nlmsg_size;
553 }
554 
555 struct br_mdb_complete_info {
556 	struct net_bridge_port *port;
557 	struct br_ip ip;
558 };
559 
560 static void br_mdb_complete(struct net_device *dev, int err, void *priv)
561 {
562 	struct br_mdb_complete_info *data = priv;
563 	struct net_bridge_port_group __rcu **pp;
564 	struct net_bridge_port_group *p;
565 	struct net_bridge_mdb_entry *mp;
566 	struct net_bridge_port *port = data->port;
567 	struct net_bridge *br = port->br;
568 
569 	if (err)
570 		goto err;
571 
572 	spin_lock_bh(&br->multicast_lock);
573 	mp = br_mdb_ip_get(br, &data->ip);
574 	if (!mp)
575 		goto out;
576 	for (pp = &mp->ports; (p = mlock_dereference(*pp, br)) != NULL;
577 	     pp = &p->next) {
578 		if (p->key.port != port)
579 			continue;
580 		p->flags |= MDB_PG_FLAGS_OFFLOAD;
581 	}
582 out:
583 	spin_unlock_bh(&br->multicast_lock);
584 err:
585 	kfree(priv);
586 }
587 
588 static void br_switchdev_mdb_populate(struct switchdev_obj_port_mdb *mdb,
589 				      const struct net_bridge_mdb_entry *mp)
590 {
591 	if (mp->addr.proto == htons(ETH_P_IP))
592 		ip_eth_mc_map(mp->addr.dst.ip4, mdb->addr);
593 #if IS_ENABLED(CONFIG_IPV6)
594 	else if (mp->addr.proto == htons(ETH_P_IPV6))
595 		ipv6_eth_mc_map(&mp->addr.dst.ip6, mdb->addr);
596 #endif
597 	else
598 		ether_addr_copy(mdb->addr, mp->addr.dst.mac_addr);
599 
600 	mdb->vid = mp->addr.vid;
601 }
602 
603 static int br_mdb_replay_one(struct notifier_block *nb, struct net_device *dev,
604 			     const struct switchdev_obj_port_mdb *mdb,
605 			     unsigned long action, const void *ctx,
606 			     struct netlink_ext_ack *extack)
607 {
608 	struct switchdev_notifier_port_obj_info obj_info = {
609 		.info = {
610 			.dev = dev,
611 			.extack = extack,
612 			.ctx = ctx,
613 		},
614 		.obj = &mdb->obj,
615 	};
616 	int err;
617 
618 	err = nb->notifier_call(nb, action, &obj_info);
619 	return notifier_to_errno(err);
620 }
621 
622 static int br_mdb_queue_one(struct list_head *mdb_list,
623 			    enum switchdev_obj_id id,
624 			    const struct net_bridge_mdb_entry *mp,
625 			    struct net_device *orig_dev)
626 {
627 	struct switchdev_obj_port_mdb *mdb;
628 
629 	mdb = kzalloc(sizeof(*mdb), GFP_ATOMIC);
630 	if (!mdb)
631 		return -ENOMEM;
632 
633 	mdb->obj.id = id;
634 	mdb->obj.orig_dev = orig_dev;
635 	br_switchdev_mdb_populate(mdb, mp);
636 	list_add_tail(&mdb->obj.list, mdb_list);
637 
638 	return 0;
639 }
640 
641 int br_mdb_replay(struct net_device *br_dev, struct net_device *dev,
642 		  const void *ctx, bool adding, struct notifier_block *nb,
643 		  struct netlink_ext_ack *extack)
644 {
645 	const struct net_bridge_mdb_entry *mp;
646 	struct switchdev_obj *obj, *tmp;
647 	struct net_bridge *br;
648 	unsigned long action;
649 	LIST_HEAD(mdb_list);
650 	int err = 0;
651 
652 	ASSERT_RTNL();
653 
654 	if (!nb)
655 		return 0;
656 
657 	if (!netif_is_bridge_master(br_dev) || !netif_is_bridge_port(dev))
658 		return -EINVAL;
659 
660 	br = netdev_priv(br_dev);
661 
662 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED))
663 		return 0;
664 
665 	/* We cannot walk over br->mdb_list protected just by the rtnl_mutex,
666 	 * because the write-side protection is br->multicast_lock. But we
667 	 * need to emulate the [ blocking ] calling context of a regular
668 	 * switchdev event, so since both br->multicast_lock and RCU read side
669 	 * critical sections are atomic, we have no choice but to pick the RCU
670 	 * read side lock, queue up all our events, leave the critical section
671 	 * and notify switchdev from blocking context.
672 	 */
673 	rcu_read_lock();
674 
675 	hlist_for_each_entry_rcu(mp, &br->mdb_list, mdb_node) {
676 		struct net_bridge_port_group __rcu * const *pp;
677 		const struct net_bridge_port_group *p;
678 
679 		if (mp->host_joined) {
680 			err = br_mdb_queue_one(&mdb_list,
681 					       SWITCHDEV_OBJ_ID_HOST_MDB,
682 					       mp, br_dev);
683 			if (err) {
684 				rcu_read_unlock();
685 				goto out_free_mdb;
686 			}
687 		}
688 
689 		for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
690 		     pp = &p->next) {
691 			if (p->key.port->dev != dev)
692 				continue;
693 
694 			err = br_mdb_queue_one(&mdb_list,
695 					       SWITCHDEV_OBJ_ID_PORT_MDB,
696 					       mp, dev);
697 			if (err) {
698 				rcu_read_unlock();
699 				goto out_free_mdb;
700 			}
701 		}
702 	}
703 
704 	rcu_read_unlock();
705 
706 	if (adding)
707 		action = SWITCHDEV_PORT_OBJ_ADD;
708 	else
709 		action = SWITCHDEV_PORT_OBJ_DEL;
710 
711 	list_for_each_entry(obj, &mdb_list, list) {
712 		err = br_mdb_replay_one(nb, dev, SWITCHDEV_OBJ_PORT_MDB(obj),
713 					action, ctx, extack);
714 		if (err)
715 			goto out_free_mdb;
716 	}
717 
718 out_free_mdb:
719 	list_for_each_entry_safe(obj, tmp, &mdb_list, list) {
720 		list_del(&obj->list);
721 		kfree(SWITCHDEV_OBJ_PORT_MDB(obj));
722 	}
723 
724 	return err;
725 }
726 
727 static void br_mdb_switchdev_host_port(struct net_device *dev,
728 				       struct net_device *lower_dev,
729 				       struct net_bridge_mdb_entry *mp,
730 				       int type)
731 {
732 	struct switchdev_obj_port_mdb mdb = {
733 		.obj = {
734 			.id = SWITCHDEV_OBJ_ID_HOST_MDB,
735 			.flags = SWITCHDEV_F_DEFER,
736 			.orig_dev = dev,
737 		},
738 	};
739 
740 	br_switchdev_mdb_populate(&mdb, mp);
741 
742 	switch (type) {
743 	case RTM_NEWMDB:
744 		switchdev_port_obj_add(lower_dev, &mdb.obj, NULL);
745 		break;
746 	case RTM_DELMDB:
747 		switchdev_port_obj_del(lower_dev, &mdb.obj);
748 		break;
749 	}
750 }
751 
752 static void br_mdb_switchdev_host(struct net_device *dev,
753 				  struct net_bridge_mdb_entry *mp, int type)
754 {
755 	struct net_device *lower_dev;
756 	struct list_head *iter;
757 
758 	netdev_for_each_lower_dev(dev, lower_dev, iter)
759 		br_mdb_switchdev_host_port(dev, lower_dev, mp, type);
760 }
761 
762 void br_mdb_notify(struct net_device *dev,
763 		   struct net_bridge_mdb_entry *mp,
764 		   struct net_bridge_port_group *pg,
765 		   int type)
766 {
767 	struct br_mdb_complete_info *complete_info;
768 	struct switchdev_obj_port_mdb mdb = {
769 		.obj = {
770 			.id = SWITCHDEV_OBJ_ID_PORT_MDB,
771 			.flags = SWITCHDEV_F_DEFER,
772 		},
773 	};
774 	struct net *net = dev_net(dev);
775 	struct sk_buff *skb;
776 	int err = -ENOBUFS;
777 
778 	if (pg) {
779 		br_switchdev_mdb_populate(&mdb, mp);
780 
781 		mdb.obj.orig_dev = pg->key.port->dev;
782 		switch (type) {
783 		case RTM_NEWMDB:
784 			complete_info = kmalloc(sizeof(*complete_info), GFP_ATOMIC);
785 			if (!complete_info)
786 				break;
787 			complete_info->port = pg->key.port;
788 			complete_info->ip = mp->addr;
789 			mdb.obj.complete_priv = complete_info;
790 			mdb.obj.complete = br_mdb_complete;
791 			if (switchdev_port_obj_add(pg->key.port->dev, &mdb.obj, NULL))
792 				kfree(complete_info);
793 			break;
794 		case RTM_DELMDB:
795 			switchdev_port_obj_del(pg->key.port->dev, &mdb.obj);
796 			break;
797 		}
798 	} else {
799 		br_mdb_switchdev_host(dev, mp, type);
800 	}
801 
802 	skb = nlmsg_new(rtnl_mdb_nlmsg_size(pg), GFP_ATOMIC);
803 	if (!skb)
804 		goto errout;
805 
806 	err = nlmsg_populate_mdb_fill(skb, dev, mp, pg, type);
807 	if (err < 0) {
808 		kfree_skb(skb);
809 		goto errout;
810 	}
811 
812 	rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
813 	return;
814 errout:
815 	rtnl_set_sk_err(net, RTNLGRP_MDB, err);
816 }
817 
818 static int nlmsg_populate_rtr_fill(struct sk_buff *skb,
819 				   struct net_device *dev,
820 				   int ifindex, u16 vid, u32 pid,
821 				   u32 seq, int type, unsigned int flags)
822 {
823 	struct nlattr *nest, *port_nest;
824 	struct br_port_msg *bpm;
825 	struct nlmsghdr *nlh;
826 
827 	nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0);
828 	if (!nlh)
829 		return -EMSGSIZE;
830 
831 	bpm = nlmsg_data(nlh);
832 	memset(bpm, 0, sizeof(*bpm));
833 	bpm->family = AF_BRIDGE;
834 	bpm->ifindex = dev->ifindex;
835 	nest = nla_nest_start_noflag(skb, MDBA_ROUTER);
836 	if (!nest)
837 		goto cancel;
838 
839 	port_nest = nla_nest_start_noflag(skb, MDBA_ROUTER_PORT);
840 	if (!port_nest)
841 		goto end;
842 	if (nla_put_nohdr(skb, sizeof(u32), &ifindex)) {
843 		nla_nest_cancel(skb, port_nest);
844 		goto end;
845 	}
846 	if (vid && nla_put_u16(skb, MDBA_ROUTER_PATTR_VID, vid)) {
847 		nla_nest_cancel(skb, port_nest);
848 		goto end;
849 	}
850 	nla_nest_end(skb, port_nest);
851 
852 	nla_nest_end(skb, nest);
853 	nlmsg_end(skb, nlh);
854 	return 0;
855 
856 end:
857 	nla_nest_end(skb, nest);
858 cancel:
859 	nlmsg_cancel(skb, nlh);
860 	return -EMSGSIZE;
861 }
862 
863 static inline size_t rtnl_rtr_nlmsg_size(void)
864 {
865 	return NLMSG_ALIGN(sizeof(struct br_port_msg))
866 		+ nla_total_size(sizeof(__u32))
867 		+ nla_total_size(sizeof(u16));
868 }
869 
870 void br_rtr_notify(struct net_device *dev, struct net_bridge_mcast_port *pmctx,
871 		   int type)
872 {
873 	struct net *net = dev_net(dev);
874 	struct sk_buff *skb;
875 	int err = -ENOBUFS;
876 	int ifindex;
877 	u16 vid;
878 
879 	ifindex = pmctx ? pmctx->port->dev->ifindex : 0;
880 	vid = pmctx && br_multicast_port_ctx_is_vlan(pmctx) ? pmctx->vlan->vid :
881 							      0;
882 	skb = nlmsg_new(rtnl_rtr_nlmsg_size(), GFP_ATOMIC);
883 	if (!skb)
884 		goto errout;
885 
886 	err = nlmsg_populate_rtr_fill(skb, dev, ifindex, vid, 0, 0, type,
887 				      NTF_SELF);
888 	if (err < 0) {
889 		kfree_skb(skb);
890 		goto errout;
891 	}
892 
893 	rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
894 	return;
895 
896 errout:
897 	rtnl_set_sk_err(net, RTNLGRP_MDB, err);
898 }
899 
900 static bool is_valid_mdb_entry(struct br_mdb_entry *entry,
901 			       struct netlink_ext_ack *extack)
902 {
903 	if (entry->ifindex == 0) {
904 		NL_SET_ERR_MSG_MOD(extack, "Zero entry ifindex is not allowed");
905 		return false;
906 	}
907 
908 	if (entry->addr.proto == htons(ETH_P_IP)) {
909 		if (!ipv4_is_multicast(entry->addr.u.ip4)) {
910 			NL_SET_ERR_MSG_MOD(extack, "IPv4 entry group address is not multicast");
911 			return false;
912 		}
913 		if (ipv4_is_local_multicast(entry->addr.u.ip4)) {
914 			NL_SET_ERR_MSG_MOD(extack, "IPv4 entry group address is local multicast");
915 			return false;
916 		}
917 #if IS_ENABLED(CONFIG_IPV6)
918 	} else if (entry->addr.proto == htons(ETH_P_IPV6)) {
919 		if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6)) {
920 			NL_SET_ERR_MSG_MOD(extack, "IPv6 entry group address is link-local all nodes");
921 			return false;
922 		}
923 #endif
924 	} else if (entry->addr.proto == 0) {
925 		/* L2 mdb */
926 		if (!is_multicast_ether_addr(entry->addr.u.mac_addr)) {
927 			NL_SET_ERR_MSG_MOD(extack, "L2 entry group is not multicast");
928 			return false;
929 		}
930 	} else {
931 		NL_SET_ERR_MSG_MOD(extack, "Unknown entry protocol");
932 		return false;
933 	}
934 
935 	if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) {
936 		NL_SET_ERR_MSG_MOD(extack, "Unknown entry state");
937 		return false;
938 	}
939 	if (entry->vid >= VLAN_VID_MASK) {
940 		NL_SET_ERR_MSG_MOD(extack, "Invalid entry VLAN id");
941 		return false;
942 	}
943 
944 	return true;
945 }
946 
947 static bool is_valid_mdb_source(struct nlattr *attr, __be16 proto,
948 				struct netlink_ext_ack *extack)
949 {
950 	switch (proto) {
951 	case htons(ETH_P_IP):
952 		if (nla_len(attr) != sizeof(struct in_addr)) {
953 			NL_SET_ERR_MSG_MOD(extack, "IPv4 invalid source address length");
954 			return false;
955 		}
956 		if (ipv4_is_multicast(nla_get_in_addr(attr))) {
957 			NL_SET_ERR_MSG_MOD(extack, "IPv4 multicast source address is not allowed");
958 			return false;
959 		}
960 		break;
961 #if IS_ENABLED(CONFIG_IPV6)
962 	case htons(ETH_P_IPV6): {
963 		struct in6_addr src;
964 
965 		if (nla_len(attr) != sizeof(struct in6_addr)) {
966 			NL_SET_ERR_MSG_MOD(extack, "IPv6 invalid source address length");
967 			return false;
968 		}
969 		src = nla_get_in6_addr(attr);
970 		if (ipv6_addr_is_multicast(&src)) {
971 			NL_SET_ERR_MSG_MOD(extack, "IPv6 multicast source address is not allowed");
972 			return false;
973 		}
974 		break;
975 	}
976 #endif
977 	default:
978 		NL_SET_ERR_MSG_MOD(extack, "Invalid protocol used with source address");
979 		return false;
980 	}
981 
982 	return true;
983 }
984 
985 static const struct nla_policy br_mdbe_attrs_pol[MDBE_ATTR_MAX + 1] = {
986 	[MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
987 					      sizeof(struct in_addr),
988 					      sizeof(struct in6_addr)),
989 };
990 
991 static int br_mdb_parse(struct sk_buff *skb, struct nlmsghdr *nlh,
992 			struct net_device **pdev, struct br_mdb_entry **pentry,
993 			struct nlattr **mdb_attrs, struct netlink_ext_ack *extack)
994 {
995 	struct net *net = sock_net(skb->sk);
996 	struct br_mdb_entry *entry;
997 	struct br_port_msg *bpm;
998 	struct nlattr *tb[MDBA_SET_ENTRY_MAX+1];
999 	struct net_device *dev;
1000 	int err;
1001 
1002 	err = nlmsg_parse_deprecated(nlh, sizeof(*bpm), tb,
1003 				     MDBA_SET_ENTRY_MAX, NULL, NULL);
1004 	if (err < 0)
1005 		return err;
1006 
1007 	bpm = nlmsg_data(nlh);
1008 	if (bpm->ifindex == 0) {
1009 		NL_SET_ERR_MSG_MOD(extack, "Invalid bridge ifindex");
1010 		return -EINVAL;
1011 	}
1012 
1013 	dev = __dev_get_by_index(net, bpm->ifindex);
1014 	if (dev == NULL) {
1015 		NL_SET_ERR_MSG_MOD(extack, "Bridge device doesn't exist");
1016 		return -ENODEV;
1017 	}
1018 
1019 	if (!(dev->priv_flags & IFF_EBRIDGE)) {
1020 		NL_SET_ERR_MSG_MOD(extack, "Device is not a bridge");
1021 		return -EOPNOTSUPP;
1022 	}
1023 
1024 	*pdev = dev;
1025 
1026 	if (!tb[MDBA_SET_ENTRY]) {
1027 		NL_SET_ERR_MSG_MOD(extack, "Missing MDBA_SET_ENTRY attribute");
1028 		return -EINVAL;
1029 	}
1030 	if (nla_len(tb[MDBA_SET_ENTRY]) != sizeof(struct br_mdb_entry)) {
1031 		NL_SET_ERR_MSG_MOD(extack, "Invalid MDBA_SET_ENTRY attribute length");
1032 		return -EINVAL;
1033 	}
1034 
1035 	entry = nla_data(tb[MDBA_SET_ENTRY]);
1036 	if (!is_valid_mdb_entry(entry, extack))
1037 		return -EINVAL;
1038 	*pentry = entry;
1039 
1040 	if (tb[MDBA_SET_ENTRY_ATTRS]) {
1041 		err = nla_parse_nested(mdb_attrs, MDBE_ATTR_MAX,
1042 				       tb[MDBA_SET_ENTRY_ATTRS],
1043 				       br_mdbe_attrs_pol, extack);
1044 		if (err)
1045 			return err;
1046 		if (mdb_attrs[MDBE_ATTR_SOURCE] &&
1047 		    !is_valid_mdb_source(mdb_attrs[MDBE_ATTR_SOURCE],
1048 					 entry->addr.proto, extack))
1049 			return -EINVAL;
1050 	} else {
1051 		memset(mdb_attrs, 0,
1052 		       sizeof(struct nlattr *) * (MDBE_ATTR_MAX + 1));
1053 	}
1054 
1055 	return 0;
1056 }
1057 
1058 static struct net_bridge_mcast *
1059 __br_mdb_choose_context(struct net_bridge *br,
1060 			const struct br_mdb_entry *entry,
1061 			struct netlink_ext_ack *extack)
1062 {
1063 	struct net_bridge_mcast *brmctx = NULL;
1064 	struct net_bridge_vlan *v;
1065 
1066 	if (!br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) {
1067 		brmctx = &br->multicast_ctx;
1068 		goto out;
1069 	}
1070 
1071 	if (!entry->vid) {
1072 		NL_SET_ERR_MSG_MOD(extack, "Cannot add an entry without a vlan when vlan snooping is enabled");
1073 		goto out;
1074 	}
1075 
1076 	v = br_vlan_find(br_vlan_group(br), entry->vid);
1077 	if (!v) {
1078 		NL_SET_ERR_MSG_MOD(extack, "Vlan is not configured");
1079 		goto out;
1080 	}
1081 	if (br_multicast_ctx_vlan_global_disabled(&v->br_mcast_ctx)) {
1082 		NL_SET_ERR_MSG_MOD(extack, "Vlan's multicast processing is disabled");
1083 		goto out;
1084 	}
1085 	brmctx = &v->br_mcast_ctx;
1086 out:
1087 	return brmctx;
1088 }
1089 
1090 static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
1091 			    struct br_mdb_entry *entry,
1092 			    struct nlattr **mdb_attrs,
1093 			    struct netlink_ext_ack *extack)
1094 {
1095 	struct net_bridge_mdb_entry *mp, *star_mp;
1096 	struct net_bridge_port_group __rcu **pp;
1097 	struct net_bridge_port_group *p;
1098 	struct net_bridge_mcast *brmctx;
1099 	struct br_ip group, star_group;
1100 	unsigned long now = jiffies;
1101 	unsigned char flags = 0;
1102 	u8 filter_mode;
1103 	int err;
1104 
1105 	__mdb_entry_to_br_ip(entry, &group, mdb_attrs);
1106 
1107 	brmctx = __br_mdb_choose_context(br, entry, extack);
1108 	if (!brmctx)
1109 		return -EINVAL;
1110 
1111 	/* host join errors which can happen before creating the group */
1112 	if (!port) {
1113 		/* don't allow any flags for host-joined groups */
1114 		if (entry->state) {
1115 			NL_SET_ERR_MSG_MOD(extack, "Flags are not allowed for host groups");
1116 			return -EINVAL;
1117 		}
1118 		if (!br_multicast_is_star_g(&group)) {
1119 			NL_SET_ERR_MSG_MOD(extack, "Groups with sources cannot be manually host joined");
1120 			return -EINVAL;
1121 		}
1122 	}
1123 
1124 	if (br_group_is_l2(&group) && entry->state != MDB_PERMANENT) {
1125 		NL_SET_ERR_MSG_MOD(extack, "Only permanent L2 entries allowed");
1126 		return -EINVAL;
1127 	}
1128 
1129 	mp = br_mdb_ip_get(br, &group);
1130 	if (!mp) {
1131 		mp = br_multicast_new_group(br, &group);
1132 		err = PTR_ERR_OR_ZERO(mp);
1133 		if (err)
1134 			return err;
1135 	}
1136 
1137 	/* host join */
1138 	if (!port) {
1139 		if (mp->host_joined) {
1140 			NL_SET_ERR_MSG_MOD(extack, "Group is already joined by host");
1141 			return -EEXIST;
1142 		}
1143 
1144 		br_multicast_host_join(brmctx, mp, false);
1145 		br_mdb_notify(br->dev, mp, NULL, RTM_NEWMDB);
1146 
1147 		return 0;
1148 	}
1149 
1150 	for (pp = &mp->ports;
1151 	     (p = mlock_dereference(*pp, br)) != NULL;
1152 	     pp = &p->next) {
1153 		if (p->key.port == port) {
1154 			NL_SET_ERR_MSG_MOD(extack, "Group is already joined by port");
1155 			return -EEXIST;
1156 		}
1157 		if ((unsigned long)p->key.port < (unsigned long)port)
1158 			break;
1159 	}
1160 
1161 	filter_mode = br_multicast_is_star_g(&group) ? MCAST_EXCLUDE :
1162 						       MCAST_INCLUDE;
1163 
1164 	if (entry->state == MDB_PERMANENT)
1165 		flags |= MDB_PG_FLAGS_PERMANENT;
1166 
1167 	p = br_multicast_new_port_group(port, &group, *pp, flags, NULL,
1168 					filter_mode, RTPROT_STATIC);
1169 	if (unlikely(!p)) {
1170 		NL_SET_ERR_MSG_MOD(extack, "Couldn't allocate new port group");
1171 		return -ENOMEM;
1172 	}
1173 	rcu_assign_pointer(*pp, p);
1174 	if (entry->state == MDB_TEMPORARY)
1175 		mod_timer(&p->timer,
1176 			  now + brmctx->multicast_membership_interval);
1177 	br_mdb_notify(br->dev, mp, p, RTM_NEWMDB);
1178 	/* if we are adding a new EXCLUDE port group (*,G) it needs to be also
1179 	 * added to all S,G entries for proper replication, if we are adding
1180 	 * a new INCLUDE port (S,G) then all of *,G EXCLUDE ports need to be
1181 	 * added to it for proper replication
1182 	 */
1183 	if (br_multicast_should_handle_mode(brmctx, group.proto)) {
1184 		switch (filter_mode) {
1185 		case MCAST_EXCLUDE:
1186 			br_multicast_star_g_handle_mode(p, MCAST_EXCLUDE);
1187 			break;
1188 		case MCAST_INCLUDE:
1189 			star_group = p->key.addr;
1190 			memset(&star_group.src, 0, sizeof(star_group.src));
1191 			star_mp = br_mdb_ip_get(br, &star_group);
1192 			if (star_mp)
1193 				br_multicast_sg_add_exclude_ports(star_mp, p);
1194 			break;
1195 		}
1196 	}
1197 
1198 	return 0;
1199 }
1200 
1201 static int __br_mdb_add(struct net *net, struct net_bridge *br,
1202 			struct net_bridge_port *p,
1203 			struct br_mdb_entry *entry,
1204 			struct nlattr **mdb_attrs,
1205 			struct netlink_ext_ack *extack)
1206 {
1207 	int ret;
1208 
1209 	spin_lock_bh(&br->multicast_lock);
1210 	ret = br_mdb_add_group(br, p, entry, mdb_attrs, extack);
1211 	spin_unlock_bh(&br->multicast_lock);
1212 
1213 	return ret;
1214 }
1215 
1216 static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
1217 		      struct netlink_ext_ack *extack)
1218 {
1219 	struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
1220 	struct net *net = sock_net(skb->sk);
1221 	struct net_bridge_vlan_group *vg;
1222 	struct net_bridge_port *p = NULL;
1223 	struct net_device *dev, *pdev;
1224 	struct br_mdb_entry *entry;
1225 	struct net_bridge_vlan *v;
1226 	struct net_bridge *br;
1227 	int err;
1228 
1229 	err = br_mdb_parse(skb, nlh, &dev, &entry, mdb_attrs, extack);
1230 	if (err < 0)
1231 		return err;
1232 
1233 	br = netdev_priv(dev);
1234 
1235 	if (!netif_running(br->dev)) {
1236 		NL_SET_ERR_MSG_MOD(extack, "Bridge device is not running");
1237 		return -EINVAL;
1238 	}
1239 
1240 	if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) {
1241 		NL_SET_ERR_MSG_MOD(extack, "Bridge's multicast processing is disabled");
1242 		return -EINVAL;
1243 	}
1244 
1245 	if (entry->ifindex != br->dev->ifindex) {
1246 		pdev = __dev_get_by_index(net, entry->ifindex);
1247 		if (!pdev) {
1248 			NL_SET_ERR_MSG_MOD(extack, "Port net device doesn't exist");
1249 			return -ENODEV;
1250 		}
1251 
1252 		p = br_port_get_rtnl(pdev);
1253 		if (!p) {
1254 			NL_SET_ERR_MSG_MOD(extack, "Net device is not a bridge port");
1255 			return -EINVAL;
1256 		}
1257 
1258 		if (p->br != br) {
1259 			NL_SET_ERR_MSG_MOD(extack, "Port belongs to a different bridge device");
1260 			return -EINVAL;
1261 		}
1262 		if (p->state == BR_STATE_DISABLED) {
1263 			NL_SET_ERR_MSG_MOD(extack, "Port is in disabled state");
1264 			return -EINVAL;
1265 		}
1266 		vg = nbp_vlan_group(p);
1267 	} else {
1268 		vg = br_vlan_group(br);
1269 	}
1270 
1271 	/* If vlan filtering is enabled and VLAN is not specified
1272 	 * install mdb entry on all vlans configured on the port.
1273 	 */
1274 	if (br_vlan_enabled(br->dev) && vg && entry->vid == 0) {
1275 		list_for_each_entry(v, &vg->vlan_list, vlist) {
1276 			entry->vid = v->vid;
1277 			err = __br_mdb_add(net, br, p, entry, mdb_attrs, extack);
1278 			if (err)
1279 				break;
1280 		}
1281 	} else {
1282 		err = __br_mdb_add(net, br, p, entry, mdb_attrs, extack);
1283 	}
1284 
1285 	return err;
1286 }
1287 
1288 static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry,
1289 			struct nlattr **mdb_attrs)
1290 {
1291 	struct net_bridge_mdb_entry *mp;
1292 	struct net_bridge_port_group *p;
1293 	struct net_bridge_port_group __rcu **pp;
1294 	struct br_ip ip;
1295 	int err = -EINVAL;
1296 
1297 	if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED))
1298 		return -EINVAL;
1299 
1300 	__mdb_entry_to_br_ip(entry, &ip, mdb_attrs);
1301 
1302 	spin_lock_bh(&br->multicast_lock);
1303 	mp = br_mdb_ip_get(br, &ip);
1304 	if (!mp)
1305 		goto unlock;
1306 
1307 	/* host leave */
1308 	if (entry->ifindex == mp->br->dev->ifindex && mp->host_joined) {
1309 		br_multicast_host_leave(mp, false);
1310 		err = 0;
1311 		br_mdb_notify(br->dev, mp, NULL, RTM_DELMDB);
1312 		if (!mp->ports && netif_running(br->dev))
1313 			mod_timer(&mp->timer, jiffies);
1314 		goto unlock;
1315 	}
1316 
1317 	for (pp = &mp->ports;
1318 	     (p = mlock_dereference(*pp, br)) != NULL;
1319 	     pp = &p->next) {
1320 		if (!p->key.port || p->key.port->dev->ifindex != entry->ifindex)
1321 			continue;
1322 
1323 		if (p->key.port->state == BR_STATE_DISABLED)
1324 			goto unlock;
1325 
1326 		br_multicast_del_pg(mp, p, pp);
1327 		err = 0;
1328 		break;
1329 	}
1330 
1331 unlock:
1332 	spin_unlock_bh(&br->multicast_lock);
1333 	return err;
1334 }
1335 
1336 static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
1337 		      struct netlink_ext_ack *extack)
1338 {
1339 	struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
1340 	struct net *net = sock_net(skb->sk);
1341 	struct net_bridge_vlan_group *vg;
1342 	struct net_bridge_port *p = NULL;
1343 	struct net_device *dev, *pdev;
1344 	struct br_mdb_entry *entry;
1345 	struct net_bridge_vlan *v;
1346 	struct net_bridge *br;
1347 	int err;
1348 
1349 	err = br_mdb_parse(skb, nlh, &dev, &entry, mdb_attrs, extack);
1350 	if (err < 0)
1351 		return err;
1352 
1353 	br = netdev_priv(dev);
1354 
1355 	if (entry->ifindex != br->dev->ifindex) {
1356 		pdev = __dev_get_by_index(net, entry->ifindex);
1357 		if (!pdev)
1358 			return -ENODEV;
1359 
1360 		p = br_port_get_rtnl(pdev);
1361 		if (!p || p->br != br || p->state == BR_STATE_DISABLED)
1362 			return -EINVAL;
1363 		vg = nbp_vlan_group(p);
1364 	} else {
1365 		vg = br_vlan_group(br);
1366 	}
1367 
1368 	/* If vlan filtering is enabled and VLAN is not specified
1369 	 * delete mdb entry on all vlans configured on the port.
1370 	 */
1371 	if (br_vlan_enabled(br->dev) && vg && entry->vid == 0) {
1372 		list_for_each_entry(v, &vg->vlan_list, vlist) {
1373 			entry->vid = v->vid;
1374 			err = __br_mdb_del(br, entry, mdb_attrs);
1375 		}
1376 	} else {
1377 		err = __br_mdb_del(br, entry, mdb_attrs);
1378 	}
1379 
1380 	return err;
1381 }
1382 
1383 void br_mdb_init(void)
1384 {
1385 	rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, 0);
1386 	rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, 0);
1387 	rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, 0);
1388 }
1389 
1390 void br_mdb_uninit(void)
1391 {
1392 	rtnl_unregister(PF_BRIDGE, RTM_GETMDB);
1393 	rtnl_unregister(PF_BRIDGE, RTM_NEWMDB);
1394 	rtnl_unregister(PF_BRIDGE, RTM_DELMDB);
1395 }
1396