br_device.c 12.8 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds's avatar
Linus Torvalds committed
2 3 4 5 6 7 8 9 10 11
/*
 *	Device handling code
 *	Linux ethernet bridge
 *
 *	Authors:
 *	Lennert Buytenhek		<buytenh@gnu.org>
 */

#include <linux/kernel.h>
#include <linux/netdevice.h>
12
#include <linux/netpoll.h>
13
#include <linux/etherdevice.h>
14
#include <linux/ethtool.h>
15
#include <linux/list.h>
16
#include <linux/netfilter_bridge.h>
17

18
#include <linux/uaccess.h>
Linus Torvalds's avatar
Linus Torvalds committed
19 20
#include "br_private.h"

21 22 23
#define COMMON_FEATURES (NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | \
			 NETIF_F_GSO_MASK | NETIF_F_HW_CSUM)

24 25 26
const struct nf_br_ops __rcu *nf_br_ops __read_mostly;
EXPORT_SYMBOL_GPL(nf_br_ops);

27
/* net device transmit always called with BH disabled */
28
netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
Linus Torvalds's avatar
Linus Torvalds committed
29
{
30
	struct net_bridge_mcast_port *pmctx_null = NULL;
Linus Torvalds's avatar
Linus Torvalds committed
31
	struct net_bridge *br = netdev_priv(dev);
32
	struct net_bridge_mcast *brmctx = &br->multicast_ctx;
Linus Torvalds's avatar
Linus Torvalds committed
33
	struct net_bridge_fdb_entry *dst;
34
	struct net_bridge_mdb_entry *mdst;
35
	const struct nf_br_ops *nf_ops;
36
	u8 state = BR_STATE_FORWARDING;
37
	struct net_bridge_vlan *vlan;
38
	const unsigned char *dest;
39
	u16 vid = 0;
Linus Torvalds's avatar
Linus Torvalds committed
40

41 42
	memset(skb->cb, 0, sizeof(struct br_input_skb_cb));

43
	rcu_read_lock();
44 45
	nf_ops = rcu_dereference(nf_br_ops);
	if (nf_ops && nf_ops->br_dev_xmit_hook(skb)) {
46
		rcu_read_unlock();
47 48 49
		return NETDEV_TX_OK;
	}

50
	dev_sw_netstats_tx_add(dev, 1, skb->len);
51

52
	br_switchdev_frame_unmark(skb);
53
	BR_INPUT_SKB_CB(skb)->brdev = dev;
54
	BR_INPUT_SKB_CB(skb)->frag_max_size = 0;
Linus Torvalds's avatar
Linus Torvalds committed
55

56
	skb_reset_mac_header(skb);
Linus Torvalds's avatar
Linus Torvalds committed
57 58
	skb_pull(skb, ETH_HLEN);

59 60
	if (!br_allowed_ingress(br, br_vlan_group_rcu(br), skb, &vid,
				&state, &vlan))
61 62
		goto out;

63
	if (IS_ENABLED(CONFIG_INET) &&
64 65
	    (eth_hdr(skb)->h_proto == htons(ETH_P_ARP) ||
	     eth_hdr(skb)->h_proto == htons(ETH_P_RARP)) &&
66
	    br_opt_get(br, BROPT_NEIGH_SUPPRESS_ENABLED)) {
67
		br_do_proxy_suppress_arp(skb, br, vid, NULL);
68 69
	} else if (IS_ENABLED(CONFIG_IPV6) &&
		   skb->protocol == htons(ETH_P_IPV6) &&
70
		   br_opt_get(br, BROPT_NEIGH_SUPPRESS_ENABLED) &&
71 72 73 74 75 76 77 78
		   pskb_may_pull(skb, sizeof(struct ipv6hdr) +
				 sizeof(struct nd_msg)) &&
		   ipv6_hdr(skb)->nexthdr == IPPROTO_ICMPV6) {
			struct nd_msg *msg, _msg;

			msg = br_is_nd_neigh_msg(skb, &_msg);
			if (msg)
				br_do_suppress_nd(skb, br, vid, NULL, msg);
79 80
	}

81
	dest = eth_hdr(skb)->h_dest;
82
	if (is_broadcast_ether_addr(dest)) {
83
		br_flood(br, skb, BR_PKT_BROADCAST, false, true, vid);
84
	} else if (is_multicast_ether_addr(dest)) {
Herbert Xu's avatar
Herbert Xu committed
85
		if (unlikely(netpoll_tx_running(dev))) {
86
			br_flood(br, skb, BR_PKT_MULTICAST, false, true, vid);
Herbert Xu's avatar
Herbert Xu committed
87 88
			goto out;
		}
89
		if (br_multicast_rcv(&brmctx, &pmctx_null, vlan, skb, vid)) {
90
			kfree_skb(skb);
91
			goto out;
92
		}
93

94
		mdst = br_mdb_get(brmctx, skb, vid);
95
		if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) &&
96 97
		    br_multicast_querier_exists(brmctx, eth_hdr(skb), mdst))
			br_multicast_flood(mdst, skb, brmctx, false, true);
