vlan_dev.c 22.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/* -*- linux-c -*-
 * INET		802.1Q VLAN
 *		Ethernet-type device handling.
 *
 * Authors:	Ben Greear <greearb@candelatech.com>
P
Patrick McHardy 已提交
6
 *              Please send support related email to: netdev@vger.kernel.org
L
Linus Torvalds 已提交
7
 *              VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
8
 *
L
Linus Torvalds 已提交
9 10 11 12 13 14
 * Fixes:       Mar 22 2001: Martin Bokaemper <mbokaemper@unispherenetworks.com>
 *                - reset skb->pkt_type on incoming packets when MAC was changed
 *                - see that changed MAC is saddr for outgoing packets
 *              Oct 20, 2001:  Ard van Breeman:
 *                - Fix MC-list, finally.
 *                - Flush MC-list on VLAN destroy.
15
 *
L
Linus Torvalds 已提交
16 17 18 19 20 21 22
 *
 *		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.
 */

J
Joe Perches 已提交
23 24
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
25
#include <linux/module.h>
26
#include <linux/slab.h>
L
Linus Torvalds 已提交
27 28 29
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
P
Patrick McHardy 已提交
30
#include <linux/ethtool.h>
L
Linus Torvalds 已提交
31 32 33 34 35
#include <net/arp.h>

#include "vlan.h"
#include "vlanproc.h"
#include <linux/if_vlan.h>
36
#include <linux/netpoll.h>
L
Linus Torvalds 已提交
37 38 39 40 41 42 43 44 45 46 47

/*
 *	Rebuild the Ethernet MAC header. This is called after an ARP
 *	(or in future other address resolution) has completed on this
 *	sk_buff. We now let ARP fill in the other fields.
 *
 *	This routine CANNOT use cached dst->neigh!
 *	Really, it is used only when dst->neigh is wrong.
 *
 * TODO:  This needs a checkup, I'm ignorant here. --BLG
 */
48
static int vlan_dev_rebuild_header(struct sk_buff *skb)
L
Linus Torvalds 已提交
49 50 51 52 53 54
{
	struct net_device *dev = skb->dev;
	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);

	switch (veth->h_vlan_encapsulated_proto) {
#ifdef CONFIG_INET
55
	case htons(ETH_P_IP):
L
Linus Torvalds 已提交
56 57 58

		/* TODO:  Confirm this will work with VLAN headers... */
		return arp_find(veth->h_dest, skb);
59
#endif
L
Linus Torvalds 已提交
60
	default:
J
Joe Perches 已提交
61
		pr_debug("%s: unable to resolve type %X addresses\n",
62
			 dev->name, ntohs(veth->h_vlan_encapsulated_proto));
63

J
Joe Perches 已提交
64
		ether_addr_copy(veth->h_source, dev->dev_addr);
L
Linus Torvalds 已提交
65
		break;
66
	}
L
Linus Torvalds 已提交
67 68 69 70 71

	return 0;
}

/*
72
 *	Create the VLAN header for an arbitrary protocol layer
L
Linus Torvalds 已提交
73 74 75 76 77 78 79
 *
 *	saddr=NULL	means use device source address
 *	daddr=NULL	means leave destination address (eg unresolved arp)
 *
 *  This is called when the SKB is moving down the stack towards the
 *  physical devices.
 */
80 81 82 83
static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
				unsigned short type,
				const void *daddr, const void *saddr,
				unsigned int len)
