vlan_dev.c 20.5 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

L
Linus Torvalds 已提交
64 65
		memcpy(veth->h_source, dev->dev_addr, ETH_ALEN);
		break;
66
	}
L
Linus Torvalds 已提交
67 68 69 70

	return 0;
}

71
static inline u16
P
Patrick McHardy 已提交
72
vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb)
L
Linus Torvalds 已提交
73
{
P
Patrick McHardy 已提交
74
	struct vlan_priority_tci_mapping *mp;
L
Linus Torvalds 已提交
75

76
	mp = vlan_dev_priv(dev)->egress_priority_map[(skb->priority & 0xF)];
L
Linus Torvalds 已提交
77 78
	while (mp) {
		if (mp->priority == skb->priority) {
P
Patrick McHardy 已提交
79 80 81
			return mp->vlan_qos; /* This should already be shifted
					      * to mask correctly with the
					      * VLAN's TCI */
L
Linus Torvalds 已提交
82 83 84 85 86 87 88
		}
		mp = mp->next;
	}
	return 0;
}

/*
89
 *	Create the VLAN header for an arbitrary protocol layer
L
Linus Torvalds 已提交
90 91 92 93 94 95 96
 *
 *	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.
 */
97 98 99 100
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 已提交
101 102
{
	struct vlan_hdr *vhdr;
103
	unsigned int vhdrlen = 0;
104
	u16 vlan_tci = 0;
105
	int rc;
L
Linus Torvalds 已提交
106

107
	if (!(vlan_dev_priv(dev)->flags & VLAN_FLAG_REORDER_HDR)) {
L
Linus Torvalds 已提交
108 109
		vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);

110
		vlan_tci = vlan_dev_priv(dev)->vlan_id;
111 112
		vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
		vhdr->h_vlan_TCI = htons(vlan_tci);
L
Linus Torvalds 已提交
113 114

		/*
O
Octavian Purdila 已提交
115 116
		 *  Set the protocol type. For a packet of type ETH_P_802_3/2 we
		 *  put the length in here instead.
L
Linus Torvalds 已提交
117
		 */
O
Octavian Purdila 已提交
118
		if (type != ETH_P_802_3 && type != ETH_P_802_2)
L
Linus Torvalds 已提交
119
			vhdr->h_vlan_encapsulated_proto = htons(type);
P
Patrick McHardy 已提交
120
		else
L
Linus Torvalds 已提交
121
			vhdr->h_vlan_encapsulated_proto = htons(len);
122 123

		skb->protocol = htons(ETH_P_8021Q);
124 125
		type = ETH_P_8021Q;
		vhdrlen = VLAN_HLEN;
L
Linus Torvalds 已提交
126 127 128 129 130 131
	}

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

132
	/* Now make the underlying real hard header */
133
	dev = vlan_dev_priv(dev)->real_dev;
134 135 136
	rc = dev_hard_header(skb, dev, type, daddr, saddr, len + vhdrlen);
	if (rc > 0)
		rc += vhdrlen;
L
Linus Torvalds 已提交
137 138 139
	return rc;
}

140 141
static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
					    struct net_device *dev)
L
Linus Torvalds 已提交
142 143
{
	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
E
Eric Dumazet 已提交
144 145
	unsigned int len;
	int ret;
146

L
Linus Torvalds 已提交
147 148 149 150 151
	/* 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...
	 */
152
	if (veth->h_vlan_proto != htons(ETH_P_8021Q) ||
153
	    vlan_dev_priv(dev)->flags & VLAN_FLAG_REORDER_HDR) {
154
		u16 vlan_tci;
155
		vlan_tci = vlan_dev_priv(dev)->vlan_id;
156
		vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
J
John Fastabend 已提交
157
		skb = __vlan_hwaccel_put_tag(skb, vlan_tci);
L
Linus Torvalds 已提交
158 159
	}

160
	skb_set_dev(skb, vlan_dev_priv(dev)->real_dev);
E
Eric Dumazet 已提交
161
	len = skb->len;
162 163
	if (netpoll_tx_running(dev))
		return skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev);
