br_netlink.c 25.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 *	Bridge netlink control interface
 *
 *	Authors:
 *	Stephen Hemminger		<shemminger@osdl.org>
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License
 *	as published by the Free Software Foundation; either version
 *	2 of the License, or (at your option) any later version.
 */

#include <linux/kernel.h>
14
#include <linux/slab.h>
15
#include <linux/etherdevice.h>
16
#include <net/rtnetlink.h>
17
#include <net/net_namespace.h>
18
#include <net/sock.h>
19
#include <uapi/linux/if_bridge.h>
20

21
#include "br_private.h"
22
#include "br_private_stp.h"
23

24
static int __get_num_vlan_infos(struct net_bridge_vlan_group *vg,
25
				u32 filter_mask)
26
{
27 28
	struct net_bridge_vlan *v;
	u16 vid_range_start = 0, vid_range_end = 0, vid_range_flags = 0;
29
	u16 flags, pvid;
30 31 32 33 34
	int num_vlans = 0;

	if (!(filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED))
		return 0;

35
	pvid = br_get_pvid(vg);
36
	/* Count number of vlan infos */
37
	list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
38
		flags = 0;
39 40 41 42
		/* only a context, bridge vlan not activated */
		if (!br_vlan_should_use(v))
			continue;
		if (v->vid == pvid)
43 44
			flags |= BRIDGE_VLAN_INFO_PVID;

45
		if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED)
46 47 48 49
			flags |= BRIDGE_VLAN_INFO_UNTAGGED;

		if (vid_range_start == 0) {
			goto initvars;
50
		} else if ((v->vid - vid_range_end) == 1 &&
51
			flags == vid_range_flags) {
52
			vid_range_end = v->vid;
53 54 55 56 57 58 59 60
			continue;
		} else {
			if ((vid_range_end - vid_range_start) > 0)
				num_vlans += 2;
			else
				num_vlans += 1;
		}
initvars:
61 62
		vid_range_start = v->vid;
		vid_range_end = v->vid;
63 64 65 66 67 68 69 70 71 72 73 74 75
		vid_range_flags = flags;
	}

	if (vid_range_start != 0) {
		if ((vid_range_end - vid_range_start) > 0)
			num_vlans += 2;
		else
			num_vlans += 1;
	}

	return num_vlans;
}

76
static int br_get_num_vlan_infos(struct net_bridge_vlan_group *vg,
77
				 u32 filter_mask)
78
{
79 80
	int num_vlans;

81 82 83 84 85 86
	if (!vg)
		return 0;

	if (filter_mask & RTEXT_FILTER_BRVLAN)
		return vg->num_vlans;

87 88 89 90 91
	rcu_read_lock();
	num_vlans = __get_num_vlan_infos(vg, filter_mask);
	rcu_read_unlock();

	return num_vlans;
92 93
}

94 95
static size_t br_get_link_af_size_filtered(const struct net_device *dev,
					   u32 filter_mask)
96
{
97 98 99
	struct net_bridge_vlan_group *vg = NULL;
	struct net_bridge_port *p;
	struct net_bridge *br;
100
	int num_vlan_infos;
101

102
	rcu_read_lock();
103 104 105 106 107 108 109
	if (br_port_exists(dev)) {
		p = br_port_get_rcu(dev);
		vg = nbp_vlan_group(p);
	} else if (dev->priv_flags & IFF_EBRIDGE) {
		br = netdev_priv(dev);
		vg = br_vlan_group(br);
	}
110
	num_vlan_infos = br_get_num_vlan_infos(vg, filter_mask);
111
	rcu_read_unlock();
112 113

	/* Each VLAN is returned in bridge_vlan_info along with flags */
114
	return num_vlan_infos * nla_total_size(sizeof(struct bridge_vlan_info));
115 116
}

117 118 119 120 121 122
static inline size_t br_port_info_size(void)
{
	return nla_total_size(1)	/* IFLA_BRPORT_STATE  */
		+ nla_total_size(2)	/* IFLA_BRPORT_PRIORITY */
		+ nla_total_size(4)	/* IFLA_BRPORT_COST */
		+ nla_total_size(1)	/* IFLA_BRPORT_MODE */
123
		+ nla_total_size(1)	/* IFLA_BRPORT_GUARD */
S
stephen hemminger 已提交
124
		+ nla_total_size(1)	/* IFLA_BRPORT_PROTECT */
125
		+ nla_total_size(1)	/* IFLA_BRPORT_FAST_LEAVE */
126
		+ nla_total_size(1)	/* IFLA_BRPORT_LEARNING */
127
		+ nla_total_size(1)	/* IFLA_BRPORT_UNICAST_FLOOD */
128
		+ nla_total_size(1)	/* IFLA_BRPORT_PROXYARP */
129
		+ nla_total_size(1)	/* IFLA_BRPORT_PROXYARP_WIFI */
130 131 132
		+ 0;
}