L
Linus Torvalds 已提交
84
{
85
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
L
Linus Torvalds 已提交
86
	struct vlan_hdr *vhdr;
87
	unsigned int vhdrlen = 0;
88
	u16 vlan_tci = 0;
89
	int rc;
L
Linus Torvalds 已提交
90

91
	if (!(vlan->flags & VLAN_FLAG_REORDER_HDR)) {
L
Linus Torvalds 已提交
92 93
		vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);

94
		vlan_tci = vlan->vlan_id;
95
		vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
96
		vhdr->h_vlan_TCI = htons(vlan_tci);
L
Linus Torvalds 已提交
97 98

		/*
O
Octavian Purdila 已提交
99 100
		 *  Set the protocol type. For a packet of type ETH_P_802_3/2 we
		 *  put the length in here instead.
L
Linus Torvalds 已提交
101
		 */
O
Octavian Purdila 已提交
102
		if (type != ETH_P_802_3 && type != ETH_P_802_2)
L
Linus Torvalds 已提交
103
			vhdr->h_vlan_encapsulated_proto = htons(type);
P
Patrick McHardy 已提交
104
		else
L
Linus Torvalds 已提交
105
			vhdr->h_vlan_encapsulated_proto = htons(len);
106

107 108
		skb->protocol = vlan->vlan_proto;
		type = ntohs(vlan->vlan_proto);
109
		vhdrlen = VLAN_HLEN;
L
Linus Torvalds 已提交
110 111 112 113 114 115
	}

	/* Before delegating work to the lower layer, enter our MAC-address */
	if (saddr == NULL)
		saddr = dev->dev_addr;

116
	/* Now make the underlying real hard header */
117
	dev = vlan->real_dev;
118 119 120
	rc = dev_hard_header(skb, dev, type, daddr, saddr, len + vhdrlen);
	if (rc > 0)
		rc += vhdrlen;
L
Linus Torvalds 已提交
121 122 123
	return rc;
}

124 125 126 127 128 129 130 131 132 133 134
static inline netdev_tx_t vlan_netpoll_send_skb(struct vlan_dev_priv *vlan, struct sk_buff *skb)
{
#ifdef CONFIG_NET_POLL_CONTROLLER
	if (vlan->netpoll)
		netpoll_send_skb(vlan->netpoll, skb);
#else
	BUG();
#endif
	return NETDEV_TX_OK;
}

135 136
static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
					    struct net_device *dev)
L
Linus Torvalds 已提交
137
{
138
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
L
Linus Torvalds 已提交
139
	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
E
Eric Dumazet 已提交
140 141
	unsigned int len;
	int ret;
142

L
Linus Torvalds 已提交
143 144 145 146 147
	/* Handle non-VLAN frames if they are sent to us, for example by DHCP.
	 *
	 * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
	 * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
	 */
148
	if (veth->h_vlan_proto != vlan->vlan_proto ||
149
	    vlan->flags & VLAN_FLAG_REORDER_HDR) {
150
		u16 vlan_tci;
151
		vlan_tci = vlan->vlan_id;
152
		vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
153
		skb = __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
L
Linus Torvalds 已提交
154 155
	}

156
	skb->dev = vlan->real_dev;
E
Eric Dumazet 已提交
157
	len = skb->len;
158 159 160
	if (unlikely(netpoll_tx_running(dev)))
		return vlan_netpoll_send_skb(vlan, skb);

E
Eric Dumazet 已提交
161 162
	ret = dev_queue_xmit(skb);

163
	if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
E
Eric Dumazet 已提交
164 165
		struct vlan_pcpu_stats *stats;

166
		stats = this_cpu_ptr(vlan->vlan_pcpu_stats);
E
Eric Dumazet 已提交
167 168 169
		u64_stats_update_begin(&stats->syncp);
		stats->tx_packets++;
		stats->tx_bytes += len;
170
		u64_stats_update_end(&stats->syncp);
E
Eric Dumazet 已提交
171
	} else {
172
		this_cpu_inc(vlan->vlan_pcpu_stats->tx_dropped);
E
Eric Dumazet 已提交
173
	}
E
Eric Dumazet 已提交
174

175
	return ret;
L
Linus Torvalds 已提交
176 177
}

178
static int vlan_dev_change_mtu(struct net_device *dev, int new_mtu)
L
Linus Torvalds 已提交
179 180 181 182
{
	/* TODO: gotta make sure the underlying layer can handle it,
	 * maybe an IFF_VLAN_CAPABLE flag for devices?
	 */
183
	if (vlan_dev_priv(dev)->real_dev->mtu < new_mtu)
L
Linus Torvalds 已提交
184 185 186 187 188 189 190
		return -ERANGE;

	dev->mtu = new_mtu;

	return 0;
}