E
Eric Dumazet 已提交
164 165
	ret = dev_queue_xmit(skb);

166
	if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
E
Eric Dumazet 已提交
167 168
		struct vlan_pcpu_stats *stats;

169
		stats = this_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats);
E
Eric Dumazet 已提交
170 171 172
		u64_stats_update_begin(&stats->syncp);
		stats->tx_packets++;
		stats->tx_bytes += len;
173
		u64_stats_update_end(&stats->syncp);
E
Eric Dumazet 已提交
174
	} else {
175
		this_cpu_inc(vlan_dev_priv(dev)->vlan_pcpu_stats->tx_dropped);
E
Eric Dumazet 已提交
176
	}
E
Eric Dumazet 已提交
177

178
	return ret;
L
Linus Torvalds 已提交
179 180
}

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

	dev->mtu = new_mtu;

	return 0;
}

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

	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 已提交
205 206
}

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

215
	/* See if a priority mapping exists.. */
216
	mp = vlan->egress_priority_map[skb_prio & 0xF];
217 218
	while (mp) {
		if (mp->priority == skb_prio) {
219 220 221 222 223
			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;
224
			return 0;
L
Linus Torvalds 已提交
225
		}
226
		mp = mp->next;
L
Linus Torvalds 已提交
227
	}
228 229

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

	np->next = mp;
	np->priority = skb_prio;
237 238 239 240
	np->vlan_qos = vlan_qos;
	vlan->egress_priority_map[skb_prio & 0xF] = np;
	if (vlan_qos)
		vlan->nr_egress_mappings++;
241
	return 0;
L
Linus Torvalds 已提交
242 243
}

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

250 251
	if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP |
		     VLAN_FLAG_LOOSE_BINDING))
252 253 254
		return -EINVAL;

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

	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);
	}
262
	return 0;
L
Linus Torvalds 已提交
263 264
}

265
void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
L
Linus Torvalds 已提交
266
{
267
	strncpy(result, vlan_dev_priv(dev)->real_dev->name, 23);
L
Linus Torvalds 已提交
268 269
}

270
static int vlan_dev_open(struct net_device *dev)
L
Linus Torvalds 已提交
271
{
272
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
273 274 275
	struct net_device *real_dev = vlan->real_dev;
	int err;

276 277
	if (!(real_dev->flags & IFF_UP) &&
	    !(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
L
Linus Torvalds 已提交
278 279
		return -ENETDOWN;

280
	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) {
281
		err = dev_uc_add(real_dev, dev->dev_addr);
282
		if (err < 0)
283
			goto out;
284 285
	}

286 287 288 289 290 291 292 293 294 295 296 297
	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;
	}

	memcpy(vlan->real_dev_addr, real_dev->dev_addr, ETH_ALEN);
298

P
Patrick McHardy 已提交
299 300 301
	if (vlan->flags & VLAN_FLAG_GVRP)
		vlan_gvrp_request_join(dev);

302 303
	if (netif_carrier_ok(real_dev))
		netif_carrier_on(dev);
L
Linus Torvalds 已提交
304
	return 0;
305 306 307 308 309 310

clear_allmulti:
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(real_dev, -1);
del_unicast:
	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr))
311
		dev_uc_del(real_dev, dev->dev_addr);
312
out:
313
	netif_carrier_off(dev);
314
	return err;
L
Linus Torvalds 已提交
315 316
}

317
static int vlan_dev_stop(struct net_device *dev)
L
Linus Torvalds 已提交
318
{
319
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
P
Patrick McHardy 已提交
320 321
	struct net_device *real_dev = vlan->real_dev;

322
	dev_mc_unsync(real_dev, dev);
323
	dev_uc_unsync(real_dev, dev);
324 325 326 327 328
	if (dev->flags & IFF_ALLMULTI)
		dev_set_allmulti(real_dev, -1);
	if (dev->flags & IFF_PROMISC)
		dev_set_promiscuity(real_dev, -1);

329
	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr))