98
		else
99
			br_flood(br, skb, BR_PKT_MULTICAST, false, true, vid);
100
	} else if ((dst = br_fdb_find_rcu(br, dest, vid)) != NULL) {
101 102
		br_forward(dst->dst, skb, false, true);
	} else {
103
		br_flood(br, skb, BR_PKT_UNICAST, false, true, vid);
104
	}
105
out:
106
	rcu_read_unlock();
107
	return NETDEV_TX_OK;
Linus Torvalds's avatar
Linus Torvalds committed
108 109
}

110 111 112 113 114 115 116
static struct lock_class_key bridge_netdev_addr_lock_key;

static void br_set_lockdep_class(struct net_device *dev)
{
	lockdep_set_class(&dev->addr_list_lock, &bridge_netdev_addr_lock_key);
}

117 118 119
static int br_dev_init(struct net_device *dev)
{
	struct net_bridge *br = netdev_priv(dev);
120
	int err;
121

122 123
	dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
	if (!dev->tstats)
124 125
		return -ENOMEM;

126 127
	err = br_fdb_hash_init(br);
	if (err) {
128
		free_percpu(dev->tstats);
129 130 131
		return err;
	}

132 133
	err = br_mdb_hash_init(br);
	if (err) {
134
		free_percpu(dev->tstats);
135 136 137 138
		br_fdb_hash_fini(br);
		return err;
	}

139
	err = br_vlan_init(br);
140
	if (err) {
141
		free_percpu(dev->tstats);
142
		br_mdb_hash_fini(br);
143
		br_fdb_hash_fini(br);
144 145 146 147 148
		return err;
	}

	err = br_multicast_init_stats(br);
	if (err) {
149
		free_percpu(dev->tstats);
150
		br_vlan_flush(br);
151
		br_mdb_hash_fini(br);
152
		br_fdb_hash_fini(br);
153
	}
154

155
	br_set_lockdep_class(dev);
156
	return err;
157 158
}

159 160 161 162
static void br_dev_uninit(struct net_device *dev)
{
	struct net_bridge *br = netdev_priv(dev);

163
	br_multicast_dev_del(br);
164 165
	br_multicast_uninit_stats(br);
	br_vlan_flush(br);
166
	br_mdb_hash_fini(br);
167
	br_fdb_hash_fini(br);
168
	free_percpu(dev->tstats);
169 170
}

Linus Torvalds's avatar
Linus Torvalds committed
171 172
static int br_dev_open(struct net_device *dev)
{
173
	struct net_bridge *br = netdev_priv(dev);
Linus Torvalds's avatar
Linus Torvalds committed
174

175
	netdev_update_features(dev);
176 177
	netif_start_queue(dev);
	br_stp_enable_bridge(br);
178
	br_multicast_open(br);
Linus Torvalds's avatar
Linus Torvalds committed
179

180 181 182
	if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
		br_multicast_join_snoopers(br);

Linus Torvalds's avatar
Linus Torvalds committed
183 184 185 186 187 188 189
	return 0;
}

static void br_dev_set_multicast_list(struct net_device *dev)
{
}

190 191 192 193 194 195
static void br_dev_change_rx_flags(struct net_device *dev, int change)
{
	if (change & IFF_PROMISC)
		br_manage_promisc(netdev_priv(dev));
}

Linus Torvalds's avatar
Linus Torvalds committed
196 197
static int br_dev_stop(struct net_device *dev)
{
198 199 200 201
	struct net_bridge *br = netdev_priv(dev);

	br_stp_disable_bridge(br);
	br_multicast_stop(br);
Linus Torvalds's avatar
Linus Torvalds committed
202

203 204 205
	if (br_opt_get(br, BROPT_MULTICAST_ENABLED))
		br_multicast_leave_snoopers(br);

Linus Torvalds's avatar
Linus Torvalds committed
206 207 208 209 210 211 212
	netif_stop_queue(dev);

	return 0;
}