133
static inline size_t br_nlmsg_size(struct net_device *dev, u32 filter_mask)
134 135
{
	return NLMSG_ALIGN(sizeof(struct ifinfomsg))
136 137 138 139 140 141
		+ nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
		+ nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
		+ nla_total_size(4) /* IFLA_MASTER */
		+ nla_total_size(4) /* IFLA_MTU */
		+ nla_total_size(4) /* IFLA_LINK */
		+ nla_total_size(1) /* IFLA_OPERSTATE */
142
		+ nla_total_size(br_port_info_size()) /* IFLA_PROTINFO */
143 144
		+ nla_total_size(br_get_link_af_size_filtered(dev,
				 filter_mask)); /* IFLA_AF_SPEC */
145 146 147 148 149 150 151 152 153 154
}

static int br_port_fill_attrs(struct sk_buff *skb,
			      const struct net_bridge_port *p)
{
	u8 mode = !!(p->flags & BR_HAIRPIN_MODE);

	if (nla_put_u8(skb, IFLA_BRPORT_STATE, p->state) ||
	    nla_put_u16(skb, IFLA_BRPORT_PRIORITY, p->priority) ||
	    nla_put_u32(skb, IFLA_BRPORT_COST, p->path_cost) ||
155
	    nla_put_u8(skb, IFLA_BRPORT_MODE, mode) ||
S
stephen hemminger 已提交
156
	    nla_put_u8(skb, IFLA_BRPORT_GUARD, !!(p->flags & BR_BPDU_GUARD)) ||
157
	    nla_put_u8(skb, IFLA_BRPORT_PROTECT, !!(p->flags & BR_ROOT_BLOCK)) ||
158
	    nla_put_u8(skb, IFLA_BRPORT_FAST_LEAVE, !!(p->flags & BR_MULTICAST_FAST_LEAVE)) ||
159
	    nla_put_u8(skb, IFLA_BRPORT_LEARNING, !!(p->flags & BR_LEARNING)) ||
160
	    nla_put_u8(skb, IFLA_BRPORT_UNICAST_FLOOD, !!(p->flags & BR_FLOOD)) ||
161 162 163
	    nla_put_u8(skb, IFLA_BRPORT_PROXYARP, !!(p->flags & BR_PROXYARP)) ||
	    nla_put_u8(skb, IFLA_BRPORT_PROXYARP_WIFI,
		       !!(p->flags & BR_PROXYARP_WIFI)))
164 165 166
		return -EMSGSIZE;

	return 0;
167 168
}

169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
static int br_fill_ifvlaninfo_range(struct sk_buff *skb, u16 vid_start,
				    u16 vid_end, u16 flags)
{
	struct  bridge_vlan_info vinfo;

	if ((vid_end - vid_start) > 0) {
		/* add range to skb */
		vinfo.vid = vid_start;
		vinfo.flags = flags | BRIDGE_VLAN_INFO_RANGE_BEGIN;
		if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
			    sizeof(vinfo), &vinfo))
			goto nla_put_failure;

		vinfo.vid = vid_end;
		vinfo.flags = flags | BRIDGE_VLAN_INFO_RANGE_END;
		if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
			    sizeof(vinfo), &vinfo))
			goto nla_put_failure;
	} else {
		vinfo.vid = vid_start;
		vinfo.flags = flags;
		if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
			    sizeof(vinfo), &vinfo))
			goto nla_put_failure;
	}

	return 0;

nla_put_failure:
	return -EMSGSIZE;
}

static int br_fill_ifvlaninfo_compressed(struct sk_buff *skb,
202
					 struct net_bridge_vlan_group *vg)
203
{
204 205
	struct net_bridge_vlan *v;
	u16 vid_range_start = 0, vid_range_end = 0, vid_range_flags = 0;
206
	u16 flags, pvid;
207 208 209 210 211 212
	int err = 0;

	/* Pack IFLA_BRIDGE_VLAN_INFO's for every vlan
	 * and mark vlan info with begin and end flags
	 * if vlaninfo represents a range
	 */
213
	pvid = br_get_pvid(vg);
214
	list_for_each_entry(v, &vg->vlan_list, vlist) {
215
		flags = 0;
216 217 218
		if (!br_vlan_should_use(v))
			continue;
		if (v->vid == pvid)
219 220
			flags |= BRIDGE_VLAN_INFO_PVID;

221
		if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED)
222 223 224 225
			flags |= BRIDGE_VLAN_INFO_UNTAGGED;

		if (vid_range_start == 0) {
			goto initvars;
226
		} else if ((v->vid - vid_range_end) == 1 &&
227
			flags == vid_range_flags) {
228
			vid_range_end = v->vid;
229 230 231 232 233 234 235 236 237 238
			continue;
		} else {
			err = br_fill_ifvlaninfo_range(skb, vid_range_start,
						       vid_range_end,
						       vid_range_flags);
			if (err)
				return err;
		}

initvars:
239 240
		vid_range_start = v->vid;
		vid_range_end = v->vid;
241 242 243
		vid_range_flags = flags;
	}