330
		dev_uc_del(real_dev, dev->dev_addr);
331

332
	netif_carrier_off(dev);
L
Linus Torvalds 已提交
333 334 335
	return 0;
}

336
static int vlan_dev_set_mac_address(struct net_device *dev, void *p)
337
{
338
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
339 340 341 342 343 344 345 346 347 348
	struct sockaddr *addr = p;
	int err;

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

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

	if (compare_ether_addr(addr->sa_data, real_dev->dev_addr)) {
349
		err = dev_uc_add(real_dev, addr->sa_data);
350 351 352 353 354
		if (err < 0)
			return err;
	}

	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr))
355
		dev_uc_del(real_dev, dev->dev_addr);
356 357 358 359 360 361

out:
	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
	return 0;
}

362
static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
L
Linus Torvalds 已提交
363
{
364
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
365
	const struct net_device_ops *ops = real_dev->netdev_ops;
L
Linus Torvalds 已提交
366 367 368 369 370 371
	struct ifreq ifrr;
	int err = -EOPNOTSUPP;

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

P
Patrick McHardy 已提交
372
	switch (cmd) {
L
Linus Torvalds 已提交
373 374 375
	case SIOCGMIIPHY:
	case SIOCGMIIREG:
	case SIOCSMIIREG:
376 377
		if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
			err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
L
Linus Torvalds 已提交
378 379 380
		break;
	}

381
	if (!err)
L
Linus Torvalds 已提交
382 383 384 385 386
		ifr->ifr_ifru = ifrr.ifr_ifru;

	return err;
}

F
Frank Blaschka 已提交
387 388
static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)
{
389
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
F
Frank Blaschka 已提交
390 391 392 393
	const struct net_device_ops *ops = real_dev->netdev_ops;
	int err = 0;

	if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
394
		err = ops->ndo_neigh_setup(real_dev, pa);
F
Frank Blaschka 已提交
395 396 397 398

	return err;
}

399 400 401 402
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
static int vlan_dev_fcoe_ddp_setup(struct net_device *dev, u16 xid,
				   struct scatterlist *sgl, unsigned int sgc)
{
403
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
404 405 406 407 408 409 410 411 412 413 414
	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)
{
415
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
416 417 418 419 420 421 422 423
	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;
}
424 425 426

static int vlan_dev_fcoe_enable(struct net_device *dev)
{
427
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
428 429 430 431 432 433 434 435 436 437
	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)
{
438
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
439 440 441 442 443 444 445
	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;
}
446 447 448

static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
{
449
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
450 451 452 453 454 455 456
	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;
}
457 458 459 460

static int vlan_dev_fcoe_ddp_target(struct net_device *dev, u16 xid,
				    struct scatterlist *sgl, unsigned int sgc)
{
461
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
462 463 464 465 466 467 468 469
	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;
}
470 471
#endif

472
static void vlan_dev_change_rx_flags(struct net_device *dev, int change)
473
{
474
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
475

476 477 478 479 480 481
	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);
	}
482 483
}

484
static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)
L
Linus Torvalds 已提交
485
{
486 487
	dev_mc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
	dev_uc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
L
Linus Torvalds 已提交
488
}
489 490 491 492 493 494 495