static int br_change_mtu(struct net_device *dev, int new_mtu)
{
213
	struct net_bridge *br = netdev_priv(dev);
214

Linus Torvalds's avatar
Linus Torvalds committed
215
	dev->mtu = new_mtu;
216

217
	/* this flag will be cleared if the MTU was automatically adjusted */
218
	br_opt_toggle(br, BROPT_MTU_SET_BY_USER, true);
219
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
220
	/* remember the MTU in the rtable for PMTU */
221
	dst_metric_set(&br->fake_rtable.dst, RTAX_MTU, new_mtu);
222 223
#endif

Linus Torvalds's avatar
Linus Torvalds committed
224 225 226
	return 0;
}

227
/* Allow setting mac address to any valid ethernet address. */
228 229 230 231
static int br_set_mac_address(struct net_device *dev, void *p)
{
	struct net_bridge *br = netdev_priv(dev);
	struct sockaddr *addr = p;
232 233

	if (!is_valid_ether_addr(addr->sa_data))
234
		return -EADDRNOTAVAIL;
235

236 237 238 239 240 241
	/* dev_set_mac_addr() can be called by a master device on bridge's
	 * NETDEV_UNREGISTER, but since it's being destroyed do nothing
	 */
	if (dev->reg_state != NETREG_REGISTERED)
		return -EBUSY;

242
	spin_lock_bh(&br->lock);
243
	if (!ether_addr_equal(dev->dev_addr, addr->sa_data)) {
244
		/* Mac address will be changed in br_stp_change_bridge_id(). */
245 246
		br_stp_change_bridge_id(br, addr->sa_data);
	}
247 248
	spin_unlock_bh(&br->lock);

249
	return 0;
250 251
}

252 253
static void br_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)
{
254 255 256 257
	strscpy(info->driver, "bridge", sizeof(info->driver));
	strscpy(info->version, BR_VERSION, sizeof(info->version));
	strscpy(info->fw_version, "N/A", sizeof(info->fw_version));
	strscpy(info->bus_info, "N/A", sizeof(info->bus_info));
258 259
}

260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
static int br_get_link_ksettings(struct net_device *dev,
				 struct ethtool_link_ksettings *cmd)
{
	struct net_bridge *br = netdev_priv(dev);
	struct net_bridge_port *p;

	cmd->base.duplex = DUPLEX_UNKNOWN;
	cmd->base.port = PORT_OTHER;
	cmd->base.speed = SPEED_UNKNOWN;

	list_for_each_entry(p, &br->port_list, list) {
		struct ethtool_link_ksettings ecmd;
		struct net_device *pdev = p->dev;

		if (!netif_running(pdev) || !netif_oper_up(pdev))
			continue;

		if (__ethtool_get_link_ksettings(pdev, &ecmd))
			continue;

		if (ecmd.base.speed == (__u32)SPEED_UNKNOWN)
			continue;

		if (cmd->base.speed == (__u32)SPEED_UNKNOWN ||
		    cmd->base.speed < ecmd.base.speed)
			cmd->base.speed = ecmd.base.speed;
	}

	return 0;
}

291 292
static netdev_features_t br_fix_features(struct net_device *dev,
	netdev_features_t features)
293 294 295
{
	struct net_bridge *br = netdev_priv(dev);

296
	return br_features_recompute(br, features);
297 298
}

299
#ifdef CONFIG_NET_POLL_CONTROLLER
Herbert Xu's avatar
Herbert Xu committed
300
static void br_poll_controller(struct net_device *br_dev)
301 302 303
{
}

Herbert Xu's avatar
Herbert Xu committed
304
static void br_netpoll_cleanup(struct net_device *dev)
305
{
Herbert Xu's avatar
Herbert Xu committed
306
	struct net_bridge *br = netdev_priv(dev);
307
	struct net_bridge_port *p;
308

309
	list_for_each_entry(p, &br->port_list, list)
Herbert Xu's avatar
Herbert Xu committed
310
		br_netpoll_disable(p);
311 312
}

313
static int __br_netpoll_enable(struct net_bridge_port *p)
314 315 316 317
{
	struct netpoll *np;
	int err;

318
	np = kzalloc(sizeof(*p->np), GFP_KERNEL);
319 320 321
	if (!np)
		return -ENOMEM;

322
	err = __netpoll_setup(np, p->dev);
323 324 325 326 327 328 329 330 331
	if (err) {
		kfree(np);
		return err;
	}

	p->np = np;
	return err;
}