244 245 246 247 248 249 250 251
	if (vid_range_start != 0) {
		/* Call it once more to send any left over vlans */
		err = br_fill_ifvlaninfo_range(skb, vid_range_start,
					       vid_range_end,
					       vid_range_flags);
		if (err)
			return err;
	}
252 253 254 255 256

	return 0;
}

static int br_fill_ifvlaninfo(struct sk_buff *skb,
257
			      struct net_bridge_vlan_group *vg)
258 259
{
	struct bridge_vlan_info vinfo;
260
	struct net_bridge_vlan *v;
261
	u16 pvid;
262

263
	pvid = br_get_pvid(vg);
264 265 266 267 268
	list_for_each_entry(v, &vg->vlan_list, vlist) {
		if (!br_vlan_should_use(v))
			continue;

		vinfo.vid = v->vid;
269
		vinfo.flags = 0;
270
		if (v->vid == pvid)
271 272
			vinfo.flags |= BRIDGE_VLAN_INFO_PVID;

273
		if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED)
274 275 276 277 278 279 280 281 282 283 284 285 286
			vinfo.flags |= BRIDGE_VLAN_INFO_UNTAGGED;

		if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
			    sizeof(vinfo), &vinfo))
			goto nla_put_failure;
	}

	return 0;

nla_put_failure:
	return -EMSGSIZE;
}

287 288 289 290
/*
 * Create one netlink message for one interface
 * Contains port and master info as well as carrier and bridge state.
 */
291
static int br_fill_ifinfo(struct sk_buff *skb,
292
			  struct net_bridge_port *port,
293 294
			  u32 pid, u32 seq, int event, unsigned int flags,
			  u32 filter_mask, const struct net_device *dev)
295
{
296
	struct net_bridge *br;
297
	struct ifinfomsg *hdr;
298 299 300
	struct nlmsghdr *nlh;
	u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN;

301 302 303 304 305
	if (port)
		br = port->br;
	else
		br = netdev_priv(dev);

306 307
	br_debug(br, "br_fill_info event %d port %s master %s\n",
		     event, dev->name, br->dev->name);
308

309 310
	nlh = nlmsg_put(skb, pid, seq, event, sizeof(*hdr), flags);
	if (nlh == NULL)
311
		return -EMSGSIZE;
312

313 314 315 316 317 318 319
	hdr = nlmsg_data(nlh);
	hdr->ifi_family = AF_BRIDGE;
	hdr->__ifi_pad = 0;
	hdr->ifi_type = dev->type;
	hdr->ifi_index = dev->ifindex;
	hdr->ifi_flags = dev_get_flags(dev);
	hdr->ifi_change = 0;
320

D
David S. Miller 已提交
321 322 323 324 325 326
	if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
	    nla_put_u32(skb, IFLA_MASTER, br->dev->ifindex) ||
	    nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
	    nla_put_u8(skb, IFLA_OPERSTATE, operstate) ||
	    (dev->addr_len &&
	     nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
327 328
	    (dev->ifindex != dev_get_iflink(dev) &&
	     nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))))
D
David S. Miller 已提交
329
		goto nla_put_failure;
330

331
	if (event == RTM_NEWLINK && port) {
332 333 334 335 336 337 338 339
		struct nlattr *nest
			= nla_nest_start(skb, IFLA_PROTINFO | NLA_F_NESTED);

		if (nest == NULL || br_port_fill_attrs(skb, port) < 0)
			goto nla_put_failure;
		nla_nest_end(skb, nest);
	}

340
	/* Check if  the VID information is requested */
341 342
	if ((filter_mask & RTEXT_FILTER_BRVLAN) ||
	    (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) {
343
		struct net_bridge_vlan_group *vg;
344 345
		struct nlattr *af;
		int err;
346

347
		if (port)
348
			vg = nbp_vlan_group(port);
349
		else
350
			vg = br_vlan_group(br);
351

352
		if (!vg || !vg->num_vlans)
353 354 355 356 357 358
			goto done;

		af = nla_nest_start(skb, IFLA_AF_SPEC);
		if (!af)
			goto nla_put_failure;

359
		if (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)
360
			err = br_fill_ifvlaninfo_compressed(skb, vg);
361
		else
362
			err = br_fill_ifvlaninfo(skb, vg);
363 364
		if (err)
			goto nla_put_failure;
365 366 367 368
		nla_nest_end(skb, af);
	}

done:
369 370
	nlmsg_end(skb, nlh);
	return 0;
371

372
nla_put_failure:
373 374
	nlmsg_cancel(skb, nlh);
	return -EMSGSIZE;
375 376 377 378 379 380 381
}