/*
 * 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;
496
static struct lock_class_key vlan_netdev_addr_lock_key;
497

498 499 500
static void vlan_dev_set_lockdep_one(struct net_device *dev,
				     struct netdev_queue *txq,
				     void *_subclass)
501 502
{
	lockdep_set_class_and_subclass(&txq->_xmit_lock,
503 504
				       &vlan_netdev_xmit_lock_key,
				       *(int *)_subclass);
505 506 507 508
}

static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass)
{
509 510 511
	lockdep_set_class_and_subclass(&dev->addr_list_lock,
				       &vlan_netdev_addr_lock_key,
				       subclass);
512
	netdev_for_each_tx_queue(dev, vlan_dev_set_lockdep_one, &subclass);
513 514
}

515 516 517 518 519 520
static const struct header_ops vlan_header_ops = {
	.create	 = vlan_dev_hard_header,
	.rebuild = vlan_dev_rebuild_header,
	.parse	 = eth_header_parse,
};

521
static const struct net_device_ops vlan_netdev_ops;
522

523 524
static int vlan_dev_init(struct net_device *dev)
{
525
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
526 527
	int subclass = 0;

528 529
	netif_carrier_off(dev);

530
	/* IFF_BROADCAST|IFF_MULTICAST; ??? */
531 532
	dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
					  IFF_MASTER | IFF_SLAVE);
533 534 535 536 537
	dev->iflink = real_dev->ifindex;
	dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
					  (1<<__LINK_STATE_DORMANT))) |
		      (1<<__LINK_STATE_PRESENT);

538 539 540 541 542
	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;

543
	dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
544
	dev->gso_max_size = real_dev->gso_max_size;
545

546 547 548 549 550 551 552 553
	/* ipv6 shared card related stuff */
	dev->dev_id = real_dev->dev_id;

	if (is_zero_ether_addr(dev->dev_addr))
		memcpy(dev->dev_addr, real_dev->dev_addr, dev->addr_len);
	if (is_zero_ether_addr(dev->broadcast))
		memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len);

554 555 556 557
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
	dev->fcoe_ddp_xid = real_dev->fcoe_ddp_xid;
#endif

558
	dev->needed_headroom = real_dev->needed_headroom;
559 560 561 562 563 564 565 566
	if (real_dev->features & NETIF_F_HW_VLAN_TX) {
		dev->header_ops      = real_dev->header_ops;
		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;
	}

567
	dev->netdev_ops = &vlan_netdev_ops;
J
John Fastabend 已提交
568

J
Joonwoo Park 已提交
569
	if (is_vlan_dev(real_dev))
570 571
		subclass = 1;

572
	vlan_dev_set_lockdep_class(dev, subclass);
E
Eric Dumazet 已提交
573

574 575
	vlan_dev_priv(dev)->vlan_pcpu_stats = alloc_percpu(struct vlan_pcpu_stats);
	if (!vlan_dev_priv(dev)->vlan_pcpu_stats)
E
Eric Dumazet 已提交
576 577
		return -ENOMEM;

578 579 580
	return 0;
}

581 582 583
static void vlan_dev_uninit(struct net_device *dev)
{
	struct vlan_priority_tci_mapping *pm;
584
	struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
585 586
	int i;

E
Eric Dumazet 已提交
587 588
	free_percpu(vlan->vlan_pcpu_stats);
	vlan->vlan_pcpu_stats = NULL;
589 590 591 592 593 594 595 596
	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);
		}
	}
}

597 598
static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
	netdev_features_t features)
599
{
600
	struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
601
	u32 old_features = features;
602

603
	features &= real_dev->vlan_features;
M
Michał Mirosław 已提交
604 605
	features |= NETIF_F_RXCSUM;
	features &= real_dev->features;
606

607
	features |= old_features & NETIF_F_SOFT_FEATURES;
608
	features |= NETIF_F_LLTX;
609 610 611 612

	return features;
}

613 614 615
static int vlan_ethtool_get_settings(struct net_device *dev,
				     struct ethtool_cmd *cmd)
{
616
	const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
617 618

	return __ethtool_get_settings(vlan->real_dev, cmd);
619 620 621 622 623 624 625 626 627 628
}

static void vlan_ethtool_get_drvinfo(struct net_device *dev,
				     struct ethtool_drvinfo *info)
{
	strcpy(info->driver, vlan_fullname);
	strcpy(info->version, vlan_version);
	strcpy(info->fw_version, "N/A");
}