191
void vlan_dev_set_ingress_priority(const struct net_device *dev,
192
				   u32 skb_prio, u16 vlan_prio)
L
Linus Torvalds 已提交
193
{
194
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
195 196 197 198 199 200 201

	if (vlan->ingress_priority_map[vlan_prio & 0x7] && !skb_prio)
		vlan->nr_ingress_mappings--;
	else if (!vlan->ingress_priority_map[vlan_prio & 0x7] && skb_prio)
		vlan->nr_ingress_mappings++;

	vlan->ingress_priority_map[vlan_prio & 0x7] = skb_prio;
L
Linus Torvalds 已提交
202 203
}

204
int vlan_dev_set_egress_priority(const struct net_device *dev,
205
				 u32 skb_prio, u16 vlan_prio)
L
Linus Torvalds 已提交
206
{
207
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
L
Linus Torvalds 已提交
208 209
	struct vlan_priority_tci_mapping *mp = NULL;
	struct vlan_priority_tci_mapping *np;
E
Eric Dumazet 已提交
210
	u32 vlan_qos = (vlan_prio << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK;
211

212
	/* See if a priority mapping exists.. */
213
	mp = vlan->egress_priority_map[skb_prio & 0xF];
214 215
	while (mp) {
		if (mp->priority == skb_prio) {
216 217 218 219 220
			if (mp->vlan_qos && !vlan_qos)
				vlan->nr_egress_mappings--;
			else if (!mp->vlan_qos && vlan_qos)
				vlan->nr_egress_mappings++;
			mp->vlan_qos = vlan_qos;
221
			return 0;
L
Linus Torvalds 已提交
222
		}
223
		mp = mp->next;
L
Linus Torvalds 已提交
224
	}
225 226

	/* Create a new mapping then. */
227
	mp = vlan->egress_priority_map[skb_prio & 0xF];
228 229 230 231 232 233
	np = kmalloc(sizeof(struct vlan_priority_tci_mapping), GFP_KERNEL);
	if (!np)
		return -ENOBUFS;

	np->next = mp;
	np->priority = skb_prio;
234
	np->vlan_qos = vlan_qos;
235 236
	/* Before inserting this element in hash table, make sure all its fields
	 * are committed to memory.
237
	 * coupled with smp_rmb() in vlan_dev_get_egress_qos_mask()
238 239
	 */
	smp_wmb();
240 241 242
	vlan->egress_priority_map[skb_prio & 0xF] = np;
	if (vlan_qos)
		vlan->nr_egress_mappings++;
243
	return 0;
L
Linus Torvalds 已提交
244 245
}

246
/* Flags are defined in the vlan_flags enum in include/linux/if_vlan.h file. */
247
int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask)
L
Linus Torvalds 已提交
248
{
249
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
250 251
	u32 old_flags = vlan->flags;

252
	if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP |
253
		     VLAN_FLAG_LOOSE_BINDING | VLAN_FLAG_MVRP))
254 255 256
		return -EINVAL;

	vlan->flags = (old_flags & ~mask) | (flags & mask);
P
Patrick McHardy 已提交
257 258 259 260 261 262 263

	if (netif_running(dev) && (vlan->flags ^ old_flags) & VLAN_FLAG_GVRP) {
		if (vlan->flags & VLAN_FLAG_GVRP)
			vlan_gvrp_request_join(dev);
		else
			vlan_gvrp_request_leave(dev);
	}
264 265 266 267 268 269 270

	if (netif_running(dev) && (vlan->flags ^ old_flags) & VLAN_FLAG_MVRP) {
		if (vlan->flags & VLAN_FLAG_MVRP)
			vlan_mvrp_request_join(dev);
		else
			vlan_mvrp_request_leave(dev);
	}
271
	return 0;
L
Linus Torvalds 已提交
272 273
}

274
void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
L
Linus Torvalds 已提交
275
{
276
	strncpy(result, vlan_dev_priv(dev)->real_dev->name, 23);
L
Linus Torvalds 已提交
277 278
}