/*
 * Notify listeners of a change in port information
 */
void br_ifinfo_notify(int event, struct net_bridge_port *port)
{
382
	struct net *net;
383
	struct sk_buff *skb;
384
	int err = -ENOBUFS;
385
	u32 filter = RTEXT_FILTER_BRVLAN_COMPRESSED;
386

387 388 389 390
	if (!port)
		return;

	net = dev_net(port->dev);
391
	br_debug(port->br, "port %u(%s) event %d\n",
392
		 (unsigned int)port->port_no, port->dev->name, event);
393

394
	skb = nlmsg_new(br_nlmsg_size(port->dev, filter), GFP_ATOMIC);
395 396 397
	if (skb == NULL)
		goto errout;

398
	err = br_fill_ifinfo(skb, port, 0, 0, event, 0, filter, port->dev);
399 400 401 402 403 404
	if (err < 0) {
		/* -EMSGSIZE implies BUG in br_nlmsg_size() */
		WARN_ON(err == -EMSGSIZE);
		kfree_skb(skb);
		goto errout;
	}
405 406
	rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
	return;
407
errout:
408
	rtnl_set_sk_err(net, RTNLGRP_LINK, err);
409 410
}

411

412 413 414
/*
 * Dump information about all ports, in response to GETLINK
 */
J
John Fastabend 已提交
415
int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,
416
	       struct net_device *dev, u32 filter_mask, int nlflags)
417
{
418
	struct net_bridge_port *port = br_port_get_rtnl(dev);
J
John Fastabend 已提交
419

420 421
	if (!port && !(filter_mask & RTEXT_FILTER_BRVLAN) &&
	    !(filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED))
422
		return 0;
423

424
	return br_fill_ifinfo(skb, port, pid, seq, RTM_NEWLINK, nlflags,
425
			      filter_mask, dev);
426 427
}

428 429 430 431 432 433 434 435
static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,
			int cmd, struct bridge_vlan_info *vinfo)
{
	int err = 0;

	switch (cmd) {
	case RTM_SETLINK:
		if (p) {
436 437 438
			/* if the MASTER flag is set this will act on the global
			 * per-VLAN entry as well
			 */
439 440 441 442
			err = nbp_vlan_add(p, vinfo->vid, vinfo->flags);
			if (err)
				break;
		} else {
443
			vinfo->flags |= BRIDGE_VLAN_INFO_BRENTRY;
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
			err = br_vlan_add(br, vinfo->vid, vinfo->flags);
		}
		break;

	case RTM_DELLINK:
		if (p) {
			nbp_vlan_delete(p, vinfo->vid);
			if (vinfo->flags & BRIDGE_VLAN_INFO_MASTER)
				br_vlan_delete(p->br, vinfo->vid);
		} else {
			br_vlan_delete(br, vinfo->vid);
		}
		break;
	}

	return err;
}
461 462 463 464 465 466

static int br_afspec(struct net_bridge *br,
		     struct net_bridge_port *p,
		     struct nlattr *af_spec,
		     int cmd)
{
467 468 469
	struct bridge_vlan_info *vinfo_start = NULL;
	struct bridge_vlan_info *vinfo = NULL;
	struct nlattr *attr;
470
	int err = 0;
471
	int rem;
472

473 474 475 476 477 478
	nla_for_each_nested(attr, af_spec, rem) {
		if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO)
			continue;
		if (nla_len(attr) != sizeof(struct bridge_vlan_info))
			return -EINVAL;
		vinfo = nla_data(attr);
479 480
		if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK)
			return -EINVAL;
481 482 483 484 485 486
		if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) {
			if (vinfo_start)
				return -EINVAL;
			vinfo_start = vinfo;
			continue;
		}
487

488 489 490
		if (vinfo_start) {
			struct bridge_vlan_info tmp_vinfo;
			int v;
491

492 493
			if (!(vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END))
				return -EINVAL;
494

495 496 497 498 499
			if (vinfo->vid <= vinfo_start->vid)
				return -EINVAL;

			memcpy(&tmp_vinfo, vinfo_start,
			       sizeof(struct bridge_vlan_info));
500

501 502 503
			for (v = vinfo_start->vid; v <= vinfo->vid; v++) {
				tmp_vinfo.vid = v;
				err = br_vlan_info(br, p, cmd, &tmp_vinfo);
504 505
				if (err)
					break;
506 507 508 509
			}
			vinfo_start = NULL;
		} else {
			err = br_vlan_info(br, p, cmd, vinfo);
510
		}
511 512
		if (err)
			break;
