File Index
Files and directories
Sign in
FILE

br_mdb.c

File preview with syntax highlighting.

linux-6.19.14/net/bridge/br_mdb.c C
   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
  19static bool
  20br_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
  27static bool
  28br_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
  40static 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
  50size_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
  70int 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;
 130fail:
 131	nla_nest_cancel(skb, nest);
 132	return -EMSGSIZE;
 133}
 134
 135static 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	if (flags & MDB_PG_FLAGS_OFFLOAD_FAILED)
 148		e->flags |= MDB_FLAGS_OFFLOAD_FAILED;
 149}
 150
 151static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip,
 152				 struct nlattr **mdb_attrs)
 153{
 154	memset(ip, 0, sizeof(struct br_ip));
 155	ip->vid = entry->vid;
 156	ip->proto = entry->addr.proto;
 157	switch (ip->proto) {
 158	case htons(ETH_P_IP):
 159		ip->dst.ip4 = entry->addr.u.ip4;
 160		if (mdb_attrs && mdb_attrs[MDBE_ATTR_SOURCE])
 161			ip->src.ip4 = nla_get_in_addr(mdb_attrs[MDBE_ATTR_SOURCE]);
 162		break;
 163#if IS_ENABLED(CONFIG_IPV6)
 164	case htons(ETH_P_IPV6):
 165		ip->dst.ip6 = entry->addr.u.ip6;
 166		if (mdb_attrs && mdb_attrs[MDBE_ATTR_SOURCE])
 167			ip->src.ip6 = nla_get_in6_addr(mdb_attrs[MDBE_ATTR_SOURCE]);
 168		break;
 169#endif
 170	default:
 171		ether_addr_copy(ip->dst.mac_addr, entry->addr.u.mac_addr);
 172	}
 173
 174}
 175
 176static int __mdb_fill_srcs(struct sk_buff *skb,
 177			   struct net_bridge_port_group *p)
 178{
 179	struct net_bridge_group_src *ent;
 180	struct nlattr *nest, *nest_ent;
 181
 182	if (hlist_empty(&p->src_list))
 183		return 0;
 184
 185	nest = nla_nest_start(skb, MDBA_MDB_EATTR_SRC_LIST);
 186	if (!nest)
 187		return -EMSGSIZE;
 188
 189	hlist_for_each_entry_rcu(ent, &p->src_list, node,
 190				 lockdep_is_held(&p->key.port->br->multicast_lock)) {
 191		nest_ent = nla_nest_start(skb, MDBA_MDB_SRCLIST_ENTRY);
 192		if (!nest_ent)
 193			goto out_cancel_err;
 194		switch (ent->addr.proto) {
 195		case htons(ETH_P_IP):
 196			if (nla_put_in_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
 197					    ent->addr.src.ip4)) {
 198				nla_nest_cancel(skb, nest_ent);
 199				goto out_cancel_err;
 200			}
 201			break;
 202#if IS_ENABLED(CONFIG_IPV6)
 203		case htons(ETH_P_IPV6):
 204			if (nla_put_in6_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
 205					     &ent->addr.src.ip6)) {
 206				nla_nest_cancel(skb, nest_ent);
 207				goto out_cancel_err;
 208			}
 209			break;
 210#endif
 211		default:
 212			nla_nest_cancel(skb, nest_ent);
 213			continue;
 214		}
 215		if (nla_put_u32(skb, MDBA_MDB_SRCATTR_TIMER,
 216				br_timer_value(&ent->timer))) {
 217			nla_nest_cancel(skb, nest_ent);
 218			goto out_cancel_err;
 219		}
 220		nla_nest_end(skb, nest_ent);
 221	}
 222
 223	nla_nest_end(skb, nest);
 224
 225	return 0;
 226
 227out_cancel_err:
 228	nla_nest_cancel(skb, nest);
 229	return -EMSGSIZE;
 230}
 231
 232static int __mdb_fill_info(struct sk_buff *skb,
 233			   struct net_bridge_mdb_entry *mp,
 234			   struct net_bridge_port_group *p)
 235{
 236	bool dump_srcs_mode = false;
 237	struct timer_list *mtimer;
 238	struct nlattr *nest_ent;
 239	struct br_mdb_entry e;
 240	u8 flags = 0;
 241	int ifindex;
 242
 243	memset(&e, 0, sizeof(e));
 244	if (p) {
 245		ifindex = p->key.port->dev->ifindex;
 246		mtimer = &p->timer;
 247		flags = p->flags;
 248	} else {
 249		ifindex = mp->br->dev->ifindex;
 250		mtimer = &mp->timer;
 251	}
 252
 253	__mdb_entry_fill_flags(&e, flags);
 254	e.ifindex = ifindex;
 255	e.vid = mp->addr.vid;
 256	if (mp->addr.proto == htons(ETH_P_IP)) {
 257		e.addr.u.ip4 = mp->addr.dst.ip4;
 258#if IS_ENABLED(CONFIG_IPV6)
 259	} else if (mp->addr.proto == htons(ETH_P_IPV6)) {
 260		e.addr.u.ip6 = mp->addr.dst.ip6;
 261#endif
 262	} else {
 263		ether_addr_copy(e.addr.u.mac_addr, mp->addr.dst.mac_addr);
 264		e.state = MDB_PERMANENT;
 265	}
 266	e.addr.proto = mp->addr.proto;
 267	nest_ent = nla_nest_start_noflag(skb,
 268					 MDBA_MDB_ENTRY_INFO);
 269	if (!nest_ent)
 270		return -EMSGSIZE;
 271
 272	if (nla_put_nohdr(skb, sizeof(e), &e) ||
 273	    nla_put_u32(skb,
 274			MDBA_MDB_EATTR_TIMER,
 275			br_timer_value(mtimer)))
 276		goto nest_err;
 277
 278	switch (mp->addr.proto) {
 279	case htons(ETH_P_IP):
 280		dump_srcs_mode = !!(mp->br->multicast_ctx.multicast_igmp_version == 3);
 281		if (mp->addr.src.ip4) {
 282			if (nla_put_in_addr(skb, MDBA_MDB_EATTR_SOURCE,
 283					    mp->addr.src.ip4))
 284				goto nest_err;
 285			break;
 286		}
 287		break;
 288#if IS_ENABLED(CONFIG_IPV6)
 289	case htons(ETH_P_IPV6):
 290		dump_srcs_mode = !!(mp->br->multicast_ctx.multicast_mld_version == 2);
 291		if (!ipv6_addr_any(&mp->addr.src.ip6)) {
 292			if (nla_put_in6_addr(skb, MDBA_MDB_EATTR_SOURCE,
 293					     &mp->addr.src.ip6))
 294				goto nest_err;
 295			break;
 296		}
 297		break;
 298#endif
 299	default:
 300		ether_addr_copy(e.addr.u.mac_addr, mp->addr.dst.mac_addr);
 301	}
 302	if (p) {
 303		if (nla_put_u8(skb, MDBA_MDB_EATTR_RTPROT, p->rt_protocol))
 304			goto nest_err;
 305		if (dump_srcs_mode &&
 306		    (__mdb_fill_srcs(skb, p) ||
 307		     nla_put_u8(skb, MDBA_MDB_EATTR_GROUP_MODE,
 308				p->filter_mode)))
 309			goto nest_err;
 310	}
 311	nla_nest_end(skb, nest_ent);
 312
 313	return 0;
 314
 315nest_err:
 316	nla_nest_cancel(skb, nest_ent);
 317	return -EMSGSIZE;
 318}
 319
 320static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
 321			    struct net_device *dev)
 322{
 323	int idx = 0, s_idx = cb->args[1], err = 0, pidx = 0, s_pidx = cb->args[2];
 324	struct net_bridge *br = netdev_priv(dev);
 325	struct net_bridge_mdb_entry *mp;
 326	struct nlattr *nest, *nest2;
 327
 328	nest = nla_nest_start_noflag(skb, MDBA_MDB);
 329	if (nest == NULL)
 330		return -EMSGSIZE;
 331
 332	hlist_for_each_entry_rcu(mp, &br->mdb_list, mdb_node) {
 333		struct net_bridge_port_group *p;
 334		struct net_bridge_port_group __rcu **pp;
 335
 336		if (idx < s_idx)
 337			goto skip;
 338
 339		nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
 340		if (!nest2) {
 341			err = -EMSGSIZE;
 342			break;
 343		}
 344
 345		if (!s_pidx && mp->host_joined) {
 346			err = __mdb_fill_info(skb, mp, NULL);
 347			if (err) {
 348				nla_nest_cancel(skb, nest2);
 349				break;
 350			}
 351		}
 352
 353		for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
 354		      pp = &p->next) {
 355			if (!p->key.port)
 356				continue;
 357			if (pidx < s_pidx)
 358				goto skip_pg;
 359
 360			err = __mdb_fill_info(skb, mp, p);
 361			if (err) {
 362				nla_nest_end(skb, nest2);
 363				goto out;
 364			}
 365skip_pg:
 366			pidx++;
 367		}
 368		pidx = 0;
 369		s_pidx = 0;
 370		nla_nest_end(skb, nest2);
 371skip:
 372		idx++;
 373	}
 374
 375out:
 376	cb->args[1] = idx;
 377	cb->args[2] = pidx;
 378	nla_nest_end(skb, nest);
 379	return err;
 380}
 381
 382int br_mdb_dump(struct net_device *dev, struct sk_buff *skb,
 383		struct netlink_callback *cb)
 384{
 385	struct net_bridge *br = netdev_priv(dev);
 386	struct br_port_msg *bpm;
 387	struct nlmsghdr *nlh;
 388	int err;
 389
 390	nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
 391			cb->nlh->nlmsg_seq, RTM_GETMDB, sizeof(*bpm),
 392			NLM_F_MULTI);
 393	if (!nlh)
 394		return -EMSGSIZE;
 395
 396	bpm = nlmsg_data(nlh);
 397	memset(bpm, 0, sizeof(*bpm));
 398	bpm->ifindex = dev->ifindex;
 399
 400	rcu_read_lock();
 401
 402	err = br_mdb_fill_info(skb, cb, dev);
 403	if (err)
 404		goto out;
 405	err = br_rports_fill_info(skb, &br->multicast_ctx);
 406	if (err)
 407		goto out;
 408
 409out:
 410	rcu_read_unlock();
 411	nlmsg_end(skb, nlh);
 412	return err;
 413}
 414
 415static int nlmsg_populate_mdb_fill(struct sk_buff *skb,
 416				   struct net_device *dev,
 417				   struct net_bridge_mdb_entry *mp,
 418				   struct net_bridge_port_group *pg,
 419				   int type)
 420{
 421	struct nlmsghdr *nlh;
 422	struct br_port_msg *bpm;
 423	struct nlattr *nest, *nest2;
 424
 425	nlh = nlmsg_put(skb, 0, 0, type, sizeof(*bpm), 0);
 426	if (!nlh)
 427		return -EMSGSIZE;
 428
 429	bpm = nlmsg_data(nlh);
 430	memset(bpm, 0, sizeof(*bpm));
 431	bpm->family  = AF_BRIDGE;
 432	bpm->ifindex = dev->ifindex;
 433	nest = nla_nest_start_noflag(skb, MDBA_MDB);
 434	if (nest == NULL)
 435		goto cancel;
 436	nest2 = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
 437	if (nest2 == NULL)
 438		goto end;
 439
 440	if (__mdb_fill_info(skb, mp, pg))
 441		goto end;
 442
 443	nla_nest_end(skb, nest2);
 444	nla_nest_end(skb, nest);
 445	nlmsg_end(skb, nlh);
 446	return 0;
 447
 448end:
 449	nla_nest_end(skb, nest);
 450cancel:
 451	nlmsg_cancel(skb, nlh);
 452	return -EMSGSIZE;
 453}
 454
 455static size_t rtnl_mdb_nlmsg_pg_size(const struct net_bridge_port_group *pg)
 456{
 457	struct net_bridge_group_src *ent;
 458	size_t nlmsg_size, addr_size = 0;
 459
 460		     /* MDBA_MDB_ENTRY_INFO */
 461	nlmsg_size = nla_total_size(sizeof(struct br_mdb_entry)) +
 462		     /* MDBA_MDB_EATTR_TIMER */
 463		     nla_total_size(sizeof(u32));
 464
 465	if (!pg)
 466		goto out;
 467
 468	/* MDBA_MDB_EATTR_RTPROT */
 469	nlmsg_size += nla_total_size(sizeof(u8));
 470
 471	switch (pg->key.addr.proto) {
 472	case htons(ETH_P_IP):
 473		/* MDBA_MDB_EATTR_SOURCE */
 474		if (pg->key.addr.src.ip4)
 475			nlmsg_size += nla_total_size(sizeof(__be32));
 476		if (pg->key.port->br->multicast_ctx.multicast_igmp_version == 2)
 477			goto out;
 478		addr_size = sizeof(__be32);
 479		break;
 480#if IS_ENABLED(CONFIG_IPV6)
 481	case htons(ETH_P_IPV6):
 482		/* MDBA_MDB_EATTR_SOURCE */
 483		if (!ipv6_addr_any(&pg->key.addr.src.ip6))
 484			nlmsg_size += nla_total_size(sizeof(struct in6_addr));
 485		if (pg->key.port->br->multicast_ctx.multicast_mld_version == 1)
 486			goto out;
 487		addr_size = sizeof(struct in6_addr);
 488		break;
 489#endif
 490	}
 491
 492	/* MDBA_MDB_EATTR_GROUP_MODE */
 493	nlmsg_size += nla_total_size(sizeof(u8));
 494
 495	/* MDBA_MDB_EATTR_SRC_LIST nested attr */
 496	if (!hlist_empty(&pg->src_list))
 497		nlmsg_size += nla_total_size(0);
 498
 499	hlist_for_each_entry(ent, &pg->src_list, node) {
 500		/* MDBA_MDB_SRCLIST_ENTRY nested attr +
 501		 * MDBA_MDB_SRCATTR_ADDRESS + MDBA_MDB_SRCATTR_TIMER
 502		 */
 503		nlmsg_size += nla_total_size(0) +
 504			      nla_total_size(addr_size) +
 505			      nla_total_size(sizeof(u32));
 506	}
 507out:
 508	return nlmsg_size;
 509}
 510
 511static size_t rtnl_mdb_nlmsg_size(const struct net_bridge_port_group *pg)
 512{
 513	return NLMSG_ALIGN(sizeof(struct br_port_msg)) +
 514	       /* MDBA_MDB */
 515	       nla_total_size(0) +
 516	       /* MDBA_MDB_ENTRY */
 517	       nla_total_size(0) +
 518	       /* Port group entry */
 519	       rtnl_mdb_nlmsg_pg_size(pg);
 520}
 521
 522static void __br_mdb_notify(struct net_device *dev,
 523			    struct net_bridge_mdb_entry *mp,
 524			    struct net_bridge_port_group *pg,
 525			    int type, bool notify_switchdev)
 526{
 527	struct net *net = dev_net(dev);
 528	struct sk_buff *skb;
 529	int err = -ENOBUFS;
 530
 531	if (notify_switchdev)
 532		br_switchdev_mdb_notify(dev, mp, pg, type);
 533
 534	skb = nlmsg_new(rtnl_mdb_nlmsg_size(pg), GFP_ATOMIC);
 535	if (!skb)
 536		goto errout;
 537
 538	err = nlmsg_populate_mdb_fill(skb, dev, mp, pg, type);
 539	if (err < 0) {
 540		kfree_skb(skb);
 541		goto errout;
 542	}
 543
 544	rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
 545	return;
 546errout:
 547	rtnl_set_sk_err(net, RTNLGRP_MDB, err);
 548}
 549
 550void br_mdb_notify(struct net_device *dev,
 551		   struct net_bridge_mdb_entry *mp,
 552		   struct net_bridge_port_group *pg,
 553		   int type)
 554{
 555	__br_mdb_notify(dev, mp, pg, type, true);
 556}
 557
 558void br_mdb_flag_change_notify(struct net_device *dev,
 559			       struct net_bridge_mdb_entry *mp,
 560			       struct net_bridge_port_group *pg)
 561{
 562	__br_mdb_notify(dev, mp, pg, RTM_NEWMDB, false);
 563}
 564
 565static int nlmsg_populate_rtr_fill(struct sk_buff *skb,
 566				   struct net_device *dev,
 567				   int ifindex, u16 vid, u32 pid,
 568				   u32 seq, int type, unsigned int flags)
 569{
 570	struct nlattr *nest, *port_nest;
 571	struct br_port_msg *bpm;
 572	struct nlmsghdr *nlh;
 573
 574	nlh = nlmsg_put(skb, pid, seq, type, sizeof(*bpm), 0);
 575	if (!nlh)
 576		return -EMSGSIZE;
 577
 578	bpm = nlmsg_data(nlh);
 579	memset(bpm, 0, sizeof(*bpm));
 580	bpm->family = AF_BRIDGE;
 581	bpm->ifindex = dev->ifindex;
 582	nest = nla_nest_start_noflag(skb, MDBA_ROUTER);
 583	if (!nest)
 584		goto cancel;
 585
 586	port_nest = nla_nest_start_noflag(skb, MDBA_ROUTER_PORT);
 587	if (!port_nest)
 588		goto end;
 589	if (nla_put_nohdr(skb, sizeof(u32), &ifindex)) {
 590		nla_nest_cancel(skb, port_nest);
 591		goto end;
 592	}
 593	if (vid && nla_put_u16(skb, MDBA_ROUTER_PATTR_VID, vid)) {
 594		nla_nest_cancel(skb, port_nest);
 595		goto end;
 596	}
 597	nla_nest_end(skb, port_nest);
 598
 599	nla_nest_end(skb, nest);
 600	nlmsg_end(skb, nlh);
 601	return 0;
 602
 603end:
 604	nla_nest_end(skb, nest);
 605cancel:
 606	nlmsg_cancel(skb, nlh);
 607	return -EMSGSIZE;
 608}
 609
 610static inline size_t rtnl_rtr_nlmsg_size(void)
 611{
 612	return NLMSG_ALIGN(sizeof(struct br_port_msg))
 613		+ nla_total_size(sizeof(__u32))
 614		+ nla_total_size(sizeof(u16));
 615}
 616
 617void br_rtr_notify(struct net_device *dev, struct net_bridge_mcast_port *pmctx,
 618		   int type)
 619{
 620	struct net *net = dev_net(dev);
 621	struct sk_buff *skb;
 622	int err = -ENOBUFS;
 623	int ifindex;
 624	u16 vid;
 625
 626	ifindex = pmctx ? pmctx->port->dev->ifindex : 0;
 627	vid = pmctx && br_multicast_port_ctx_is_vlan(pmctx) ? pmctx->vlan->vid :
 628							      0;
 629	skb = nlmsg_new(rtnl_rtr_nlmsg_size(), GFP_ATOMIC);
 630	if (!skb)
 631		goto errout;
 632
 633	err = nlmsg_populate_rtr_fill(skb, dev, ifindex, vid, 0, 0, type,
 634				      NTF_SELF);
 635	if (err < 0) {
 636		kfree_skb(skb);
 637		goto errout;
 638	}
 639
 640	rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_ATOMIC);
 641	return;
 642
 643errout:
 644	rtnl_set_sk_err(net, RTNLGRP_MDB, err);
 645}
 646
 647static const struct nla_policy
 648br_mdbe_src_list_entry_pol[MDBE_SRCATTR_MAX + 1] = {
 649	[MDBE_SRCATTR_ADDRESS] = NLA_POLICY_RANGE(NLA_BINARY,
 650						  sizeof(struct in_addr),
 651						  sizeof(struct in6_addr)),
 652};
 653
 654static const struct nla_policy
 655br_mdbe_src_list_pol[MDBE_SRC_LIST_MAX + 1] = {
 656	[MDBE_SRC_LIST_ENTRY] = NLA_POLICY_NESTED(br_mdbe_src_list_entry_pol),
 657};
 658
 659static const struct nla_policy br_mdbe_attrs_pol[MDBE_ATTR_MAX + 1] = {
 660	[MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
 661					      sizeof(struct in_addr),
 662					      sizeof(struct in6_addr)),
 663	[MDBE_ATTR_GROUP_MODE] = NLA_POLICY_RANGE(NLA_U8, MCAST_EXCLUDE,
 664						  MCAST_INCLUDE),
 665	[MDBE_ATTR_SRC_LIST] = NLA_POLICY_NESTED(br_mdbe_src_list_pol),
 666	[MDBE_ATTR_RTPROT] = NLA_POLICY_MIN(NLA_U8, RTPROT_STATIC),
 667};
 668
 669static bool is_valid_mdb_source(struct nlattr *attr, __be16 proto,
 670				struct netlink_ext_ack *extack)
 671{
 672	switch (proto) {
 673	case htons(ETH_P_IP):
 674		if (nla_len(attr) != sizeof(struct in_addr)) {
 675			NL_SET_ERR_MSG_MOD(extack, "IPv4 invalid source address length");
 676			return false;
 677		}
 678		if (ipv4_is_multicast(nla_get_in_addr(attr))) {
 679			NL_SET_ERR_MSG_MOD(extack, "IPv4 multicast source address is not allowed");
 680			return false;
 681		}
 682		break;
 683#if IS_ENABLED(CONFIG_IPV6)
 684	case htons(ETH_P_IPV6): {
 685		struct in6_addr src;
 686
 687		if (nla_len(attr) != sizeof(struct in6_addr)) {
 688			NL_SET_ERR_MSG_MOD(extack, "IPv6 invalid source address length");
 689			return false;
 690		}
 691		src = nla_get_in6_addr(attr);
 692		if (ipv6_addr_is_multicast(&src)) {
 693			NL_SET_ERR_MSG_MOD(extack, "IPv6 multicast source address is not allowed");
 694			return false;
 695		}
 696		break;
 697	}
 698#endif
 699	default:
 700		NL_SET_ERR_MSG_MOD(extack, "Invalid protocol used with source address");
 701		return false;
 702	}
 703
 704	return true;
 705}
 706
 707static struct net_bridge_mcast *
 708__br_mdb_choose_context(struct net_bridge *br,
 709			const struct br_mdb_entry *entry,
 710			struct netlink_ext_ack *extack)
 711{
 712	struct net_bridge_mcast *brmctx = NULL;
 713	struct net_bridge_vlan *v;
 714
 715	if (!br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED)) {
 716		brmctx = &br->multicast_ctx;
 717		goto out;
 718	}
 719
 720	if (!entry->vid) {
 721		NL_SET_ERR_MSG_MOD(extack, "Cannot add an entry without a vlan when vlan snooping is enabled");
 722		goto out;
 723	}
 724
 725	v = br_vlan_find(br_vlan_group(br), entry->vid);
 726	if (!v) {
 727		NL_SET_ERR_MSG_MOD(extack, "Vlan is not configured");
 728		goto out;
 729	}
 730	if (br_multicast_ctx_vlan_global_disabled(&v->br_mcast_ctx)) {
 731		NL_SET_ERR_MSG_MOD(extack, "Vlan's multicast processing is disabled");
 732		goto out;
 733	}
 734	brmctx = &v->br_mcast_ctx;
 735out:
 736	return brmctx;
 737}
 738
 739static int br_mdb_replace_group_sg(const struct br_mdb_config *cfg,
 740				   struct net_bridge_mdb_entry *mp,
 741				   struct net_bridge_port_group *pg,
 742				   struct net_bridge_mcast *brmctx,
 743				   unsigned char flags)
 744{
 745	unsigned long now = jiffies;
 746
 747	pg->flags = flags;
 748	pg->rt_protocol = cfg->rt_protocol;
 749	if (!(flags & MDB_PG_FLAGS_PERMANENT) && !cfg->src_entry)
 750		mod_timer(&pg->timer,
 751			  now + brmctx->multicast_membership_interval);
 752	else
 753		timer_delete(&pg->timer);
 754
 755	br_mdb_notify(cfg->br->dev, mp, pg, RTM_NEWMDB);
 756
 757	return 0;
 758}
 759
 760static int br_mdb_add_group_sg(const struct br_mdb_config *cfg,
 761			       struct net_bridge_mdb_entry *mp,
 762			       struct net_bridge_mcast *brmctx,
 763			       unsigned char flags,
 764			       struct netlink_ext_ack *extack)
 765{
 766	struct net_bridge_port_group __rcu **pp;
 767	struct net_bridge_port_group *p;
 768	unsigned long now = jiffies;
 769
 770	for (pp = &mp->ports;
 771	     (p = mlock_dereference(*pp, cfg->br)) != NULL;
 772	     pp = &p->next) {
 773		if (p->key.port == cfg->p) {
 774			if (!(cfg->nlflags & NLM_F_REPLACE)) {
 775				NL_SET_ERR_MSG_MOD(extack, "(S, G) group is already joined by port");
 776				return -EEXIST;
 777			}
 778			return br_mdb_replace_group_sg(cfg, mp, p, brmctx,
 779						       flags);
 780		}
 781		if ((unsigned long)p->key.port < (unsigned long)cfg->p)
 782			break;
 783	}
 784
 785	p = br_multicast_new_port_group(cfg->p, &cfg->group, *pp, flags, NULL,
 786					MCAST_INCLUDE, cfg->rt_protocol, extack);
 787	if (unlikely(!p))
 788		return -ENOMEM;
 789
 790	rcu_assign_pointer(*pp, p);
 791	if (!(flags & MDB_PG_FLAGS_PERMANENT) && !cfg->src_entry)
 792		mod_timer(&p->timer,
 793			  now + brmctx->multicast_membership_interval);
 794	br_mdb_notify(cfg->br->dev, mp, p, RTM_NEWMDB);
 795
 796	/* All of (*, G) EXCLUDE ports need to be added to the new (S, G) for
 797	 * proper replication.
 798	 */
 799	if (br_multicast_should_handle_mode(brmctx, cfg->group.proto)) {
 800		struct net_bridge_mdb_entry *star_mp;
 801		struct br_ip star_group;
 802
 803		star_group = p->key.addr;
 804		memset(&star_group.src, 0, sizeof(star_group.src));
 805		star_mp = br_mdb_ip_get(cfg->br, &star_group);
 806		if (star_mp)
 807			br_multicast_sg_add_exclude_ports(star_mp, p);
 808	}
 809
 810	return 0;
 811}
 812
 813static int br_mdb_add_group_src_fwd(const struct br_mdb_config *cfg,
 814				    struct br_ip *src_ip,
 815				    struct net_bridge_mcast *brmctx,
 816				    struct netlink_ext_ack *extack)
 817{
 818	struct net_bridge_mdb_entry *sgmp;
 819	struct br_mdb_config sg_cfg;
 820	struct br_ip sg_ip;
 821	u8 flags = 0;
 822
 823	sg_ip = cfg->group;
 824	sg_ip.src = src_ip->src;
 825	sgmp = br_multicast_new_group(cfg->br, &sg_ip);
 826	if (IS_ERR(sgmp)) {
 827		NL_SET_ERR_MSG_MOD(extack, "Failed to add (S, G) MDB entry");
 828		return PTR_ERR(sgmp);
 829	}
 830
 831	if (cfg->entry->state == MDB_PERMANENT)
 832		flags |= MDB_PG_FLAGS_PERMANENT;
 833	if (cfg->filter_mode == MCAST_EXCLUDE)
 834		flags |= MDB_PG_FLAGS_BLOCKED;
 835
 836	memset(&sg_cfg, 0, sizeof(sg_cfg));
 837	sg_cfg.br = cfg->br;
 838	sg_cfg.p = cfg->p;
 839	sg_cfg.entry = cfg->entry;
 840	sg_cfg.group = sg_ip;
 841	sg_cfg.src_entry = true;
 842	sg_cfg.filter_mode = MCAST_INCLUDE;
 843	sg_cfg.rt_protocol = cfg->rt_protocol;
 844	sg_cfg.nlflags = cfg->nlflags;
 845	return br_mdb_add_group_sg(&sg_cfg, sgmp, brmctx, flags, extack);
 846}
 847
 848static int br_mdb_add_group_src(const struct br_mdb_config *cfg,
 849				struct net_bridge_port_group *pg,
 850				struct net_bridge_mcast *brmctx,
 851				struct br_mdb_src_entry *src,
 852				struct netlink_ext_ack *extack)
 853{
 854	struct net_bridge_group_src *ent;
 855	unsigned long now = jiffies;
 856	int err;
 857
 858	ent = br_multicast_find_group_src(pg, &src->addr);
 859	if (!ent) {
 860		ent = br_multicast_new_group_src(pg, &src->addr);
 861		if (!ent) {
 862			NL_SET_ERR_MSG_MOD(extack, "Failed to add new source entry");
 863			return -ENOSPC;
 864		}
 865	} else if (!(cfg->nlflags & NLM_F_REPLACE)) {
 866		NL_SET_ERR_MSG_MOD(extack, "Source entry already exists");
 867		return -EEXIST;
 868	}
 869
 870	if (cfg->filter_mode == MCAST_INCLUDE &&
 871	    cfg->entry->state == MDB_TEMPORARY)
 872		mod_timer(&ent->timer, now + br_multicast_gmi(brmctx));
 873	else
 874		timer_delete(&ent->timer);
 875
 876	/* Install a (S, G) forwarding entry for the source. */
 877	err = br_mdb_add_group_src_fwd(cfg, &src->addr, brmctx, extack);
 878	if (err)
 879		goto err_del_sg;
 880
 881	ent->flags = BR_SGRP_F_INSTALLED | BR_SGRP_F_USER_ADDED;
 882
 883	return 0;
 884
 885err_del_sg:
 886	__br_multicast_del_group_src(ent);
 887	return err;
 888}
 889
 890static void br_mdb_del_group_src(struct net_bridge_port_group *pg,
 891				 struct br_mdb_src_entry *src)
 892{
 893	struct net_bridge_group_src *ent;
 894
 895	ent = br_multicast_find_group_src(pg, &src->addr);
 896	if (WARN_ON_ONCE(!ent))
 897		return;
 898	br_multicast_del_group_src(ent, false);
 899}
 900
 901static int br_mdb_add_group_srcs(const struct br_mdb_config *cfg,
 902				 struct net_bridge_port_group *pg,
 903				 struct net_bridge_mcast *brmctx,
 904				 struct netlink_ext_ack *extack)
 905{
 906	int i, err;
 907
 908	for (i = 0; i < cfg->num_src_entries; i++) {
 909		err = br_mdb_add_group_src(cfg, pg, brmctx,
 910					   &cfg->src_entries[i], extack);
 911		if (err)
 912			goto err_del_group_srcs;
 913	}
 914
 915	return 0;
 916
 917err_del_group_srcs:
 918	for (i--; i >= 0; i--)
 919		br_mdb_del_group_src(pg, &cfg->src_entries[i]);
 920	return err;
 921}
 922
 923static int br_mdb_replace_group_srcs(const struct br_mdb_config *cfg,
 924				     struct net_bridge_port_group *pg,
 925				     struct net_bridge_mcast *brmctx,
 926				     struct netlink_ext_ack *extack)
 927{
 928	struct net_bridge_group_src *ent;
 929	struct hlist_node *tmp;
 930	int err;
 931
 932	hlist_for_each_entry(ent, &pg->src_list, node)
 933		ent->flags |= BR_SGRP_F_DELETE;
 934
 935	err = br_mdb_add_group_srcs(cfg, pg, brmctx, extack);
 936	if (err)
 937		goto err_clear_delete;
 938
 939	hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node) {
 940		if (ent->flags & BR_SGRP_F_DELETE)
 941			br_multicast_del_group_src(ent, false);
 942	}
 943
 944	return 0;
 945
 946err_clear_delete:
 947	hlist_for_each_entry(ent, &pg->src_list, node)
 948		ent->flags &= ~BR_SGRP_F_DELETE;
 949	return err;
 950}
 951
 952static int br_mdb_replace_group_star_g(const struct br_mdb_config *cfg,
 953				       struct net_bridge_mdb_entry *mp,
 954				       struct net_bridge_port_group *pg,
 955				       struct net_bridge_mcast *brmctx,
 956				       unsigned char flags,
 957				       struct netlink_ext_ack *extack)
 958{
 959	unsigned long now = jiffies;
 960	int err;
 961
 962	err = br_mdb_replace_group_srcs(cfg, pg, brmctx, extack);
 963	if (err)
 964		return err;
 965
 966	pg->flags = flags;
 967	pg->filter_mode = cfg->filter_mode;
 968	pg->rt_protocol = cfg->rt_protocol;
 969	if (!(flags & MDB_PG_FLAGS_PERMANENT) &&
 970	    cfg->filter_mode == MCAST_EXCLUDE)
 971		mod_timer(&pg->timer,
 972			  now + brmctx->multicast_membership_interval);
 973	else
 974		timer_delete(&pg->timer);
 975
 976	br_mdb_notify(cfg->br->dev, mp, pg, RTM_NEWMDB);
 977
 978	if (br_multicast_should_handle_mode(brmctx, cfg->group.proto))
 979		br_multicast_star_g_handle_mode(pg, cfg->filter_mode);
 980
 981	return 0;
 982}
 983
 984static int br_mdb_add_group_star_g(const struct br_mdb_config *cfg,
 985				   struct net_bridge_mdb_entry *mp,
 986				   struct net_bridge_mcast *brmctx,
 987				   unsigned char flags,
 988				   struct netlink_ext_ack *extack)
 989{
 990	struct net_bridge_port_group __rcu **pp;
 991	struct net_bridge_port_group *p;
 992	unsigned long now = jiffies;
 993	int err;
 994
 995	for (pp = &mp->ports;
 996	     (p = mlock_dereference(*pp, cfg->br)) != NULL;
 997	     pp = &p->next) {
 998		if (p->key.port == cfg->p) {
 999			if (!(cfg->nlflags & NLM_F_REPLACE)) {
1000				NL_SET_ERR_MSG_MOD(extack, "(*, G) group is already joined by port");
1001				return -EEXIST;
1002			}
1003			return br_mdb_replace_group_star_g(cfg, mp, p, brmctx,
1004							   flags, extack);
1005		}
1006		if ((unsigned long)p->key.port < (unsigned long)cfg->p)
1007			break;
1008	}
1009
1010	p = br_multicast_new_port_group(cfg->p, &cfg->group, *pp, flags, NULL,
1011					cfg->filter_mode, cfg->rt_protocol,
1012					extack);
1013	if (unlikely(!p))
1014		return -ENOMEM;
1015
1016	err = br_mdb_add_group_srcs(cfg, p, brmctx, extack);
1017	if (err)
1018		goto err_del_port_group;
1019
1020	rcu_assign_pointer(*pp, p);
1021	if (!(flags & MDB_PG_FLAGS_PERMANENT) &&
1022	    cfg->filter_mode == MCAST_EXCLUDE)
1023		mod_timer(&p->timer,
1024			  now + brmctx->multicast_membership_interval);
1025	br_mdb_notify(cfg->br->dev, mp, p, RTM_NEWMDB);
1026	/* If we are adding a new EXCLUDE port group (*, G), it needs to be
1027	 * also added to all (S, G) entries for proper replication.
1028	 */
1029	if (br_multicast_should_handle_mode(brmctx, cfg->group.proto) &&
1030	    cfg->filter_mode == MCAST_EXCLUDE)
1031		br_multicast_star_g_handle_mode(p, MCAST_EXCLUDE);
1032
1033	return 0;
1034
1035err_del_port_group:
1036	br_multicast_del_port_group(p);
1037	return err;
1038}
1039
1040static int br_mdb_add_group(const struct br_mdb_config *cfg,
1041			    struct netlink_ext_ack *extack)
1042{
1043	struct br_mdb_entry *entry = cfg->entry;
1044	struct net_bridge_port *port = cfg->p;
1045	struct net_bridge_mdb_entry *mp;
1046	struct net_bridge *br = cfg->br;
1047	struct net_bridge_mcast *brmctx;
1048	struct br_ip group = cfg->group;
1049	unsigned char flags = 0;
1050
1051	brmctx = __br_mdb_choose_context(br, entry, extack);
1052	if (!brmctx)
1053		return -EINVAL;
1054
1055	mp = br_multicast_new_group(br, &group);
1056	if (IS_ERR(mp))
1057		return PTR_ERR(mp);
1058
1059	/* host join */
1060	if (!port) {
1061		if (mp->host_joined && !(cfg->nlflags & NLM_F_REPLACE)) {
1062			NL_SET_ERR_MSG_MOD(extack, "Group is already joined by host");
1063			return -EEXIST;
1064		}
1065
1066		br_multicast_host_join(brmctx, mp, false);
1067		br_mdb_notify(br->dev, mp, NULL, RTM_NEWMDB);
1068
1069		return 0;
1070	}
1071
1072	if (entry->state == MDB_PERMANENT)
1073		flags |= MDB_PG_FLAGS_PERMANENT;
1074
1075	if (br_multicast_is_star_g(&group))
1076		return br_mdb_add_group_star_g(cfg, mp, brmctx, flags, extack);
1077	else
1078		return br_mdb_add_group_sg(cfg, mp, brmctx, flags, extack);
1079}
1080
1081static int __br_mdb_add(const struct br_mdb_config *cfg,
1082			struct netlink_ext_ack *extack)
1083{
1084	int ret;
1085
1086	spin_lock_bh(&cfg->br->multicast_lock);
1087	ret = br_mdb_add_group(cfg, extack);
1088	spin_unlock_bh(&cfg->br->multicast_lock);
1089
1090	return ret;
1091}
1092
1093static int br_mdb_config_src_entry_init(struct nlattr *src_entry,
1094					struct br_mdb_src_entry *src,
1095					__be16 proto,
1096					struct netlink_ext_ack *extack)
1097{
1098	struct nlattr *tb[MDBE_SRCATTR_MAX + 1];
1099	int err;
1100
1101	err = nla_parse_nested(tb, MDBE_SRCATTR_MAX, src_entry,
1102			       br_mdbe_src_list_entry_pol, extack);
1103	if (err)
1104		return err;
1105
1106	if (NL_REQ_ATTR_CHECK(extack, src_entry, tb, MDBE_SRCATTR_ADDRESS))
1107		return -EINVAL;
1108
1109	if (!is_valid_mdb_source(tb[MDBE_SRCATTR_ADDRESS], proto, extack))
1110		return -EINVAL;
1111
1112	src->addr.proto = proto;
1113	nla_memcpy(&src->addr.src, tb[MDBE_SRCATTR_ADDRESS],
1114		   nla_len(tb[MDBE_SRCATTR_ADDRESS]));
1115
1116	return 0;
1117}
1118
1119static int br_mdb_config_src_list_init(struct nlattr *src_list,
1120				       struct br_mdb_config *cfg,
1121				       struct netlink_ext_ack *extack)
1122{
1123	struct nlattr *src_entry;
1124	int rem, err;
1125	int i = 0;
1126
1127	nla_for_each_nested(src_entry, src_list, rem)
1128		cfg->num_src_entries++;
1129
1130	if (cfg->num_src_entries >= PG_SRC_ENT_LIMIT) {
1131		NL_SET_ERR_MSG_FMT_MOD(extack, "Exceeded maximum number of source entries (%u)",
1132				       PG_SRC_ENT_LIMIT - 1);
1133		return -EINVAL;
1134	}
1135
1136	cfg->src_entries = kcalloc(cfg->num_src_entries,
1137				   sizeof(struct br_mdb_src_entry), GFP_KERNEL);
1138	if (!cfg->src_entries)
1139		return -ENOMEM;
1140
1141	nla_for_each_nested(src_entry, src_list, rem) {
1142		err = br_mdb_config_src_entry_init(src_entry,
1143						   &cfg->src_entries[i],
1144						   cfg->entry->addr.proto,
1145						   extack);
1146		if (err)
1147			goto err_src_entry_init;
1148		i++;
1149	}
1150
1151	return 0;
1152
1153err_src_entry_init:
1154	kfree(cfg->src_entries);
1155	return err;
1156}
1157
1158static void br_mdb_config_src_list_fini(struct br_mdb_config *cfg)
1159{
1160	kfree(cfg->src_entries);
1161}
1162
1163static int br_mdb_config_attrs_init(struct nlattr *set_attrs,
1164				    struct br_mdb_config *cfg,
1165				    struct netlink_ext_ack *extack)
1166{
1167	struct nlattr *mdb_attrs[MDBE_ATTR_MAX + 1];
1168	int err;
1169
1170	err = nla_parse_nested(mdb_attrs, MDBE_ATTR_MAX, set_attrs,
1171			       br_mdbe_attrs_pol, extack);
1172	if (err)
1173		return err;
1174
1175	if (mdb_attrs[MDBE_ATTR_SOURCE] &&
1176	    !is_valid_mdb_source(mdb_attrs[MDBE_ATTR_SOURCE],
1177				 cfg->entry->addr.proto, extack))
1178		return -EINVAL;
1179
1180	__mdb_entry_to_br_ip(cfg->entry, &cfg->group, mdb_attrs);
1181
1182	if (mdb_attrs[MDBE_ATTR_GROUP_MODE]) {
1183		if (!cfg->p) {
1184			NL_SET_ERR_MSG_MOD(extack, "Filter mode cannot be set for host groups");
1185			return -EINVAL;
1186		}
1187		if (!br_multicast_is_star_g(&cfg->group)) {
1188			NL_SET_ERR_MSG_MOD(extack, "Filter mode can only be set for (*, G) entries");
1189			return -EINVAL;
1190		}
1191		cfg->filter_mode = nla_get_u8(mdb_attrs[MDBE_ATTR_GROUP_MODE]);
1192	} else {
1193		cfg->filter_mode = MCAST_EXCLUDE;
1194	}
1195
1196	if (mdb_attrs[MDBE_ATTR_SRC_LIST]) {
1197		if (!cfg->p) {
1198			NL_SET_ERR_MSG_MOD(extack, "Source list cannot be set for host groups");
1199			return -EINVAL;
1200		}
1201		if (!br_multicast_is_star_g(&cfg->group)) {
1202			NL_SET_ERR_MSG_MOD(extack, "Source list can only be set for (*, G) entries");
1203			return -EINVAL;
1204		}
1205		if (!mdb_attrs[MDBE_ATTR_GROUP_MODE]) {
1206			NL_SET_ERR_MSG_MOD(extack, "Source list cannot be set without filter mode");
1207			return -EINVAL;
1208		}
1209		err = br_mdb_config_src_list_init(mdb_attrs[MDBE_ATTR_SRC_LIST],
1210						  cfg, extack);
1211		if (err)
1212			return err;
1213	}
1214
1215	if (!cfg->num_src_entries && cfg->filter_mode == MCAST_INCLUDE) {
1216		NL_SET_ERR_MSG_MOD(extack, "Cannot add (*, G) INCLUDE with an empty source list");
1217		return -EINVAL;
1218	}
1219
1220	if (mdb_attrs[MDBE_ATTR_RTPROT]) {
1221		if (!cfg->p) {
1222			NL_SET_ERR_MSG_MOD(extack, "Protocol cannot be set for host groups");
1223			return -EINVAL;
1224		}
1225		cfg->rt_protocol = nla_get_u8(mdb_attrs[MDBE_ATTR_RTPROT]);
1226	}
1227
1228	return 0;
1229}
1230
1231static int br_mdb_config_init(struct br_mdb_config *cfg, struct net_device *dev,
1232			      struct nlattr *tb[], u16 nlmsg_flags,
1233			      struct netlink_ext_ack *extack)
1234{
1235	struct net *net = dev_net(dev);
1236
1237	memset(cfg, 0, sizeof(*cfg));
1238	cfg->filter_mode = MCAST_EXCLUDE;
1239	cfg->rt_protocol = RTPROT_STATIC;
1240	cfg->nlflags = nlmsg_flags;
1241
1242	cfg->br = netdev_priv(dev);
1243
1244	if (!netif_running(cfg->br->dev)) {
1245		NL_SET_ERR_MSG_MOD(extack, "Bridge device is not running");
1246		return -EINVAL;
1247	}
1248
1249	if (!br_opt_get(cfg->br, BROPT_MULTICAST_ENABLED)) {
1250		NL_SET_ERR_MSG_MOD(extack, "Bridge's multicast processing is disabled");
1251		return -EINVAL;
1252	}
1253
1254	cfg->entry = nla_data(tb[MDBA_SET_ENTRY]);
1255
1256	if (cfg->entry->ifindex != cfg->br->dev->ifindex) {
1257		struct net_device *pdev;
1258
1259		pdev = __dev_get_by_index(net, cfg->entry->ifindex);
1260		if (!pdev) {
1261			NL_SET_ERR_MSG_MOD(extack, "Port net device doesn't exist");
1262			return -ENODEV;
1263		}
1264
1265		cfg->p = br_port_get_rtnl(pdev);
1266		if (!cfg->p) {
1267			NL_SET_ERR_MSG_MOD(extack, "Net device is not a bridge port");
1268			return -EINVAL;
1269		}
1270
1271		if (cfg->p->br != cfg->br) {
1272			NL_SET_ERR_MSG_MOD(extack, "Port belongs to a different bridge device");
1273			return -EINVAL;
1274		}
1275	}
1276
1277	if (cfg->entry->addr.proto == htons(ETH_P_IP) &&
1278	    ipv4_is_zeronet(cfg->entry->addr.u.ip4)) {
1279		NL_SET_ERR_MSG_MOD(extack, "IPv4 entry group address 0.0.0.0 is not allowed");
1280		return -EINVAL;
1281	}
1282
1283	if (tb[MDBA_SET_ENTRY_ATTRS])
1284		return br_mdb_config_attrs_init(tb[MDBA_SET_ENTRY_ATTRS], cfg,
1285						extack);
1286	else
1287		__mdb_entry_to_br_ip(cfg->entry, &cfg->group, NULL);
1288
1289	return 0;
1290}
1291
1292static void br_mdb_config_fini(struct br_mdb_config *cfg)
1293{
1294	br_mdb_config_src_list_fini(cfg);
1295}
1296
1297int br_mdb_add(struct net_device *dev, struct nlattr *tb[], u16 nlmsg_flags,
1298	       struct netlink_ext_ack *extack)
1299{
1300	struct net_bridge_vlan_group *vg;
1301	struct net_bridge_vlan *v;
1302	struct br_mdb_config cfg;
1303	int err;
1304
1305	err = br_mdb_config_init(&cfg, dev, tb, nlmsg_flags, extack);
1306	if (err)
1307		return err;
1308
1309	err = -EINVAL;
1310	/* host join errors which can happen before creating the group */
1311	if (!cfg.p && !br_group_is_l2(&cfg.group)) {
1312		/* don't allow any flags for host-joined IP groups */
1313		if (cfg.entry->state) {
1314			NL_SET_ERR_MSG_MOD(extack, "Flags are not allowed for host groups");
1315			goto out;
1316		}
1317		if (!br_multicast_is_star_g(&cfg.group)) {
1318			NL_SET_ERR_MSG_MOD(extack, "Groups with sources cannot be manually host joined");
1319			goto out;
1320		}
1321	}
1322
1323	if (br_group_is_l2(&cfg.group) && cfg.entry->state != MDB_PERMANENT) {
1324		NL_SET_ERR_MSG_MOD(extack, "Only permanent L2 entries allowed");
1325		goto out;
1326	}
1327
1328	if (cfg.p) {
1329		if (cfg.p->state == BR_STATE_DISABLED && cfg.entry->state != MDB_PERMANENT) {
1330			NL_SET_ERR_MSG_MOD(extack, "Port is in disabled state and entry is not permanent");
1331			goto out;
1332		}
1333		vg = nbp_vlan_group(cfg.p);
1334	} else {
1335		vg = br_vlan_group(cfg.br);
1336	}
1337
1338	/* If vlan filtering is enabled and VLAN is not specified
1339	 * install mdb entry on all vlans configured on the port.
1340	 */
1341	if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) {
1342		list_for_each_entry(v, &vg->vlan_list, vlist) {
1343			cfg.entry->vid = v->vid;
1344			cfg.group.vid = v->vid;
1345			err = __br_mdb_add(&cfg, extack);
1346			if (err)
1347				break;
1348		}
1349	} else {
1350		err = __br_mdb_add(&cfg, extack);
1351	}
1352
1353out:
1354	br_mdb_config_fini(&cfg);
1355	return err;
1356}
1357
1358static int __br_mdb_del(const struct br_mdb_config *cfg)
1359{
1360	struct br_mdb_entry *entry = cfg->entry;
1361	struct net_bridge *br = cfg->br;
1362	struct net_bridge_mdb_entry *mp;
1363	struct net_bridge_port_group *p;
1364	struct net_bridge_port_group __rcu **pp;
1365	struct br_ip ip = cfg->group;
1366	int err = -EINVAL;
1367
1368	spin_lock_bh(&br->multicast_lock);
1369	mp = br_mdb_ip_get(br, &ip);
1370	if (!mp)
1371		goto unlock;
1372
1373	/* host leave */
1374	if (entry->ifindex == mp->br->dev->ifindex && mp->host_joined) {
1375		br_multicast_host_leave(mp, false);
1376		err = 0;
1377		br_mdb_notify(br->dev, mp, NULL, RTM_DELMDB);
1378		if (!mp->ports && netif_running(br->dev))
1379			mod_timer(&mp->timer, jiffies);
1380		goto unlock;
1381	}
1382
1383	for (pp = &mp->ports;
1384	     (p = mlock_dereference(*pp, br)) != NULL;
1385	     pp = &p->next) {
1386		if (!p->key.port || p->key.port->dev->ifindex != entry->ifindex)
1387			continue;
1388
1389		br_multicast_del_pg(mp, p, pp);
1390		err = 0;
1391		break;
1392	}
1393
1394unlock:
1395	spin_unlock_bh(&br->multicast_lock);
1396	return err;
1397}
1398
1399int br_mdb_del(struct net_device *dev, struct nlattr *tb[],
1400	       struct netlink_ext_ack *extack)
1401{
1402	struct net_bridge_vlan_group *vg;
1403	struct net_bridge_vlan *v;
1404	struct br_mdb_config cfg;
1405	int err;
1406
1407	err = br_mdb_config_init(&cfg, dev, tb, 0, extack);
1408	if (err)
1409		return err;
1410
1411	if (cfg.p)
1412		vg = nbp_vlan_group(cfg.p);
1413	else
1414		vg = br_vlan_group(cfg.br);
1415
1416	/* If vlan filtering is enabled and VLAN is not specified
1417	 * delete mdb entry on all vlans configured on the port.
1418	 */
1419	if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) {
1420		list_for_each_entry(v, &vg->vlan_list, vlist) {
1421			cfg.entry->vid = v->vid;
1422			cfg.group.vid = v->vid;
1423			err = __br_mdb_del(&cfg);
1424		}
1425	} else {
1426		err = __br_mdb_del(&cfg);
1427	}
1428
1429	br_mdb_config_fini(&cfg);
1430	return err;
1431}
1432
1433struct br_mdb_flush_desc {
1434	u32 port_ifindex;
1435	u16 vid;
1436	u8 rt_protocol;
1437	u8 state;
1438	u8 state_mask;
1439};
1440
1441static const struct nla_policy br_mdbe_attrs_del_bulk_pol[MDBE_ATTR_MAX + 1] = {
1442	[MDBE_ATTR_RTPROT] = NLA_POLICY_MIN(NLA_U8, RTPROT_STATIC),
1443	[MDBE_ATTR_STATE_MASK] = NLA_POLICY_MASK(NLA_U8, MDB_PERMANENT),
1444};
1445
1446static int br_mdb_flush_desc_init(struct br_mdb_flush_desc *desc,
1447				  struct nlattr *tb[],
1448				  struct netlink_ext_ack *extack)
1449{
1450	struct br_mdb_entry *entry = nla_data(tb[MDBA_SET_ENTRY]);
1451	struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
1452	int err;
1453
1454	desc->port_ifindex = entry->ifindex;
1455	desc->vid = entry->vid;
1456	desc->state = entry->state;
1457
1458	if (!tb[MDBA_SET_ENTRY_ATTRS])
1459		return 0;
1460
1461	err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX,
1462			       tb[MDBA_SET_ENTRY_ATTRS],
1463			       br_mdbe_attrs_del_bulk_pol, extack);
1464	if (err)
1465		return err;
1466
1467	if (mdbe_attrs[MDBE_ATTR_STATE_MASK])
1468		desc->state_mask = nla_get_u8(mdbe_attrs[MDBE_ATTR_STATE_MASK]);
1469
1470	if (mdbe_attrs[MDBE_ATTR_RTPROT])
1471		desc->rt_protocol = nla_get_u8(mdbe_attrs[MDBE_ATTR_RTPROT]);
1472
1473	return 0;
1474}
1475
1476static void br_mdb_flush_host(struct net_bridge *br,
1477			      struct net_bridge_mdb_entry *mp,
1478			      const struct br_mdb_flush_desc *desc)
1479{
1480	u8 state;
1481
1482	if (desc->port_ifindex && desc->port_ifindex != br->dev->ifindex)
1483		return;
1484
1485	if (desc->rt_protocol)
1486		return;
1487
1488	state = br_group_is_l2(&mp->addr) ? MDB_PERMANENT : 0;
1489	if (desc->state_mask && (state & desc->state_mask) != desc->state)
1490		return;
1491
1492	br_multicast_host_leave(mp, true);
1493	if (!mp->ports && netif_running(br->dev))
1494		mod_timer(&mp->timer, jiffies);
1495}
1496
1497static void br_mdb_flush_pgs(struct net_bridge *br,
1498			     struct net_bridge_mdb_entry *mp,
1499			     const struct br_mdb_flush_desc *desc)
1500{
1501	struct net_bridge_port_group __rcu **pp;
1502	struct net_bridge_port_group *p;
1503
1504	for (pp = &mp->ports; (p = mlock_dereference(*pp, br)) != NULL;) {
1505		u8 state;
1506
1507		if (desc->port_ifindex &&
1508		    desc->port_ifindex != p->key.port->dev->ifindex) {
1509			pp = &p->next;
1510			continue;
1511		}
1512
1513		if (desc->rt_protocol && desc->rt_protocol != p->rt_protocol) {
1514			pp = &p->next;
1515			continue;
1516		}
1517
1518		state = p->flags & MDB_PG_FLAGS_PERMANENT ? MDB_PERMANENT : 0;
1519		if (desc->state_mask &&
1520		    (state & desc->state_mask) != desc->state) {
1521			pp = &p->next;
1522			continue;
1523		}
1524
1525		br_multicast_del_pg(mp, p, pp);
1526	}
1527}
1528
1529static void br_mdb_flush(struct net_bridge *br,
1530			 const struct br_mdb_flush_desc *desc)
1531{
1532	struct net_bridge_mdb_entry *mp;
1533
1534	spin_lock_bh(&br->multicast_lock);
1535
1536	/* Safe variant is not needed because entries are removed from the list
1537	 * upon group timer expiration or bridge deletion.
1538	 */
1539	hlist_for_each_entry(mp, &br->mdb_list, mdb_node) {
1540		if (desc->vid && desc->vid != mp->addr.vid)
1541			continue;
1542
1543		br_mdb_flush_host(br, mp, desc);
1544		br_mdb_flush_pgs(br, mp, desc);
1545	}
1546
1547	spin_unlock_bh(&br->multicast_lock);
1548}
1549
1550int br_mdb_del_bulk(struct net_device *dev, struct nlattr *tb[],
1551		    struct netlink_ext_ack *extack)
1552{
1553	struct net_bridge *br = netdev_priv(dev);
1554	struct br_mdb_flush_desc desc = {};
1555	int err;
1556
1557	err = br_mdb_flush_desc_init(&desc, tb, extack);
1558	if (err)
1559		return err;
1560
1561	br_mdb_flush(br, &desc);
1562
1563	return 0;
1564}
1565
1566static const struct nla_policy br_mdbe_attrs_get_pol[MDBE_ATTR_MAX + 1] = {
1567	[MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
1568					      sizeof(struct in_addr),
1569					      sizeof(struct in6_addr)),
1570};
1571
1572static int br_mdb_get_parse(struct net_device *dev, struct nlattr *tb[],
1573			    struct br_ip *group, struct netlink_ext_ack *extack)
1574{
1575	struct br_mdb_entry *entry = nla_data(tb[MDBA_GET_ENTRY]);
1576	struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
1577	int err;
1578
1579	if (!tb[MDBA_GET_ENTRY_ATTRS]) {
1580		__mdb_entry_to_br_ip(entry, group, NULL);
1581		return 0;
1582	}
1583
1584	err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX,
1585			       tb[MDBA_GET_ENTRY_ATTRS], br_mdbe_attrs_get_pol,
1586			       extack);
1587	if (err)
1588		return err;
1589
1590	if (mdbe_attrs[MDBE_ATTR_SOURCE] &&
1591	    !is_valid_mdb_source(mdbe_attrs[MDBE_ATTR_SOURCE],
1592				 entry->addr.proto, extack))
1593		return -EINVAL;
1594
1595	__mdb_entry_to_br_ip(entry, group, mdbe_attrs);
1596
1597	return 0;
1598}
1599
1600static struct sk_buff *
1601br_mdb_get_reply_alloc(const struct net_bridge_mdb_entry *mp)
1602{
1603	struct net_bridge_port_group *pg;
1604	size_t nlmsg_size;
1605
1606	nlmsg_size = NLMSG_ALIGN(sizeof(struct br_port_msg)) +
1607		     /* MDBA_MDB */
1608		     nla_total_size(0) +
1609		     /* MDBA_MDB_ENTRY */
1610		     nla_total_size(0);
1611
1612	if (mp->host_joined)
1613		nlmsg_size += rtnl_mdb_nlmsg_pg_size(NULL);
1614
1615	for (pg = mlock_dereference(mp->ports, mp->br); pg;
1616	     pg = mlock_dereference(pg->next, mp->br))
1617		nlmsg_size += rtnl_mdb_nlmsg_pg_size(pg);
1618
1619	return nlmsg_new(nlmsg_size, GFP_ATOMIC);
1620}
1621
1622static int br_mdb_get_reply_fill(struct sk_buff *skb,
1623				 struct net_bridge_mdb_entry *mp, u32 portid,
1624				 u32 seq)
1625{
1626	struct nlattr *mdb_nest, *mdb_entry_nest;
1627	struct net_bridge_port_group *pg;
1628	struct br_port_msg *bpm;
1629	struct nlmsghdr *nlh;
1630	int err;
1631
1632	nlh = nlmsg_put(skb, portid, seq, RTM_NEWMDB, sizeof(*bpm), 0);
1633	if (!nlh)
1634		return -EMSGSIZE;
1635
1636	bpm = nlmsg_data(nlh);
1637	memset(bpm, 0, sizeof(*bpm));
1638	bpm->family  = AF_BRIDGE;
1639	bpm->ifindex = mp->br->dev->ifindex;
1640	mdb_nest = nla_nest_start_noflag(skb, MDBA_MDB);
1641	if (!mdb_nest) {
1642		err = -EMSGSIZE;
1643		goto cancel;
1644	}
1645	mdb_entry_nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
1646	if (!mdb_entry_nest) {
1647		err = -EMSGSIZE;
1648		goto cancel;
1649	}
1650
1651	if (mp->host_joined) {
1652		err = __mdb_fill_info(skb, mp, NULL);
1653		if (err)
1654			goto cancel;
1655	}
1656
1657	for (pg = mlock_dereference(mp->ports, mp->br); pg;
1658	     pg = mlock_dereference(pg->next, mp->br)) {
1659		err = __mdb_fill_info(skb, mp, pg);
1660		if (err)
1661			goto cancel;
1662	}
1663
1664	nla_nest_end(skb, mdb_entry_nest);
1665	nla_nest_end(skb, mdb_nest);
1666	nlmsg_end(skb, nlh);
1667
1668	return 0;
1669
1670cancel:
1671	nlmsg_cancel(skb, nlh);
1672	return err;
1673}
1674
1675int br_mdb_get(struct net_device *dev, struct nlattr *tb[], u32 portid, u32 seq,
1676	       struct netlink_ext_ack *extack)
1677{
1678	struct net_bridge *br = netdev_priv(dev);
1679	struct net_bridge_mdb_entry *mp;
1680	struct sk_buff *skb;
1681	struct br_ip group;
1682	int err;
1683
1684	err = br_mdb_get_parse(dev, tb, &group, extack);
1685	if (err)
1686		return err;
1687
1688	/* Hold the multicast lock to ensure that the MDB entry does not change
1689	 * between the time the reply size is determined and when the reply is
1690	 * filled in.
1691	 */
1692	spin_lock_bh(&br->multicast_lock);
1693
1694	mp = br_mdb_ip_get(br, &group);
1695	if (!mp || (!mp->ports && !mp->host_joined)) {
1696		NL_SET_ERR_MSG_MOD(extack, "MDB entry not found");
1697		err = -ENOENT;
1698		goto unlock;
1699	}
1700
1701	skb = br_mdb_get_reply_alloc(mp);
1702	if (!skb) {
1703		err = -ENOMEM;
1704		goto unlock;
1705	}
1706
1707	err = br_mdb_get_reply_fill(skb, mp, portid, seq);
1708	if (err) {
1709		NL_SET_ERR_MSG_MOD(extack, "Failed to fill MDB get reply");
1710		goto free;
1711	}
1712
1713	spin_unlock_bh(&br->multicast_lock);
1714
1715	return rtnl_unicast(skb, dev_net(dev), portid);
1716
1717free:
1718	kfree_skb(skb);
1719unlock:
1720	spin_unlock_bh(&br->multicast_lock);
1721	return err;
1722}
~/ Read-only file preview.