332
int br_netpoll_enable(struct net_bridge_port *p)
333 334 335 336
{
	if (!p->br->dev->npinfo)
		return 0;

337
	return __br_netpoll_enable(p);
338 339
}

340
static int br_netpoll_setup(struct net_device *dev, struct netpoll_info *ni)
341
{
stephen hemminger's avatar
stephen hemminger committed
342
	struct net_bridge *br = netdev_priv(dev);
343
	struct net_bridge_port *p;
Herbert Xu's avatar
Herbert Xu committed
344
	int err = 0;
345

346
	list_for_each_entry(p, &br->port_list, list) {
Herbert Xu's avatar
Herbert Xu committed
347 348
		if (!p->dev)
			continue;
349
		err = __br_netpoll_enable(p);
Herbert Xu's avatar
Herbert Xu committed
350 351
		if (err)
			goto fail;
352
	}
Herbert Xu's avatar
Herbert Xu committed
353 354 355 356 357 358 359

out:
	return err;

fail:
	br_netpoll_cleanup(dev);
	goto out;
360 361
}

Herbert Xu's avatar
Herbert Xu committed
362
void br_netpoll_disable(struct net_bridge_port *p)
363
{
Herbert Xu's avatar
Herbert Xu committed
364 365 366 367 368 369 370
	struct netpoll *np = p->np;

	if (!np)
		return;

	p->np = NULL;

371
	__netpoll_free(np);
372 373 374 375
}

#endif

376 377
static int br_add_slave(struct net_device *dev, struct net_device *slave_dev,
			struct netlink_ext_ack *extack)
378 379 380 381

{
	struct net_bridge *br = netdev_priv(dev);

382
	return br_add_if(br, slave_dev, extack);
383 384 385 386 387 388 389 390 391
}

static int br_del_slave(struct net_device *dev, struct net_device *slave_dev)
{
	struct net_bridge *br = netdev_priv(dev);

	return br_del_if(br, slave_dev);
}

392 393 394 395 396 397 398 399 400 401 402
static int br_fill_forward_path(struct net_device_path_ctx *ctx,
				struct net_device_path *path)
{
	struct net_bridge_fdb_entry *f;
	struct net_bridge_port *dst;
	struct net_bridge *br;

	if (netif_is_bridge_port(ctx->dev))
		return -1;

	br = netdev_priv(ctx->dev);
403 404 405 406

	br_vlan_fill_forward_path_pvid(br, ctx, path);

	f = br_fdb_find_rcu(br, ctx->daddr, path->bridge.vlan_id);
407 408 409 410 411 412 413
	if (!f || !f->dst)
		return -1;

	dst = READ_ONCE(f->dst);
	if (!dst)
		return -1;

414 415 416
	if (br_vlan_fill_forward_path_mode(br, dst, path))
		return -1;

417 418 419 420
	path->type = DEV_PATH_BRIDGE;
	path->dev = dst->br->dev;
	ctx->dev = dst->dev;

421 422 423 424 425 426 427 428
	switch (path->bridge.vlan_mode) {
	case DEV_PATH_BR_VLAN_TAG:
		if (ctx->num_vlans >= ARRAY_SIZE(ctx->vlan))
			return -ENOSPC;
		ctx->vlan[ctx->num_vlans].id = path->bridge.vlan_id;
		ctx->vlan[ctx->num_vlans].proto = path->bridge.vlan_proto;
		ctx->num_vlans++;
		break;
429
	case DEV_PATH_BR_VLAN_UNTAG_HW:
430 431 432 433 434 435 436
	case DEV_PATH_BR_VLAN_UNTAG:
		ctx->num_vlans--;
		break;
	case DEV_PATH_BR_VLAN_KEEP:
		break;
	}

437 438 439
	return 0;
}

440
static const struct ethtool_ops br_ethtool_ops = {
441 442 443
	.get_drvinfo		 = br_getinfo,
	.get_link		 = ethtool_op_get_link,
	.get_link_ksettings	 = br_get_link_ksettings,
444 445
};