513 514 515 516 517
	}

	return err;
}

518
static const struct nla_policy br_port_policy[IFLA_BRPORT_MAX + 1] = {
519 520 521 522
	[IFLA_BRPORT_STATE]	= { .type = NLA_U8 },
	[IFLA_BRPORT_COST]	= { .type = NLA_U32 },
	[IFLA_BRPORT_PRIORITY]	= { .type = NLA_U16 },
	[IFLA_BRPORT_MODE]	= { .type = NLA_U8 },
523
	[IFLA_BRPORT_GUARD]	= { .type = NLA_U8 },
S
stephen hemminger 已提交
524
	[IFLA_BRPORT_PROTECT]	= { .type = NLA_U8 },
525
	[IFLA_BRPORT_FAST_LEAVE]= { .type = NLA_U8 },
526
	[IFLA_BRPORT_LEARNING]	= { .type = NLA_U8 },
527
	[IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 },
528
	[IFLA_BRPORT_PROXYARP]	= { .type = NLA_U8 },
529
	[IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 },
530 531 532 533 534 535 536 537 538 539 540 541
};

/* Change the state of the port and notify spanning tree */
static int br_set_port_state(struct net_bridge_port *p, u8 state)
{
	if (state > BR_STATE_BLOCKING)
		return -EINVAL;

	/* if kernel STP is running, don't allow changes */
	if (p->br->stp_enabled == BR_KERNEL_STP)
		return -EBUSY;

542 543 544
	/* if device is not up, change is not allowed
	 * if link is not present, only allowable state is disabled
	 */
545
	if (!netif_running(p->dev) ||
546
	    (!netif_oper_up(p->dev) && state != BR_STATE_DISABLED))
547 548
		return -ENETDOWN;

549
	br_set_state(p, state);
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
	br_log_state(p);
	br_port_state_selection(p->br);
	return 0;
}

/* Set/clear or port flags based on attribute */
static void br_set_port_flag(struct net_bridge_port *p, struct nlattr *tb[],
			   int attrtype, unsigned long mask)
{
	if (tb[attrtype]) {
		u8 flag = nla_get_u8(tb[attrtype]);
		if (flag)
			p->flags |= mask;
		else
			p->flags &= ~mask;
	}
}

/* Process bridge protocol info on port */
static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
{
	int err;
572
	unsigned long old_flags = p->flags;
573 574

	br_set_port_flag(p, tb, IFLA_BRPORT_MODE, BR_HAIRPIN_MODE);
575
	br_set_port_flag(p, tb, IFLA_BRPORT_GUARD, BR_BPDU_GUARD);
576
	br_set_port_flag(p, tb, IFLA_BRPORT_FAST_LEAVE, BR_MULTICAST_FAST_LEAVE);
577
	br_set_port_flag(p, tb, IFLA_BRPORT_PROTECT, BR_ROOT_BLOCK);
578
	br_set_port_flag(p, tb, IFLA_BRPORT_LEARNING, BR_LEARNING);
579
	br_set_port_flag(p, tb, IFLA_BRPORT_UNICAST_FLOOD, BR_FLOOD);
580
	br_set_port_flag(p, tb, IFLA_BRPORT_PROXYARP, BR_PROXYARP);
581
	br_set_port_flag(p, tb, IFLA_BRPORT_PROXYARP_WIFI, BR_PROXYARP_WIFI);
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599

	if (tb[IFLA_BRPORT_COST]) {
		err = br_stp_set_path_cost(p, nla_get_u32(tb[IFLA_BRPORT_COST]));
		if (err)
			return err;
	}

	if (tb[IFLA_BRPORT_PRIORITY]) {
		err = br_stp_set_port_priority(p, nla_get_u16(tb[IFLA_BRPORT_PRIORITY]));
		if (err)
			return err;
	}

	if (tb[IFLA_BRPORT_STATE]) {
		err = br_set_port_state(p, nla_get_u8(tb[IFLA_BRPORT_STATE]));
		if (err)
			return err;
	}
600 601

	br_port_flags_change(p, old_flags ^ p->flags);
602 603 604 605
	return 0;
}

/* Change state and parameters on port. */
606
int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)
607
{
608
	struct nlattr *protinfo;
609
	struct nlattr *afspec;
610
	struct net_bridge_port *p;
611
	struct nlattr *tb[IFLA_BRPORT_MAX + 1];
612
	int err = 0;
613

614 615
	protinfo = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_PROTINFO);
	afspec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
616
	if (!protinfo && !afspec)
617
		return 0;
618

619
	p = br_port_get_rtnl(dev);
620
	/* We want to accept dev as bridge itself if the AF_SPEC
S
stephen hemminger 已提交
621
	 * is set to see if someone is setting vlan info on the bridge
622
	 */
623
	if (!p && !afspec)