279
static int vlan_dev_open(struct net_device *dev)
L
Linus Torvalds 已提交
280
{
281
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
282 283 284
	struct net_device *real_dev = vlan->real_dev;
	int err;

285 286
	if (!(real_dev->flags & IFF_UP) &&
	    !(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
L
Linus Torvalds 已提交
287 288
		return -ENETDOWN;

289
	if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr)) {
290
		err = dev_uc_add(real_dev, dev->dev_addr);
291
		if (err < 0)
292
			goto out;
293 294
	}

295 296 297 298 299 300 301 302 303 304 305
	if (dev->flags & IFF_ALLMULTI) {
		err = dev_set_allmulti(real_dev, 1);
		if (err < 0)
			goto del_unicast;
	}
	if (dev->flags & IFF_PROMISC) {
		err = dev_set_promiscuity(real_dev, 1);
		if (err < 0)
			goto clear_allmulti;
	}

J
Joe Perches 已提交
306
	ether_addr_copy(vlan->real_dev_addr, real_dev->dev_addr);
307

P
Patrick McHardy 已提交
308 309 310
	if (vlan->flags & VLAN_FLAG_GVRP)
		vlan_gvrp_request_join(dev);

311 312 313
	if (vlan->flags & VLAN_FLAG_MVRP)
		vlan_mvrp_request_join(dev);

314 315
	if (netif_carrier_ok(real_dev))
		netif_carrier_on(dev);
L
Linus Torvalds 已提交
316
	return 0;
317 318 319 320 321

clear_allmulti:
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(real_dev, -1);
del_unicast:
322
	if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
323
		dev_uc_del(real_dev, dev->dev_addr);
324
out:
325
	netif_carrier_off(dev);
326
	return err;
L
Linus Torvalds 已提交
327 328
}

329
static int vlan_dev_stop(struct net_device *dev)
L
Linus Torvalds 已提交
330
{
331
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
P
Patrick McHardy 已提交
332 333
	struct net_device *real_dev = vlan->real_dev;

334
	dev_mc_unsync(real_dev, dev);
335
	dev_uc_unsync(real_dev, dev);
336 337 338 339 340
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(real_dev, -1);
	if (dev->flags & IFF_PROMISC)
		dev_set_promiscuity(real_dev, -1);

341
	if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
342
		dev_uc_del(real_dev, dev->dev_addr);
343

344
	netif_carrier_off(dev);
L
Linus Torvalds 已提交
345 346 347
	return 0;
}

348
static int vlan_dev_set_mac_address(struct net_device *dev, void *p)
349
{
350
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
351 352 353 354 355 356 357 358 359
	struct sockaddr *addr = p;
	int err;

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

	if (!(dev->flags & IFF_UP))
		goto out;

360
	if (!ether_addr_equal(addr->sa_data, real_dev->dev_addr)) {
361
		err = dev_uc_add(real_dev, addr->sa_data);
362 363 364 365
		if (err < 0)
			return err;
	}

366
	if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
367
		dev_uc_del(real_dev, dev->dev_addr);
368 369

out:
J
Joe Perches 已提交
370
	ether_addr_copy(dev->dev_addr, addr->sa_data);
371 372 373
	return 0;
}

374
static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
L
Linus Torvalds 已提交
375
{
376
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
377
	const struct net_device_ops *ops = real_dev->netdev_ops;
L
Linus Torvalds 已提交
378 379 380 381 382 383
	struct ifreq ifrr;
	int err = -EOPNOTSUPP;

	strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
	ifrr.ifr_ifru = ifr->ifr_ifru;

P
Patrick McHardy 已提交
384
	switch (cmd) {
L
Linus Torvalds 已提交
385 386 387
	case SIOCGMIIPHY:
	case SIOCGMIIREG:
	case SIOCSMIIREG:
388 389
		if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
			err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
L
Linus Torvalds 已提交
390 391 392
		break;
	}

393
	if (!err)
L
Linus Torvalds 已提交
394 395 396 397 398
		ifr->ifr_ifru = ifrr.ifr_ifru;

	return err;
}