446 447 448
static const struct net_device_ops br_netdev_ops = {
	.ndo_open		 = br_dev_open,
	.ndo_stop		 = br_dev_stop,
449
	.ndo_init		 = br_dev_init,
450
	.ndo_uninit		 = br_dev_uninit,
451
	.ndo_start_xmit		 = br_dev_xmit,
452
	.ndo_get_stats64	 = dev_get_tstats64,
453
	.ndo_set_mac_address	 = br_set_mac_address,
454
	.ndo_set_rx_mode	 = br_dev_set_multicast_list,
455
	.ndo_change_rx_flags	 = br_dev_change_rx_flags,
456
	.ndo_change_mtu		 = br_change_mtu,
457
	.ndo_siocdevprivate	 = br_dev_siocdevprivate,
458
#ifdef CONFIG_NET_POLL_CONTROLLER
Herbert Xu's avatar
Herbert Xu committed
459
	.ndo_netpoll_setup	 = br_netpoll_setup,
460 461 462
	.ndo_netpoll_cleanup	 = br_netpoll_cleanup,
	.ndo_poll_controller	 = br_poll_controller,
#endif
463 464
	.ndo_add_slave		 = br_add_slave,
	.ndo_del_slave		 = br_del_slave,
465
	.ndo_fix_features        = br_fix_features,
466 467
	.ndo_fdb_add		 = br_fdb_add,
	.ndo_fdb_del		 = br_fdb_delete,
468
	.ndo_fdb_del_bulk	 = br_fdb_delete_bulk,
469
	.ndo_fdb_dump		 = br_fdb_dump,
470
	.ndo_fdb_get		 = br_fdb_get,
471 472 473
	.ndo_mdb_add		 = br_mdb_add,
	.ndo_mdb_del		 = br_mdb_del,
	.ndo_mdb_dump		 = br_mdb_dump,
474 475
	.ndo_bridge_getlink	 = br_getlink,
	.ndo_bridge_setlink	 = br_setlink,
476
	.ndo_bridge_dellink	 = br_dellink,
477
	.ndo_features_check	 = passthru_features_check,
478
	.ndo_fill_forward_path	 = br_fill_forward_path,
479 480
};

481 482 483 484
static struct device_type br_type = {
	.name	= "bridge",
};

Linus Torvalds's avatar
Linus Torvalds committed
485 486
void br_dev_setup(struct net_device *dev)
{
487 488
	struct net_bridge *br = netdev_priv(dev);

489
	eth_hw_addr_random(dev);
Linus Torvalds's avatar
Linus Torvalds committed
490 491
	ether_setup(dev);

492
	dev->netdev_ops = &br_netdev_ops;
493
	dev->needs_free_netdev = true;
494
	dev->ethtool_ops = &br_ethtool_ops;
495
	SET_NETDEV_DEVTYPE(dev, &br_type);
496
	dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
497

498
	dev->features = COMMON_FEATURES | NETIF_F_LLTX | NETIF_F_NETNS_LOCAL |
499 500 501
			NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
	dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
			   NETIF_F_HW_VLAN_STAG_TX;
502
	dev->vlan_features = COMMON_FEATURES;
503 504 505 506

	br->dev = dev;
	spin_lock_init(&br->lock);
	INIT_LIST_HEAD(&br->port_list);
507
	INIT_HLIST_HEAD(&br->fdb_list);
508
	INIT_HLIST_HEAD(&br->frame_type_list);
509
#if IS_ENABLED(CONFIG_BRIDGE_MRP)
510
	INIT_HLIST_HEAD(&br->mrp_list);
511 512 513
#endif
#if IS_ENABLED(CONFIG_BRIDGE_CFM)
	INIT_HLIST_HEAD(&br->mep_list);
514
#endif
515 516 517 518 519
	spin_lock_init(&br->hash_lock);

	br->bridge_id.prio[0] = 0x80;
	br->bridge_id.prio[1] = 0x00;

520
	ether_addr_copy(br->group_addr, eth_stp_addr);
521 522

	br->stp_enabled = BR_NO_STP;
523
	br->group_fwd_mask = BR_GROUPFWD_DEFAULT;
524
	br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT;
525

526 527 528 529
	br->designated_root = br->bridge_id;
	br->bridge_max_age = br->max_age = 20 * HZ;
	br->bridge_hello_time = br->hello_time = 2 * HZ;
	br->bridge_forward_delay = br->forward_delay = 15 * HZ;
530
	br->bridge_ageing_time = br->ageing_time = BR_DEFAULT_AGEING_TIME;
531
	dev->max_mtu = ETH_MAX_MTU;
532 533 534 535

	br_netfilter_rtable_init(br);
	br_stp_timer_init(br);
	br_multicast_init(br);
536
	INIT_DELAYED_WORK(&br->gc_work, br_fdb_cleanup);
Linus Torvalds's avatar
Linus Torvalds committed
537
}