624
		return -EINVAL;
625

626 627 628
	if (p && protinfo) {
		if (protinfo->nla_type & NLA_F_NESTED) {
			err = nla_parse_nested(tb, IFLA_BRPORT_MAX,
629
					       protinfo, br_port_policy);
630 631 632 633 634 635 636
			if (err)
				return err;

			spin_lock_bh(&p->br->lock);
			err = br_setport(p, tb);
			spin_unlock_bh(&p->br->lock);
		} else {
S
stephen hemminger 已提交
637
			/* Binary compatibility with old RSTP */
638 639 640 641 642 643 644
			if (nla_len(protinfo) < sizeof(u8))
				return -EINVAL;

			spin_lock_bh(&p->br->lock);
			err = br_set_port_state(p, nla_get_u8(protinfo));
			spin_unlock_bh(&p->br->lock);
		}
645
		if (err)
646 647
			goto out;
	}
648

649 650 651
	if (afspec) {
		err = br_afspec((struct net_bridge *)netdev_priv(dev), p,
				afspec, RTM_SETLINK);
652
	}
653

654 655
	if (err == 0)
		br_ifinfo_notify(RTM_NEWLINK, p);
656
out:
657
	return err;
658 659
}

660
/* Delete port information */
661
int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)
662 663 664
{
	struct nlattr *afspec;
	struct net_bridge_port *p;
665
	int err = 0;
666

667
	afspec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
668 669 670 671 672 673 674 675 676 677
	if (!afspec)
		return 0;

	p = br_port_get_rtnl(dev);
	/* We want to accept dev as bridge itself as well */
	if (!p && !(dev->priv_flags & IFF_EBRIDGE))
		return -EINVAL;

	err = br_afspec((struct net_bridge *)netdev_priv(dev), p,
			afspec, RTM_DELLINK);
678 679 680 681 682
	if (err == 0)
		/* Send RTM_NEWLINK because userspace
		 * expects RTM_NEWLINK for vlan dels
		 */
		br_ifinfo_notify(RTM_NEWLINK, p);
683 684 685

	return err;
}
686 687 688 689 690 691 692 693 694
static int br_validate(struct nlattr *tb[], struct nlattr *data[])
{
	if (tb[IFLA_ADDRESS]) {
		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
			return -EINVAL;
		if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
			return -EADDRNOTAVAIL;
	}

695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
	if (!data)
		return 0;

#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	if (data[IFLA_BR_VLAN_PROTOCOL]) {
		switch (nla_get_be16(data[IFLA_BR_VLAN_PROTOCOL])) {
		case htons(ETH_P_8021Q):
		case htons(ETH_P_8021AD):
			break;
		default:
			return -EPROTONOSUPPORT;
		}
	}
#endif

710 711 712
	return 0;
}

713 714 715 716 717 718 719 720 721 722 723 724 725 726
static int br_dev_newlink(struct net *src_net, struct net_device *dev,
			  struct nlattr *tb[], struct nlattr *data[])
{
	struct net_bridge *br = netdev_priv(dev);

	if (tb[IFLA_ADDRESS]) {
		spin_lock_bh(&br->lock);
		br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS]));
		spin_unlock_bh(&br->lock);
	}

	return register_netdevice(dev);
}

727 728 729 730 731
static int br_port_slave_changelink(struct net_device *brdev,
				    struct net_device *dev,
				    struct nlattr *tb[],
				    struct nlattr *data[])
{
732 733 734
	struct net_bridge *br = netdev_priv(brdev);
	int ret;

735 736
	if (!data)
		return 0;
737 738 739 740 741 742

	spin_lock_bh(&br->lock);
	ret = br_setport(br_port_get_rtnl(dev), data);
	spin_unlock_bh(&br->lock);

	return ret;
743 744
}

745 746 747 748 749 750 751 752 753 754 755 756 757
static int br_port_fill_slave_info(struct sk_buff *skb,
				   const struct net_device *brdev,
				   const struct net_device *dev)
{
	return br_port_fill_attrs(skb, br_port_get_rtnl(dev));
}

static size_t br_port_get_slave_size(const struct net_device *brdev,
				     const struct net_device *dev)
{
	return br_port_info_size();
}

758 759 760 761
static const struct nla_policy br_policy[IFLA_BR_MAX + 1] = {
	[IFLA_BR_FORWARD_DELAY]	= { .type = NLA_U32 },
	[IFLA_BR_HELLO_TIME]	= { .type = NLA_U32 },
	[IFLA_BR_MAX_AGE]	= { .type = NLA_U32 },
762 763 764
	[IFLA_BR_AGEING_TIME] = { .type = NLA_U32 },
	[IFLA_BR_STP_STATE] = { .type = NLA_U32 },
	[IFLA_BR_PRIORITY] = { .type = NLA_U16 },
765
	[IFLA_BR_VLAN_FILTERING] = { .type = NLA_U8 },
766
	[IFLA_BR_VLAN_PROTOCOL] = { .type = NLA_U16 },
767
	[IFLA_BR_GROUP_FWD_MASK] = { .type = NLA_U16 },
768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
};