F
Frank Blaschka 已提交
399 400
static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)
{
401
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
F
Frank Blaschka 已提交
402 403 404 405
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int err = 0;

	if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
406
		err = ops->ndo_neigh_setup(real_dev, pa);
F
Frank Blaschka 已提交
407 408 409 410

	return err;
}

A
Amerigo Wang 已提交
411
#if IS_ENABLED(CONFIG_FCOE)
412 413 414
static int vlan_dev_fcoe_ddp_setup(struct net_device *dev, u16 xid,
				   struct scatterlist *sgl, unsigned int sgc)
{
415
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
416 417 418 419 420 421 422 423 424 425 426
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int rc = 0;

	if (ops->ndo_fcoe_ddp_setup)
		rc = ops->ndo_fcoe_ddp_setup(real_dev, xid, sgl, sgc);

	return rc;
}

static int vlan_dev_fcoe_ddp_done(struct net_device *dev, u16 xid)
{
427
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
428 429 430 431 432 433 434 435
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int len = 0;

	if (ops->ndo_fcoe_ddp_done)
		len = ops->ndo_fcoe_ddp_done(real_dev, xid);

	return len;
}
436 437 438

static int vlan_dev_fcoe_enable(struct net_device *dev)
{
439
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
440 441 442 443 444 445 446 447 448 449
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int rc = -EINVAL;

	if (ops->ndo_fcoe_enable)
		rc = ops->ndo_fcoe_enable(real_dev);
	return rc;
}

static int vlan_dev_fcoe_disable(struct net_device *dev)
{
450
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
451 452 453 454 455 456 457
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int rc = -EINVAL;

	if (ops->ndo_fcoe_disable)
		rc = ops->ndo_fcoe_disable(real_dev);
	return rc;
}
458 459 460

static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
{
461
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
462 463 464 465 466 467 468
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int rc = -EINVAL;

	if (ops->ndo_fcoe_get_wwn)
		rc = ops->ndo_fcoe_get_wwn(real_dev, wwn, type);
	return rc;
}
469 470 471 472

static int vlan_dev_fcoe_ddp_target(struct net_device *dev, u16 xid,
				    struct scatterlist *sgl, unsigned int sgc)
{
473
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
474 475 476 477 478 479 480 481
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int rc = 0;

	if (ops->ndo_fcoe_ddp_target)
		rc = ops->ndo_fcoe_ddp_target(real_dev, xid, sgl, sgc);

	return rc;
}
482 483
#endif

484
static void vlan_dev_change_rx_flags(struct net_device *dev, int change)
485
{
486
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
487

488 489 490 491 492 493
	if (dev->flags & IFF_UP) {
		if (change & IFF_ALLMULTI)
			dev_set_allmulti(real_dev, dev->flags & IFF_ALLMULTI ? 1 : -1);
		if (change & IFF_PROMISC)
			dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1);
	}
494 495
}

496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533
static int vlan_calculate_locking_subclass(struct net_device *real_dev)
{
	int subclass = 0;

	while (is_vlan_dev(real_dev)) {
		subclass++;
		real_dev = vlan_dev_priv(real_dev)->real_dev;
	}

	return subclass;
}

static void vlan_dev_mc_sync(struct net_device *to, struct net_device *from)
{
	int err = 0, subclass;

	subclass = vlan_calculate_locking_subclass(to);

	spin_lock_nested(&to->addr_list_lock, subclass);
	err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len);
	if (!err)
		__dev_set_rx_mode(to);
	spin_unlock(&to->addr_list_lock);
}

static void vlan_dev_uc_sync(struct net_device *to, struct net_device *from)
{
	int err = 0, subclass;

	subclass = vlan_calculate_locking_subclass(to);

	spin_lock_nested(&to->addr_list_lock, subclass);
	err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
	if (!err)
		__dev_set_rx_mode(to);
	spin_unlock(&to->addr_list_lock);
}

534
static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)
L
Linus Torvalds 已提交
535
{
536 537
	vlan_dev_mc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
	vlan_dev_uc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
L
Linus Torvalds 已提交
538
}
539 540 541 542 543 544 545