629
static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
E
Eric Dumazet 已提交
630 631
{

632
	if (vlan_dev_priv(dev)->vlan_pcpu_stats) {
E
Eric Dumazet 已提交
633 634
		struct vlan_pcpu_stats *p;
		u32 rx_errors = 0, tx_dropped = 0;
E
Eric Dumazet 已提交
635 636 637
		int i;

		for_each_possible_cpu(i) {
E
Eric Dumazet 已提交
638
			u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes;
E
Eric Dumazet 已提交
639 640
			unsigned int start;

641
			p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
E
Eric Dumazet 已提交
642 643 644 645 646
			do {
				start = u64_stats_fetch_begin_bh(&p->syncp);
				rxpackets	= p->rx_packets;
				rxbytes		= p->rx_bytes;
				rxmulticast	= p->rx_multicast;
E
Eric Dumazet 已提交
647 648
				txpackets	= p->tx_packets;
				txbytes		= p->tx_bytes;
E
Eric Dumazet 已提交
649
			} while (u64_stats_fetch_retry_bh(&p->syncp, start));
E
Eric Dumazet 已提交
650 651 652 653 654 655 656 657 658

			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 已提交
659
		}
E
Eric Dumazet 已提交
660 661
		stats->rx_errors  = rx_errors;
		stats->tx_dropped = tx_dropped;
E
Eric Dumazet 已提交
662 663 664 665
	}
	return stats;
}

666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716
#ifdef CONFIG_NET_POLL_CONTROLLER
void vlan_dev_poll_controller(struct net_device *dev)
{
	return;
}

int vlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo)
{
	struct vlan_dev_priv *info = vlan_dev_priv(dev);
	struct net_device *real_dev = info->real_dev;
	struct netpoll *netpoll;
	int err = 0;

	netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
	err = -ENOMEM;
	if (!netpoll)
		goto out;

	netpoll->dev = real_dev;
	strlcpy(netpoll->dev_name, real_dev->name, IFNAMSIZ);

	err = __netpoll_setup(netpoll);
	if (err) {
		kfree(netpoll);
		goto out;
	}

	info->netpoll = netpoll;

out:
	return err;
}

void vlan_dev_netpoll_cleanup(struct net_device *dev)
{
	struct vlan_dev_priv *info = vlan_dev_priv(dev);
	struct netpoll *netpoll = info->netpoll;

	if (!netpoll)
		return;

	info->netpoll = NULL;

        /* Wait for transmitting packets to finish before freeing. */
        synchronize_rcu_bh();

        __netpoll_cleanup(netpoll);
        kfree(netpoll);
}
#endif /* CONFIG_NET_POLL_CONTROLLER */

P
Patrick McHardy 已提交
717
static const struct ethtool_ops vlan_ethtool_ops = {
718 719
	.get_settings	        = vlan_ethtool_get_settings,
	.get_drvinfo	        = vlan_ethtool_get_drvinfo,
P
Patrick McHardy 已提交
720 721 722
	.get_link		= ethtool_op_get_link,
};

723 724 725 726 727 728
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 已提交
729 730 731 732 733 734 735
	.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 已提交
736
	.ndo_get_stats64	= vlan_dev_get_stats64,
V
Vasu Dev 已提交
737 738 739 740 741 742
#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
	.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,
743
	.ndo_fcoe_ddp_target	= vlan_dev_fcoe_ddp_target,
744 745 746 747 748
#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 已提交
749
#endif
750
	.ndo_fix_features	= vlan_dev_fix_features,
V
Vasu Dev 已提交
751 752
};

753 754 755 756 757
void vlan_setup(struct net_device *dev)
{
	ether_setup(dev);

	dev->priv_flags		|= IFF_802_1Q_VLAN;
758
	dev->priv_flags		&= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
759 760
	dev->tx_queue_len	= 0;

761
	dev->netdev_ops		= &vlan_netdev_ops;
762
	dev->destructor		= free_netdev;
P
Patrick McHardy 已提交
763
	dev->ethtool_ops	= &vlan_ethtool_ops;
764 765 766

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