static int br_changelink(struct net_device *brdev, struct nlattr *tb[],
			 struct nlattr *data[])
{
	struct net_bridge *br = netdev_priv(brdev);
	int err;

	if (!data)
		return 0;

	if (data[IFLA_BR_FORWARD_DELAY]) {
		err = br_set_forward_delay(br, nla_get_u32(data[IFLA_BR_FORWARD_DELAY]));
		if (err)
			return err;
	}

	if (data[IFLA_BR_HELLO_TIME]) {
		err = br_set_hello_time(br, nla_get_u32(data[IFLA_BR_HELLO_TIME]));
		if (err)
			return err;
	}

	if (data[IFLA_BR_MAX_AGE]) {
		err = br_set_max_age(br, nla_get_u32(data[IFLA_BR_MAX_AGE]));
		if (err)
			return err;
	}

797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
	if (data[IFLA_BR_AGEING_TIME]) {
		u32 ageing_time = nla_get_u32(data[IFLA_BR_AGEING_TIME]);

		br->ageing_time = clock_t_to_jiffies(ageing_time);
	}

	if (data[IFLA_BR_STP_STATE]) {
		u32 stp_enabled = nla_get_u32(data[IFLA_BR_STP_STATE]);

		br_stp_set_enabled(br, stp_enabled);
	}

	if (data[IFLA_BR_PRIORITY]) {
		u32 priority = nla_get_u16(data[IFLA_BR_PRIORITY]);

		br_stp_set_bridge_priority(br, priority);
	}

815 816 817 818 819 820 821 822
	if (data[IFLA_BR_VLAN_FILTERING]) {
		u8 vlan_filter = nla_get_u8(data[IFLA_BR_VLAN_FILTERING]);

		err = __br_vlan_filter_toggle(br, vlan_filter);
		if (err)
			return err;
	}

823 824 825 826 827 828 829 830 831 832
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	if (data[IFLA_BR_VLAN_PROTOCOL]) {
		__be16 vlan_proto = nla_get_be16(data[IFLA_BR_VLAN_PROTOCOL]);

		err = __br_vlan_set_proto(br, vlan_proto);
		if (err)
			return err;
	}
#endif

833 834 835 836 837 838 839 840
	if (data[IFLA_BR_GROUP_FWD_MASK]) {
		u16 fwd_mask = nla_get_u16(data[IFLA_BR_GROUP_FWD_MASK]);

		if (fwd_mask & BR_GROUPFWD_RESTRICTED)
			return -EINVAL;
		br->group_fwd_mask = fwd_mask;
	}

841 842 843
	return 0;
}

844 845 846 847 848
static size_t br_get_size(const struct net_device *brdev)
{
	return nla_total_size(sizeof(u32)) +	/* IFLA_BR_FORWARD_DELAY  */
	       nla_total_size(sizeof(u32)) +	/* IFLA_BR_HELLO_TIME */
	       nla_total_size(sizeof(u32)) +	/* IFLA_BR_MAX_AGE */
849 850 851
	       nla_total_size(sizeof(u32)) +    /* IFLA_BR_AGEING_TIME */
	       nla_total_size(sizeof(u32)) +    /* IFLA_BR_STP_STATE */
	       nla_total_size(sizeof(u16)) +    /* IFLA_BR_PRIORITY */
852
	       nla_total_size(sizeof(u8)) +     /* IFLA_BR_VLAN_FILTERING */
853 854 855
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	       nla_total_size(sizeof(__be16)) +	/* IFLA_BR_VLAN_PROTOCOL */
#endif
856
	       nla_total_size(sizeof(u16)) +    /* IFLA_BR_GROUP_FWD_MASK */
857
	       nla_total_size(sizeof(struct ifla_bridge_id)) +   /* IFLA_BR_ROOT_ID */
858
	       nla_total_size(sizeof(struct ifla_bridge_id)) +   /* IFLA_BR_BRIDGE_ID */
859
	       nla_total_size(sizeof(u16)) +    /* IFLA_BR_ROOT_PORT */
860 861 862 863 864 865 866 867 868
	       0;
}