/*
 * vlan network devices have devices nesting below it, and are a special
 * "super class" of normal network devices; split their locks off into a
 * separate class since they always nest.
 */
static struct lock_class_key vlan_netdev_xmit_lock_key;
546
static struct lock_class_key vlan_netdev_addr_lock_key;
547

548 549 550
static void vlan_dev_set_lockdep_one(struct net_device *dev,
				     struct netdev_queue *txq,
				     void *_subclass)
551 552
{
	lockdep_set_class_and_subclass(&txq->_xmit_lock,
553 554
				       &vlan_netdev_xmit_lock_key,
				       *(int *)_subclass);
555 556 557 558
}

static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass)
{
559 560 561
	lockdep_set_class_and_subclass(&dev->addr_list_lock,
				       &vlan_netdev_addr_lock_key,
				       subclass);
562
	netdev_for_each_tx_queue(dev, vlan_dev_set_lockdep_one, &subclass);
563 564
}

565 566 567 568 569 570
static const struct header_ops vlan_header_ops = {
	.create	 = vlan_dev_hard_header,
	.rebuild = vlan_dev_rebuild_header,
	.parse	 = eth_header_parse,
};

571 572 573 574 575 576 577 578
static int vlan_passthru_hard_header(struct sk_buff *skb, struct net_device *dev,
				     unsigned short type,
				     const void *daddr, const void *saddr,
				     unsigned int len)
{
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
	struct net_device *real_dev = vlan->real_dev;

579 580 581
	if (saddr == NULL)
		saddr = dev->dev_addr;

582 583 584 585 586 587 588 589 590
	return dev_hard_header(skb, real_dev, type, daddr, saddr, len);
}

static const struct header_ops vlan_passthru_header_ops = {
	.create	 = vlan_passthru_hard_header,
	.rebuild = dev_rebuild_header,
	.parse	 = eth_header_parse,
};

591 592 593 594
static struct device_type vlan_type = {
	.name	= "vlan",
};

595
static const struct net_device_ops vlan_netdev_ops;
596

597 598
static int vlan_dev_init(struct net_device *dev)
{
599
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
600
	int subclass = 0;
601

602 603
	netif_carrier_off(dev);

604
	/* IFF_BROADCAST|IFF_MULTICAST; ??? */
605 606
	dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
					  IFF_MASTER | IFF_SLAVE);
607 608 609 610 611
	dev->iflink = real_dev->ifindex;
	dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
					  (1<<__LINK_STATE_DORMANT))) |
		      (1<<__LINK_STATE_PRESENT);

612 613 614 615 616
	dev->hw_features = NETIF_F_ALL_CSUM | NETIF_F_SG |
			   NETIF_F_FRAGLIST | NETIF_F_ALL_TSO |
			   NETIF_F_HIGHDMA | NETIF_F_SCTP_CSUM |
			   NETIF_F_ALL_FCOE;

617
	dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
618
	dev->gso_max_size = real_dev->gso_max_size;
619 620 621
	if (dev->features & NETIF_F_VLAN_FEATURES)
		netdev_warn(real_dev, "VLAN features are set incorrectly.  Q-in-Q configurations may not work correctly.\n");

622

623 624 625 626
	/* ipv6 shared card related stuff */
	dev->dev_id = real_dev->dev_id;

	if (is_zero_ether_addr(dev->dev_addr))
627
		eth_hw_addr_inherit(dev, real_dev);
628 629 630
	if (is_zero_ether_addr(dev->broadcast))
		memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len);

A
Amerigo Wang 已提交
631
#if IS_ENABLED(CONFIG_FCOE)
632 633 634
	dev->fcoe_ddp_xid = real_dev->fcoe_ddp_xid;
#endif

635
	dev->needed_headroom = real_dev->needed_headroom;
