xref: /linux/net/8021q/vlan_dev.c (revision 12871a0bd67dd4db4418e1daafcd46e9d329ef10)
1 /* -*- linux-c -*-
2  * INET		802.1Q VLAN
3  *		Ethernet-type device handling.
4  *
5  * Authors:	Ben Greear <greearb@candelatech.com>
6  *              Please send support related email to: netdev@vger.kernel.org
7  *              VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
8  *
9  * Fixes:       Mar 22 2001: Martin Bokaemper <mbokaemper@unispherenetworks.com>
10  *                - reset skb->pkt_type on incoming packets when MAC was changed
11  *                - see that changed MAC is saddr for outgoing packets
12  *              Oct 20, 2001:  Ard van Breeman:
13  *                - Fix MC-list, finally.
14  *                - Flush MC-list on VLAN destroy.
15  *
16  *
17  *		This program is free software; you can redistribute it and/or
18  *		modify it under the terms of the GNU General Public License
19  *		as published by the Free Software Foundation; either version
20  *		2 of the License, or (at your option) any later version.
21  */
22 
23 #include <linux/module.h>
24 #include <linux/slab.h>
25 #include <linux/skbuff.h>
26 #include <linux/netdevice.h>
27 #include <linux/etherdevice.h>
28 #include <linux/ethtool.h>
29 #include <net/arp.h>
30 
31 #include "vlan.h"
32 #include "vlanproc.h"
33 #include <linux/if_vlan.h>
34 
35 /*
36  *	Rebuild the Ethernet MAC header. This is called after an ARP
37  *	(or in future other address resolution) has completed on this
38  *	sk_buff. We now let ARP fill in the other fields.
39  *
40  *	This routine CANNOT use cached dst->neigh!
41  *	Really, it is used only when dst->neigh is wrong.
42  *
43  * TODO:  This needs a checkup, I'm ignorant here. --BLG
44  */
45 static int vlan_dev_rebuild_header(struct sk_buff *skb)
46 {
47 	struct net_device *dev = skb->dev;
48 	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
49 
50 	switch (veth->h_vlan_encapsulated_proto) {
51 #ifdef CONFIG_INET
52 	case htons(ETH_P_IP):
53 
54 		/* TODO:  Confirm this will work with VLAN headers... */
55 		return arp_find(veth->h_dest, skb);
56 #endif
57 	default:
58 		pr_debug("%s: unable to resolve type %X addresses.\n",
59 			 dev->name, ntohs(veth->h_vlan_encapsulated_proto));
60 
61 		memcpy(veth->h_source, dev->dev_addr, ETH_ALEN);
62 		break;
63 	}
64 
65 	return 0;
66 }
67 
68 static inline u16
69 vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb)
70 {
71 	struct vlan_priority_tci_mapping *mp;
72 
73 	mp = vlan_dev_info(dev)->egress_priority_map[(skb->priority & 0xF)];
74 	while (mp) {
75 		if (mp->priority == skb->priority) {
76 			return mp->vlan_qos; /* This should already be shifted
77 					      * to mask correctly with the
78 					      * VLAN's TCI */
79 		}
80 		mp = mp->next;
81 	}
82 	return 0;
83 }
84 
85 /*
86  *	Create the VLAN header for an arbitrary protocol layer
87  *
88  *	saddr=NULL	means use device source address
89  *	daddr=NULL	means leave destination address (eg unresolved arp)
90  *
91  *  This is called when the SKB is moving down the stack towards the
92  *  physical devices.
93  */
94 static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
95 				unsigned short type,
96 				const void *daddr, const void *saddr,
97 				unsigned int len)
98 {
99 	struct vlan_hdr *vhdr;
100 	unsigned int vhdrlen = 0;
101 	u16 vlan_tci = 0;
102 	int rc;
103 
104 	if (!(vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR)) {
105 		vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);
106 
107 		vlan_tci = vlan_dev_info(dev)->vlan_id;
108 		vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
109 		vhdr->h_vlan_TCI = htons(vlan_tci);
110 
111 		/*
112 		 *  Set the protocol type. For a packet of type ETH_P_802_3/2 we
113 		 *  put the length in here instead.
114 		 */
115 		if (type != ETH_P_802_3 && type != ETH_P_802_2)
116 			vhdr->h_vlan_encapsulated_proto = htons(type);
117 		else
118 			vhdr->h_vlan_encapsulated_proto = htons(len);
119 
120 		skb->protocol = htons(ETH_P_8021Q);
121 		type = ETH_P_8021Q;
122 		vhdrlen = VLAN_HLEN;
123 	}
124 
125 	/* Before delegating work to the lower layer, enter our MAC-address */
126 	if (saddr == NULL)
127 		saddr = dev->dev_addr;
128 
129 	/* Now make the underlying real hard header */
130 	dev = vlan_dev_info(dev)->real_dev;
131 	rc = dev_hard_header(skb, dev, type, daddr, saddr, len + vhdrlen);
132 	if (rc > 0)
133 		rc += vhdrlen;
134 	return rc;
135 }
136 
137 static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
138 					    struct net_device *dev)
139 {
140 	struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
141 	unsigned int len;
142 	int ret;
143 
144 	/* Handle non-VLAN frames if they are sent to us, for example by DHCP.
145 	 *
146 	 * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
147 	 * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
148 	 */
149 	if (veth->h_vlan_proto != htons(ETH_P_8021Q) ||
150 	    vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR) {
151 		u16 vlan_tci;
152 		vlan_tci = vlan_dev_info(dev)->vlan_id;
153 		vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
154 		skb = __vlan_hwaccel_put_tag(skb, vlan_tci);
155 	}
156 
157 	skb_set_dev(skb, vlan_dev_info(dev)->real_dev);
158 	len = skb->len;
159 	ret = dev_queue_xmit(skb);
160 
161 	if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
162 		struct vlan_pcpu_stats *stats;
163 
164 		stats = this_cpu_ptr(vlan_dev_info(dev)->vlan_pcpu_stats);
165 		u64_stats_update_begin(&stats->syncp);
166 		stats->tx_packets++;
167 		stats->tx_bytes += len;
168 		u64_stats_update_end(&stats->syncp);
169 	} else {
170 		this_cpu_inc(vlan_dev_info(dev)->vlan_pcpu_stats->tx_dropped);
171 	}
172 
173 	return ret;
174 }
175 
176 static int vlan_dev_change_mtu(struct net_device *dev, int new_mtu)
177 {
178 	/* TODO: gotta make sure the underlying layer can handle it,
179 	 * maybe an IFF_VLAN_CAPABLE flag for devices?
180 	 */
181 	if (vlan_dev_info(dev)->real_dev->mtu < new_mtu)
182 		return -ERANGE;
183 
184 	dev->mtu = new_mtu;
185 
186 	return 0;
187 }
188 
189 void vlan_dev_set_ingress_priority(const struct net_device *dev,
190 				   u32 skb_prio, u16 vlan_prio)
191 {
192 	struct vlan_dev_info *vlan = vlan_dev_info(dev);
193 
194 	if (vlan->ingress_priority_map[vlan_prio & 0x7] && !skb_prio)
195 		vlan->nr_ingress_mappings--;
196 	else if (!vlan->ingress_priority_map[vlan_prio & 0x7] && skb_prio)
197 		vlan->nr_ingress_mappings++;
198 
199 	vlan->ingress_priority_map[vlan_prio & 0x7] = skb_prio;
200 }
201 
202 int vlan_dev_set_egress_priority(const struct net_device *dev,
203 				 u32 skb_prio, u16 vlan_prio)
204 {
205 	struct vlan_dev_info *vlan = vlan_dev_info(dev);
206 	struct vlan_priority_tci_mapping *mp = NULL;
207 	struct vlan_priority_tci_mapping *np;
208 	u32 vlan_qos = (vlan_prio << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK;
209 
210 	/* See if a priority mapping exists.. */
211 	mp = vlan->egress_priority_map[skb_prio & 0xF];
212 	while (mp) {
213 		if (mp->priority == skb_prio) {
214 			if (mp->vlan_qos && !vlan_qos)
215 				vlan->nr_egress_mappings--;
216 			else if (!mp->vlan_qos && vlan_qos)
217 				vlan->nr_egress_mappings++;
218 			mp->vlan_qos = vlan_qos;
219 			return 0;
220 		}
221 		mp = mp->next;
222 	}
223 
224 	/* Create a new mapping then. */
225 	mp = vlan->egress_priority_map[skb_prio & 0xF];
226 	np = kmalloc(sizeof(struct vlan_priority_tci_mapping), GFP_KERNEL);
227 	if (!np)
228 		return -ENOBUFS;
229 
230 	np->next = mp;
231 	np->priority = skb_prio;
232 	np->vlan_qos = vlan_qos;
233 	vlan->egress_priority_map[skb_prio & 0xF] = np;
234 	if (vlan_qos)
235 		vlan->nr_egress_mappings++;
236 	return 0;
237 }
238 
239 /* Flags are defined in the vlan_flags enum in include/linux/if_vlan.h file. */
240 int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask)
241 {
242 	struct vlan_dev_info *vlan = vlan_dev_info(dev);
243 	u32 old_flags = vlan->flags;
244 
245 	if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP |
246 		     VLAN_FLAG_LOOSE_BINDING))
247 		return -EINVAL;
248 
249 	vlan->flags = (old_flags & ~mask) | (flags & mask);
250 
251 	if (netif_running(dev) && (vlan->flags ^ old_flags) & VLAN_FLAG_GVRP) {
252 		if (vlan->flags & VLAN_FLAG_GVRP)
253 			vlan_gvrp_request_join(dev);
254 		else
255 			vlan_gvrp_request_leave(dev);
256 	}
257 	return 0;
258 }
259 
260 void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
261 {
262 	strncpy(result, vlan_dev_info(dev)->real_dev->name, 23);
263 }
264 
265 static int vlan_dev_open(struct net_device *dev)
266 {
267 	struct vlan_dev_info *vlan = vlan_dev_info(dev);
268 	struct net_device *real_dev = vlan->real_dev;
269 	int err;
270 
271 	if (!(real_dev->flags & IFF_UP) &&
272 	    !(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
273 		return -ENETDOWN;
274 
275 	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) {
276 		err = dev_uc_add(real_dev, dev->dev_addr);
277 		if (err < 0)
278 			goto out;
279 	}
280 
281 	if (dev->flags & IFF_ALLMULTI) {
282 		err = dev_set_allmulti(real_dev, 1);
283 		if (err < 0)
284 			goto del_unicast;
285 	}
286 	if (dev->flags & IFF_PROMISC) {
287 		err = dev_set_promiscuity(real_dev, 1);
288 		if (err < 0)
289 			goto clear_allmulti;
290 	}
291 
292 	memcpy(vlan->real_dev_addr, real_dev->dev_addr, ETH_ALEN);
293 
294 	if (vlan->flags & VLAN_FLAG_GVRP)
295 		vlan_gvrp_request_join(dev);
296 
297 	if (netif_carrier_ok(real_dev))
298 		netif_carrier_on(dev);
299 	return 0;
300 
301 clear_allmulti:
302 	if (dev->flags & IFF_ALLMULTI)
303 		dev_set_allmulti(real_dev, -1);
304 del_unicast:
305 	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr))
306 		dev_uc_del(real_dev, dev->dev_addr);
307 out:
308 	netif_carrier_off(dev);
309 	return err;
310 }
311 
312 static int vlan_dev_stop(struct net_device *dev)
313 {
314 	struct vlan_dev_info *vlan = vlan_dev_info(dev);
315 	struct net_device *real_dev = vlan->real_dev;
316 
317 	dev_mc_unsync(real_dev, dev);
318 	dev_uc_unsync(real_dev, dev);
319 	if (dev->flags & IFF_ALLMULTI)
320 		dev_set_allmulti(real_dev, -1);
321 	if (dev->flags & IFF_PROMISC)
322 		dev_set_promiscuity(real_dev, -1);
323 
324 	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr))
325 		dev_uc_del(real_dev, dev->dev_addr);
326 
327 	netif_carrier_off(dev);
328 	return 0;
329 }
330 
331 static int vlan_dev_set_mac_address(struct net_device *dev, void *p)
332 {
333 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
334 	struct sockaddr *addr = p;
335 	int err;
336 
337 	if (!is_valid_ether_addr(addr->sa_data))
338 		return -EADDRNOTAVAIL;
339 
340 	if (!(dev->flags & IFF_UP))
341 		goto out;
342 
343 	if (compare_ether_addr(addr->sa_data, real_dev->dev_addr)) {
344 		err = dev_uc_add(real_dev, addr->sa_data);
345 		if (err < 0)
346 			return err;
347 	}
348 
349 	if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr))
350 		dev_uc_del(real_dev, dev->dev_addr);
351 
352 out:
353 	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
354 	return 0;
355 }
356 
357 static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
358 {
359 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
360 	const struct net_device_ops *ops = real_dev->netdev_ops;
361 	struct ifreq ifrr;
362 	int err = -EOPNOTSUPP;
363 
364 	strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
365 	ifrr.ifr_ifru = ifr->ifr_ifru;
366 
367 	switch (cmd) {
368 	case SIOCGMIIPHY:
369 	case SIOCGMIIREG:
370 	case SIOCSMIIREG:
371 		if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
372 			err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
373 		break;
374 	}
375 
376 	if (!err)
377 		ifr->ifr_ifru = ifrr.ifr_ifru;
378 
379 	return err;
380 }
381 
382 static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)
383 {
384 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
385 	const struct net_device_ops *ops = real_dev->netdev_ops;
386 	int err = 0;
387 
388 	if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
389 		err = ops->ndo_neigh_setup(real_dev, pa);
390 
391 	return err;
392 }
393 
394 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
395 static int vlan_dev_fcoe_ddp_setup(struct net_device *dev, u16 xid,
396 				   struct scatterlist *sgl, unsigned int sgc)
397 {
398 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
399 	const struct net_device_ops *ops = real_dev->netdev_ops;
400 	int rc = 0;
401 
402 	if (ops->ndo_fcoe_ddp_setup)
403 		rc = ops->ndo_fcoe_ddp_setup(real_dev, xid, sgl, sgc);
404 
405 	return rc;
406 }
407 
408 static int vlan_dev_fcoe_ddp_done(struct net_device *dev, u16 xid)
409 {
410 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
411 	const struct net_device_ops *ops = real_dev->netdev_ops;
412 	int len = 0;
413 
414 	if (ops->ndo_fcoe_ddp_done)
415 		len = ops->ndo_fcoe_ddp_done(real_dev, xid);
416 
417 	return len;
418 }
419 
420 static int vlan_dev_fcoe_enable(struct net_device *dev)
421 {
422 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
423 	const struct net_device_ops *ops = real_dev->netdev_ops;
424 	int rc = -EINVAL;
425 
426 	if (ops->ndo_fcoe_enable)
427 		rc = ops->ndo_fcoe_enable(real_dev);
428 	return rc;
429 }
430 
431 static int vlan_dev_fcoe_disable(struct net_device *dev)
432 {
433 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
434 	const struct net_device_ops *ops = real_dev->netdev_ops;
435 	int rc = -EINVAL;
436 
437 	if (ops->ndo_fcoe_disable)
438 		rc = ops->ndo_fcoe_disable(real_dev);
439 	return rc;
440 }
441 
442 static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
443 {
444 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
445 	const struct net_device_ops *ops = real_dev->netdev_ops;
446 	int rc = -EINVAL;
447 
448 	if (ops->ndo_fcoe_get_wwn)
449 		rc = ops->ndo_fcoe_get_wwn(real_dev, wwn, type);
450 	return rc;
451 }
452 
453 static int vlan_dev_fcoe_ddp_target(struct net_device *dev, u16 xid,
454 				    struct scatterlist *sgl, unsigned int sgc)
455 {
456 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
457 	const struct net_device_ops *ops = real_dev->netdev_ops;
458 	int rc = 0;
459 
460 	if (ops->ndo_fcoe_ddp_target)
461 		rc = ops->ndo_fcoe_ddp_target(real_dev, xid, sgl, sgc);
462 
463 	return rc;
464 }
465 #endif
466 
467 static void vlan_dev_change_rx_flags(struct net_device *dev, int change)
468 {
469 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
470 
471 	if (change & IFF_ALLMULTI)
472 		dev_set_allmulti(real_dev, dev->flags & IFF_ALLMULTI ? 1 : -1);
473 	if (change & IFF_PROMISC)
474 		dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1);
475 }
476 
477 static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)
478 {
479 	dev_mc_sync(vlan_dev_info(vlan_dev)->real_dev, vlan_dev);
480 	dev_uc_sync(vlan_dev_info(vlan_dev)->real_dev, vlan_dev);
481 }
482 
483 /*
484  * vlan network devices have devices nesting below it, and are a special
485  * "super class" of normal network devices; split their locks off into a
486  * separate class since they always nest.
487  */
488 static struct lock_class_key vlan_netdev_xmit_lock_key;
489 static struct lock_class_key vlan_netdev_addr_lock_key;
490 
491 static void vlan_dev_set_lockdep_one(struct net_device *dev,
492 				     struct netdev_queue *txq,
493 				     void *_subclass)
494 {
495 	lockdep_set_class_and_subclass(&txq->_xmit_lock,
496 				       &vlan_netdev_xmit_lock_key,
497 				       *(int *)_subclass);
498 }
499 
500 static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass)
501 {
502 	lockdep_set_class_and_subclass(&dev->addr_list_lock,
503 				       &vlan_netdev_addr_lock_key,
504 				       subclass);
505 	netdev_for_each_tx_queue(dev, vlan_dev_set_lockdep_one, &subclass);
506 }
507 
508 static const struct header_ops vlan_header_ops = {
509 	.create	 = vlan_dev_hard_header,
510 	.rebuild = vlan_dev_rebuild_header,
511 	.parse	 = eth_header_parse,
512 };
513 
514 static const struct net_device_ops vlan_netdev_ops;
515 
516 static int vlan_dev_init(struct net_device *dev)
517 {
518 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
519 	int subclass = 0;
520 
521 	netif_carrier_off(dev);
522 
523 	/* IFF_BROADCAST|IFF_MULTICAST; ??? */
524 	dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
525 					  IFF_MASTER | IFF_SLAVE);
526 	dev->iflink = real_dev->ifindex;
527 	dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
528 					  (1<<__LINK_STATE_DORMANT))) |
529 		      (1<<__LINK_STATE_PRESENT);
530 
531 	dev->hw_features = NETIF_F_ALL_TX_OFFLOADS;
532 	dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
533 	dev->gso_max_size = real_dev->gso_max_size;
534 
535 	/* ipv6 shared card related stuff */
536 	dev->dev_id = real_dev->dev_id;
537 
538 	if (is_zero_ether_addr(dev->dev_addr))
539 		memcpy(dev->dev_addr, real_dev->dev_addr, dev->addr_len);
540 	if (is_zero_ether_addr(dev->broadcast))
541 		memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len);
542 
543 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
544 	dev->fcoe_ddp_xid = real_dev->fcoe_ddp_xid;
545 #endif
546 
547 	dev->needed_headroom = real_dev->needed_headroom;
548 	if (real_dev->features & NETIF_F_HW_VLAN_TX) {
549 		dev->header_ops      = real_dev->header_ops;
550 		dev->hard_header_len = real_dev->hard_header_len;
551 	} else {
552 		dev->header_ops      = &vlan_header_ops;
553 		dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
554 	}
555 
556 	dev->netdev_ops = &vlan_netdev_ops;
557 
558 	if (is_vlan_dev(real_dev))
559 		subclass = 1;
560 
561 	vlan_dev_set_lockdep_class(dev, subclass);
562 
563 	vlan_dev_info(dev)->vlan_pcpu_stats = alloc_percpu(struct vlan_pcpu_stats);
564 	if (!vlan_dev_info(dev)->vlan_pcpu_stats)
565 		return -ENOMEM;
566 
567 	return 0;
568 }
569 
570 static void vlan_dev_uninit(struct net_device *dev)
571 {
572 	struct vlan_priority_tci_mapping *pm;
573 	struct vlan_dev_info *vlan = vlan_dev_info(dev);
574 	int i;
575 
576 	free_percpu(vlan->vlan_pcpu_stats);
577 	vlan->vlan_pcpu_stats = NULL;
578 	for (i = 0; i < ARRAY_SIZE(vlan->egress_priority_map); i++) {
579 		while ((pm = vlan->egress_priority_map[i]) != NULL) {
580 			vlan->egress_priority_map[i] = pm->next;
581 			kfree(pm);
582 		}
583 	}
584 }
585 
586 static u32 vlan_dev_fix_features(struct net_device *dev, u32 features)
587 {
588 	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
589 
590 	features &= real_dev->features;
591 	features &= real_dev->vlan_features;
592 	if (dev_ethtool_get_rx_csum(real_dev))
593 		features |= NETIF_F_RXCSUM;
594 	features |= NETIF_F_LLTX;
595 
596 	return features;
597 }
598 
599 static int vlan_ethtool_get_settings(struct net_device *dev,
600 				     struct ethtool_cmd *cmd)
601 {
602 	const struct vlan_dev_info *vlan = vlan_dev_info(dev);
603 	return dev_ethtool_get_settings(vlan->real_dev, cmd);
604 }
605 
606 static void vlan_ethtool_get_drvinfo(struct net_device *dev,
607 				     struct ethtool_drvinfo *info)
608 {
609 	strcpy(info->driver, vlan_fullname);
610 	strcpy(info->version, vlan_version);
611 	strcpy(info->fw_version, "N/A");
612 }
613 
614 static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
615 {
616 
617 	if (vlan_dev_info(dev)->vlan_pcpu_stats) {
618 		struct vlan_pcpu_stats *p;
619 		u32 rx_errors = 0, tx_dropped = 0;
620 		int i;
621 
622 		for_each_possible_cpu(i) {
623 			u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes;
624 			unsigned int start;
625 
626 			p = per_cpu_ptr(vlan_dev_info(dev)->vlan_pcpu_stats, i);
627 			do {
628 				start = u64_stats_fetch_begin_bh(&p->syncp);
629 				rxpackets	= p->rx_packets;
630 				rxbytes		= p->rx_bytes;
631 				rxmulticast	= p->rx_multicast;
632 				txpackets	= p->tx_packets;
633 				txbytes		= p->tx_bytes;
634 			} while (u64_stats_fetch_retry_bh(&p->syncp, start));
635 
636 			stats->rx_packets	+= rxpackets;
637 			stats->rx_bytes		+= rxbytes;
638 			stats->multicast	+= rxmulticast;
639 			stats->tx_packets	+= txpackets;
640 			stats->tx_bytes		+= txbytes;
641 			/* rx_errors & tx_dropped are u32 */
642 			rx_errors	+= p->rx_errors;
643 			tx_dropped	+= p->tx_dropped;
644 		}
645 		stats->rx_errors  = rx_errors;
646 		stats->tx_dropped = tx_dropped;
647 	}
648 	return stats;
649 }
650 
651 static const struct ethtool_ops vlan_ethtool_ops = {
652 	.get_settings	        = vlan_ethtool_get_settings,
653 	.get_drvinfo	        = vlan_ethtool_get_drvinfo,
654 	.get_link		= ethtool_op_get_link,
655 };
656 
657 static const struct net_device_ops vlan_netdev_ops = {
658 	.ndo_change_mtu		= vlan_dev_change_mtu,
659 	.ndo_init		= vlan_dev_init,
660 	.ndo_uninit		= vlan_dev_uninit,
661 	.ndo_open		= vlan_dev_open,
662 	.ndo_stop		= vlan_dev_stop,
663 	.ndo_start_xmit =  vlan_dev_hard_start_xmit,
664 	.ndo_validate_addr	= eth_validate_addr,
665 	.ndo_set_mac_address	= vlan_dev_set_mac_address,
666 	.ndo_set_rx_mode	= vlan_dev_set_rx_mode,
667 	.ndo_set_multicast_list	= vlan_dev_set_rx_mode,
668 	.ndo_change_rx_flags	= vlan_dev_change_rx_flags,
669 	.ndo_do_ioctl		= vlan_dev_ioctl,
670 	.ndo_neigh_setup	= vlan_dev_neigh_setup,
671 	.ndo_get_stats64	= vlan_dev_get_stats64,
672 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
673 	.ndo_fcoe_ddp_setup	= vlan_dev_fcoe_ddp_setup,
674 	.ndo_fcoe_ddp_done	= vlan_dev_fcoe_ddp_done,
675 	.ndo_fcoe_enable	= vlan_dev_fcoe_enable,
676 	.ndo_fcoe_disable	= vlan_dev_fcoe_disable,
677 	.ndo_fcoe_get_wwn	= vlan_dev_fcoe_get_wwn,
678 	.ndo_fcoe_ddp_target	= vlan_dev_fcoe_ddp_target,
679 #endif
680 	.ndo_fix_features	= vlan_dev_fix_features,
681 };
682 
683 void vlan_setup(struct net_device *dev)
684 {
685 	ether_setup(dev);
686 
687 	dev->priv_flags		|= IFF_802_1Q_VLAN;
688 	dev->priv_flags		&= ~IFF_XMIT_DST_RELEASE;
689 	dev->tx_queue_len	= 0;
690 
691 	dev->netdev_ops		= &vlan_netdev_ops;
692 	dev->destructor		= free_netdev;
693 	dev->ethtool_ops	= &vlan_ethtool_ops;
694 
695 	memset(dev->broadcast, 0, ETH_ALEN);
696 }
697