static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev)
{
	struct net_bridge *br = netdev_priv(brdev);
	u32 forward_delay = jiffies_to_clock_t(br->forward_delay);
	u32 hello_time = jiffies_to_clock_t(br->hello_time);
	u32 age_time = jiffies_to_clock_t(br->max_age);
869 870 871
	u32 ageing_time = jiffies_to_clock_t(br->ageing_time);
	u32 stp_enabled = br->stp_enabled;
	u16 priority = (br->bridge_id.prio[0] << 8) | br->bridge_id.prio[1];
872
	u16 group_fwd_mask = br->group_fwd_mask;
873
	u8 vlan_enabled = br_vlan_enabled(br);
874
	struct ifla_bridge_id root_id, bridge_id;
875

876
	memset(&bridge_id, 0, sizeof(bridge_id));
877 878 879
	memset(&root_id, 0, sizeof(root_id));
	memcpy(root_id.prio, br->designated_root.prio, sizeof(root_id.prio));
	memcpy(root_id.addr, br->designated_root.addr, sizeof(root_id.addr));
880 881
	memcpy(bridge_id.prio, br->bridge_id.prio, sizeof(bridge_id.prio));
	memcpy(bridge_id.addr, br->bridge_id.addr, sizeof(bridge_id.addr));
882 883 884

	if (nla_put_u32(skb, IFLA_BR_FORWARD_DELAY, forward_delay) ||
	    nla_put_u32(skb, IFLA_BR_HELLO_TIME, hello_time) ||
885 886 887
	    nla_put_u32(skb, IFLA_BR_MAX_AGE, age_time) ||
	    nla_put_u32(skb, IFLA_BR_AGEING_TIME, ageing_time) ||
	    nla_put_u32(skb, IFLA_BR_STP_STATE, stp_enabled) ||
888
	    nla_put_u16(skb, IFLA_BR_PRIORITY, priority) ||
889
	    nla_put_u8(skb, IFLA_BR_VLAN_FILTERING, vlan_enabled) ||
890
	    nla_put_u16(skb, IFLA_BR_GROUP_FWD_MASK, group_fwd_mask) ||
891
	    nla_put(skb, IFLA_BR_ROOT_ID, sizeof(root_id), &root_id) ||
892 893
	    nla_put(skb, IFLA_BR_BRIDGE_ID, sizeof(bridge_id), &bridge_id) ||
	    nla_put_u16(skb, IFLA_BR_ROOT_PORT, br->root_port))
894 895
		return -EMSGSIZE;

896 897 898 899 900
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	if (nla_put_be16(skb, IFLA_BR_VLAN_PROTOCOL, br->vlan_proto))
		return -EMSGSIZE;
#endif

901 902 903
	return 0;
}

904 905
static size_t br_get_link_af_size(const struct net_device *dev)
{
906 907 908
	struct net_bridge_port *p;
	struct net_bridge *br;
	int num_vlans = 0;
909

910 911 912
	if (br_port_exists(dev)) {
		p = br_port_get_rtnl(dev);
		num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p),
913
						  RTEXT_FILTER_BRVLAN);
914 915 916
	} else if (dev->priv_flags & IFF_EBRIDGE) {
		br = netdev_priv(dev);
		num_vlans = br_get_num_vlan_infos(br_vlan_group(br),
917
						  RTEXT_FILTER_BRVLAN);
918
	}
919 920

	/* Each VLAN is returned in bridge_vlan_info along with flags */
921
	return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info));
922 923
}

924
static struct rtnl_af_ops br_af_ops __read_mostly = {
925 926 927 928
	.family			= AF_BRIDGE,
	.get_link_af_size	= br_get_link_af_size,
};

929
struct rtnl_link_ops br_link_ops __read_mostly = {
930 931 932
	.kind			= "bridge",
	.priv_size		= sizeof(struct net_bridge),
	.setup			= br_dev_setup,
933
	.maxtype		= IFLA_BR_MAX,
934
	.policy			= br_policy,
935 936
	.validate		= br_validate,
	.newlink		= br_dev_newlink,
937
	.changelink		= br_changelink,
938
	.dellink		= br_dev_delete,
939 940
	.get_size		= br_get_size,
	.fill_info		= br_fill_info,
941 942 943 944

	.slave_maxtype		= IFLA_BRPORT_MAX,
	.slave_policy		= br_port_policy,
	.slave_changelink	= br_port_slave_changelink,
945 946
	.get_slave_size		= br_port_get_slave_size,
	.fill_slave_info	= br_port_fill_slave_info,
947
};
948

949
int __init br_netlink_init(void)
950
{
951 952 953
	int err;

	br_mdb_init();
954
	rtnl_af_register(&br_af_ops);
955

956 957 958 959
	err = rtnl_link_register(&br_link_ops);
	if (err)
		goto out_af;

960
	return 0;
961 962 963

out_af:
	rtnl_af_unregister(&br_af_ops);
964 965
	br_mdb_uninit();
	return err;
966 967
}

968
void br_netlink_fini(void)
969
{
970
	br_mdb_uninit();
971
	rtnl_af_unregister(&br_af_ops);
972
	rtnl_link_unregister(&br_link_ops);
973
}