636 637
	if (vlan_hw_offload_capable(real_dev->features,
				    vlan_dev_priv(dev)->vlan_proto)) {
638
		dev->header_ops      = &vlan_passthru_header_ops;
639 640 641 642 643 644
		dev->hard_header_len = real_dev->hard_header_len;
	} else {
		dev->header_ops      = &vlan_header_ops;
		dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
	}

645
	dev->netdev_ops = &vlan_netdev_ops;
J
John Fastabend 已提交
646

647 648
	SET_NETDEV_DEVTYPE(dev, &vlan_type);

649
	subclass = vlan_calculate_locking_subclass(dev);
650
	vlan_dev_set_lockdep_class(dev, subclass);
E
Eric Dumazet 已提交
651

652
	vlan_dev_priv(dev)->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
653
	if (!vlan_dev_priv(dev)->vlan_pcpu_stats)
E
Eric Dumazet 已提交
654 655
		return -ENOMEM;

656 657 658
	return 0;
}

659 660 661
static void vlan_dev_uninit(struct net_device *dev)
{
	struct vlan_priority_tci_mapping *pm;
662
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
663 664
	int i;

E
Eric Dumazet 已提交
665 666
	free_percpu(vlan->vlan_pcpu_stats);
	vlan->vlan_pcpu_stats = NULL;
667 668 669 670 671 672 673 674
	for (i = 0; i < ARRAY_SIZE(vlan->egress_priority_map); i++) {
		while ((pm = vlan->egress_priority_map[i]) != NULL) {
			vlan->egress_priority_map[i] = pm->next;
			kfree(pm);
		}
	}
}

675 676
static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
	netdev_features_t features)
677
{
678
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
679
	netdev_features_t old_features = features;
680

681
	features = netdev_intersect_features(features, real_dev->vlan_features);
M
Michał Mirosław 已提交
682
	features |= NETIF_F_RXCSUM;
683
	features = netdev_intersect_features(features, real_dev->features);
684

685
	features |= old_features & NETIF_F_SOFT_FEATURES;
686
	features |= NETIF_F_LLTX;
687 688 689 690

	return features;
}

691 692 693
static int vlan_ethtool_get_settings(struct net_device *dev,
				     struct ethtool_cmd *cmd)
{
694
	const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
695 696

	return __ethtool_get_settings(vlan->real_dev, cmd);
697 698 699 700 701
}

static void vlan_ethtool_get_drvinfo(struct net_device *dev,
				     struct ethtool_drvinfo *info)
{
702 703 704
	strlcpy(info->driver, vlan_fullname, sizeof(info->driver));
	strlcpy(info->version, vlan_version, sizeof(info->version));
	strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
705 706
}

707
static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
E
Eric Dumazet 已提交
708
{
709 710 711
	struct vlan_pcpu_stats *p;
	u32 rx_errors = 0, tx_dropped = 0;
	int i;
E
Eric Dumazet 已提交
712

713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
	for_each_possible_cpu(i) {
		u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes;
		unsigned int start;

		p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
		do {
			start = u64_stats_fetch_begin_irq(&p->syncp);
			rxpackets	= p->rx_packets;
			rxbytes		= p->rx_bytes;
			rxmulticast	= p->rx_multicast;
			txpackets	= p->tx_packets;
			txbytes		= p->tx_bytes;
		} while (u64_stats_fetch_retry_irq(&p->syncp, start));

		stats->rx_packets	+= rxpackets;
		stats->rx_bytes		+= rxbytes;
		stats->multicast	+= rxmulticast;
		stats->tx_packets	+= txpackets;
		stats->tx_bytes		+= txbytes;
		/* rx_errors & tx_dropped are u32 */
		rx_errors	+= p->rx_errors;
		tx_dropped	+= p->tx_dropped;
E
Eric Dumazet 已提交
735
	}
736 737 738
	stats->rx_errors  = rx_errors;
	stats->tx_dropped = tx_dropped;

E
Eric Dumazet 已提交
739 740 741
	return stats;
}

742
#ifdef CONFIG_NET_POLL_CONTROLLER
E
Eric Dumazet 已提交
743
static void vlan_dev_poll_controller(struct net_device *dev)
744 745 746 747
{
	return;
}

748
static int vlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo)
749
{
750 751
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
	struct net_device *real_dev = vlan->real_dev;
752 753 754
	struct netpoll *netpoll;
	int err = 0;

755
	netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
756 757 758 759
	err = -ENOMEM;
	if (!netpoll)
		goto out;

760
	err = __netpoll_setup(netpoll, real_dev);
761 762 763 764 765
	if (err) {
		kfree(netpoll);
		goto out;
	}

766
	vlan->netpoll = netpoll;
767 768 769 770 771

out:
	return err;
}

E
Eric Dumazet 已提交
772
static void vlan_dev_netpoll_cleanup(struct net_device *dev)
773
{
774 775
	struct vlan_dev_priv *vlan= vlan_dev_priv(dev);
	struct netpoll *netpoll = vlan->netpoll;
776 777 778 779

	if (!netpoll)
		return;

780
	vlan->netpoll = NULL;
781

782
	__netpoll_free_async(netpoll);
783 784 785
}
#endif /* CONFIG_NET_POLL_CONTROLLER */

P
Patrick McHardy 已提交
786
static const struct ethtool_ops vlan_ethtool_ops = {
787 788
	.get_settings	        = vlan_ethtool_get_settings,
	.get_drvinfo	        = vlan_ethtool_get_drvinfo,
P
Patrick McHardy 已提交
789 790 791
	.get_link		= ethtool_op_get_link,
};

792 793 794 795 796 797
static const struct net_device_ops vlan_netdev_ops = {
	.ndo_change_mtu		= vlan_dev_change_mtu,
	.ndo_init		= vlan_dev_init,
	.ndo_uninit		= vlan_dev_uninit,
	.ndo_open		= vlan_dev_open,
	.ndo_stop		= vlan_dev_stop,
V
Vasu Dev 已提交
798 799 800 801 802 803 804
	.ndo_start_xmit =  vlan_dev_hard_start_xmit,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_set_mac_address	= vlan_dev_set_mac_address,
	.ndo_set_rx_mode	= vlan_dev_set_rx_mode,
	.ndo_change_rx_flags	= vlan_dev_change_rx_flags,
	.ndo_do_ioctl		= vlan_dev_ioctl,
	.ndo_neigh_setup	= vlan_dev_neigh_setup,
E
Eric Dumazet 已提交
805
	.ndo_get_stats64	= vlan_dev_get_stats64,
A
Amerigo Wang 已提交
806
#if IS_ENABLED(CONFIG_FCOE)
V
Vasu Dev 已提交
807 808 809 810 811
	.ndo_fcoe_ddp_setup	= vlan_dev_fcoe_ddp_setup,
	.ndo_fcoe_ddp_done	= vlan_dev_fcoe_ddp_done,
	.ndo_fcoe_enable	= vlan_dev_fcoe_enable,
	.ndo_fcoe_disable	= vlan_dev_fcoe_disable,
	.ndo_fcoe_get_wwn	= vlan_dev_fcoe_get_wwn,
812
	.ndo_fcoe_ddp_target	= vlan_dev_fcoe_ddp_target,
813 814 815 816 817
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= vlan_dev_poll_controller,
	.ndo_netpoll_setup	= vlan_dev_netpoll_setup,
	.ndo_netpoll_cleanup	= vlan_dev_netpoll_cleanup,
V
Vasu Dev 已提交
818
#endif
819
	.ndo_fix_features	= vlan_dev_fix_features,
V
Vasu Dev 已提交
820 821
};

822 823 824 825 826
void vlan_setup(struct net_device *dev)
{
	ether_setup(dev);

	dev->priv_flags		|= IFF_802_1Q_VLAN;
827
	dev->priv_flags		&= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
828 829
	dev->tx_queue_len	= 0;

830
	dev->netdev_ops		= &vlan_netdev_ops;
831
	dev->destructor		= free_netdev;
P
Patrick McHardy 已提交
832
	dev->ethtool_ops	= &vlan_ethtool_ops;
833 834 835

	memset(dev->broadcast, 0, ETH_ALEN);
}