Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later
2 : : /* -*- linux-c -*-
3 : : * INET 802.1Q VLAN
4 : : * Ethernet-type device handling.
5 : : *
6 : : * Authors: Ben Greear <greearb@candelatech.com>
7 : : * Please send support related email to: netdev@vger.kernel.org
8 : : * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
9 : : *
10 : : * Fixes: Mar 22 2001: Martin Bokaemper <mbokaemper@unispherenetworks.com>
11 : : * - reset skb->pkt_type on incoming packets when MAC was changed
12 : : * - see that changed MAC is saddr for outgoing packets
13 : : * Oct 20, 2001: Ard van Breeman:
14 : : * - Fix MC-list, finally.
15 : : * - Flush MC-list on VLAN destroy.
16 : : */
17 : :
18 : : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 : :
20 : : #include <linux/module.h>
21 : : #include <linux/slab.h>
22 : : #include <linux/skbuff.h>
23 : : #include <linux/netdevice.h>
24 : : #include <linux/net_tstamp.h>
25 : : #include <linux/etherdevice.h>
26 : : #include <linux/ethtool.h>
27 : : #include <linux/phy.h>
28 : : #include <net/arp.h>
29 : :
30 : : #include "vlan.h"
31 : : #include "vlanproc.h"
32 : : #include <linux/if_vlan.h>
33 : : #include <linux/netpoll.h>
34 : :
35 : : /*
36 : : * Create the VLAN header for an arbitrary protocol layer
37 : : *
38 : : * saddr=NULL means use device source address
39 : : * daddr=NULL means leave destination address (eg unresolved arp)
40 : : *
41 : : * This is called when the SKB is moving down the stack towards the
42 : : * physical devices.
43 : : */
44 : 0 : static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
45 : : unsigned short type,
46 : : const void *daddr, const void *saddr,
47 : : unsigned int len)
48 : : {
49 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
50 : : struct vlan_hdr *vhdr;
51 : : unsigned int vhdrlen = 0;
52 : : u16 vlan_tci = 0;
53 : : int rc;
54 : :
55 [ # # ]: 0 : if (!(vlan->flags & VLAN_FLAG_REORDER_HDR)) {
56 : 0 : vhdr = skb_push(skb, VLAN_HLEN);
57 : :
58 : 0 : vlan_tci = vlan->vlan_id;
59 : 0 : vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
60 : 0 : vhdr->h_vlan_TCI = htons(vlan_tci);
61 : :
62 : : /*
63 : : * Set the protocol type. For a packet of type ETH_P_802_3/2 we
64 : : * put the length in here instead.
65 : : */
66 [ # # ]: 0 : if (type != ETH_P_802_3 && type != ETH_P_802_2)
67 : 0 : vhdr->h_vlan_encapsulated_proto = htons(type);
68 : : else
69 : 0 : vhdr->h_vlan_encapsulated_proto = htons(len);
70 : :
71 : 0 : skb->protocol = vlan->vlan_proto;
72 : 0 : type = ntohs(vlan->vlan_proto);
73 : : vhdrlen = VLAN_HLEN;
74 : : }
75 : :
76 : : /* Before delegating work to the lower layer, enter our MAC-address */
77 [ # # ]: 0 : if (saddr == NULL)
78 : 0 : saddr = dev->dev_addr;
79 : :
80 : : /* Now make the underlying real hard header */
81 : 0 : dev = vlan->real_dev;
82 : 0 : rc = dev_hard_header(skb, dev, type, daddr, saddr, len + vhdrlen);
83 [ # # ]: 0 : if (rc > 0)
84 : 0 : rc += vhdrlen;
85 : 0 : return rc;
86 : : }
87 : :
88 : : static inline netdev_tx_t vlan_netpoll_send_skb(struct vlan_dev_priv *vlan, struct sk_buff *skb)
89 : : {
90 : : #ifdef CONFIG_NET_POLL_CONTROLLER
91 [ # # ]: 0 : if (vlan->netpoll)
92 : 0 : netpoll_send_skb(vlan->netpoll, skb);
93 : : #else
94 : : BUG();
95 : : #endif
96 : : return NETDEV_TX_OK;
97 : : }
98 : :
99 : 0 : static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
100 : : struct net_device *dev)
101 : : {
102 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
103 : 0 : struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
104 : : unsigned int len;
105 : : int ret;
106 : :
107 : : /* Handle non-VLAN frames if they are sent to us, for example by DHCP.
108 : : *
109 : : * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
110 : : * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
111 : : */
112 [ # # # # ]: 0 : if (veth->h_vlan_proto != vlan->vlan_proto ||
113 : 0 : vlan->flags & VLAN_FLAG_REORDER_HDR) {
114 : : u16 vlan_tci;
115 : 0 : vlan_tci = vlan->vlan_id;
116 : 0 : vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
117 : 0 : __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
118 : : }
119 : :
120 : 0 : skb->dev = vlan->real_dev;
121 : 0 : len = skb->len;
122 [ # # ]: 0 : if (unlikely(netpoll_tx_running(dev)))
123 : : return vlan_netpoll_send_skb(vlan, skb);
124 : :
125 : 0 : ret = dev_queue_xmit(skb);
126 : :
127 [ # # ]: 0 : if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
128 : : struct vlan_pcpu_stats *stats;
129 : :
130 : 0 : stats = this_cpu_ptr(vlan->vlan_pcpu_stats);
131 : : u64_stats_update_begin(&stats->syncp);
132 : 0 : stats->tx_packets++;
133 : 0 : stats->tx_bytes += len;
134 : : u64_stats_update_end(&stats->syncp);
135 : : } else {
136 : 0 : this_cpu_inc(vlan->vlan_pcpu_stats->tx_dropped);
137 : : }
138 : :
139 : 0 : return ret;
140 : : }
141 : :
142 : 0 : static int vlan_dev_change_mtu(struct net_device *dev, int new_mtu)
143 : : {
144 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
145 : 0 : unsigned int max_mtu = real_dev->mtu;
146 : :
147 [ # # ]: 0 : if (netif_reduces_vlan_mtu(real_dev))
148 : 0 : max_mtu -= VLAN_HLEN;
149 [ # # ]: 0 : if (max_mtu < new_mtu)
150 : : return -ERANGE;
151 : :
152 : 0 : dev->mtu = new_mtu;
153 : :
154 : 0 : return 0;
155 : : }
156 : :
157 : 0 : void vlan_dev_set_ingress_priority(const struct net_device *dev,
158 : : u32 skb_prio, u16 vlan_prio)
159 : : {
160 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
161 : :
162 [ # # # # ]: 0 : if (vlan->ingress_priority_map[vlan_prio & 0x7] && !skb_prio)
163 : 0 : vlan->nr_ingress_mappings--;
164 [ # # # # ]: 0 : else if (!vlan->ingress_priority_map[vlan_prio & 0x7] && skb_prio)
165 : 0 : vlan->nr_ingress_mappings++;
166 : :
167 : 0 : vlan->ingress_priority_map[vlan_prio & 0x7] = skb_prio;
168 : 0 : }
169 : :
170 : 0 : int vlan_dev_set_egress_priority(const struct net_device *dev,
171 : : u32 skb_prio, u16 vlan_prio)
172 : : {
173 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
174 : : struct vlan_priority_tci_mapping *mp = NULL;
175 : : struct vlan_priority_tci_mapping *np;
176 : 0 : u32 vlan_qos = (vlan_prio << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK;
177 : :
178 : : /* See if a priority mapping exists.. */
179 : 0 : mp = vlan->egress_priority_map[skb_prio & 0xF];
180 [ # # ]: 0 : while (mp) {
181 [ # # ]: 0 : if (mp->priority == skb_prio) {
182 [ # # # # ]: 0 : if (mp->vlan_qos && !vlan_qos)
183 : 0 : vlan->nr_egress_mappings--;
184 [ # # # # ]: 0 : else if (!mp->vlan_qos && vlan_qos)
185 : 0 : vlan->nr_egress_mappings++;
186 : 0 : mp->vlan_qos = vlan_qos;
187 : 0 : return 0;
188 : : }
189 : 0 : mp = mp->next;
190 : : }
191 : :
192 : : /* Create a new mapping then. */
193 : : mp = vlan->egress_priority_map[skb_prio & 0xF];
194 : : np = kmalloc(sizeof(struct vlan_priority_tci_mapping), GFP_KERNEL);
195 [ # # ]: 0 : if (!np)
196 : : return -ENOBUFS;
197 : :
198 : 0 : np->next = mp;
199 : 0 : np->priority = skb_prio;
200 : 0 : np->vlan_qos = vlan_qos;
201 : : /* Before inserting this element in hash table, make sure all its fields
202 : : * are committed to memory.
203 : : * coupled with smp_rmb() in vlan_dev_get_egress_qos_mask()
204 : : */
205 : 0 : smp_wmb();
206 : 0 : vlan->egress_priority_map[skb_prio & 0xF] = np;
207 [ # # ]: 0 : if (vlan_qos)
208 : 0 : vlan->nr_egress_mappings++;
209 : : return 0;
210 : : }
211 : :
212 : : /* Flags are defined in the vlan_flags enum in
213 : : * include/uapi/linux/if_vlan.h file.
214 : : */
215 : 0 : int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask)
216 : : {
217 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
218 : 0 : u32 old_flags = vlan->flags;
219 : :
220 [ # # ]: 0 : if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP |
221 : : VLAN_FLAG_LOOSE_BINDING | VLAN_FLAG_MVRP |
222 : : VLAN_FLAG_BRIDGE_BINDING))
223 : : return -EINVAL;
224 : :
225 : 0 : vlan->flags = (old_flags & ~mask) | (flags & mask);
226 : :
227 [ # # # # ]: 0 : if (netif_running(dev) && (vlan->flags ^ old_flags) & VLAN_FLAG_GVRP) {
228 [ # # ]: 0 : if (vlan->flags & VLAN_FLAG_GVRP)
229 : 0 : vlan_gvrp_request_join(dev);
230 : : else
231 : 0 : vlan_gvrp_request_leave(dev);
232 : : }
233 : :
234 : : if (netif_running(dev) && (vlan->flags ^ old_flags) & VLAN_FLAG_MVRP) {
235 : : if (vlan->flags & VLAN_FLAG_MVRP)
236 : : vlan_mvrp_request_join(dev);
237 : : else
238 : : vlan_mvrp_request_leave(dev);
239 : : }
240 : : return 0;
241 : : }
242 : :
243 : 0 : void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
244 : : {
245 : 0 : strncpy(result, vlan_dev_priv(dev)->real_dev->name, 23);
246 : 0 : }
247 : :
248 : 0 : bool vlan_dev_inherit_address(struct net_device *dev,
249 : : struct net_device *real_dev)
250 : : {
251 [ # # ]: 0 : if (dev->addr_assign_type != NET_ADDR_STOLEN)
252 : : return false;
253 : :
254 : 0 : ether_addr_copy(dev->dev_addr, real_dev->dev_addr);
255 : 0 : call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
256 : 0 : return true;
257 : : }
258 : :
259 : 0 : static int vlan_dev_open(struct net_device *dev)
260 : : {
261 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
262 : 0 : struct net_device *real_dev = vlan->real_dev;
263 : : int err;
264 : :
265 [ # # # # ]: 0 : if (!(real_dev->flags & IFF_UP) &&
266 : 0 : !(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
267 : : return -ENETDOWN;
268 : :
269 [ # # # # ]: 0 : if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr) &&
270 : 0 : !vlan_dev_inherit_address(dev, real_dev)) {
271 : 0 : err = dev_uc_add(real_dev, dev->dev_addr);
272 [ # # ]: 0 : if (err < 0)
273 : : goto out;
274 : : }
275 : :
276 [ # # ]: 0 : if (dev->flags & IFF_ALLMULTI) {
277 : 0 : err = dev_set_allmulti(real_dev, 1);
278 [ # # ]: 0 : if (err < 0)
279 : : goto del_unicast;
280 : : }
281 [ # # ]: 0 : if (dev->flags & IFF_PROMISC) {
282 : 0 : err = dev_set_promiscuity(real_dev, 1);
283 [ # # ]: 0 : if (err < 0)
284 : : goto clear_allmulti;
285 : : }
286 : :
287 : 0 : ether_addr_copy(vlan->real_dev_addr, real_dev->dev_addr);
288 : :
289 [ # # ]: 0 : if (vlan->flags & VLAN_FLAG_GVRP)
290 : 0 : vlan_gvrp_request_join(dev);
291 : :
292 : 0 : if (vlan->flags & VLAN_FLAG_MVRP)
293 : : vlan_mvrp_request_join(dev);
294 : :
295 [ # # # # ]: 0 : if (netif_carrier_ok(real_dev) &&
296 : 0 : !(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
297 : 0 : netif_carrier_on(dev);
298 : : return 0;
299 : :
300 : : clear_allmulti:
301 [ # # ]: 0 : if (dev->flags & IFF_ALLMULTI)
302 : 0 : dev_set_allmulti(real_dev, -1);
303 : : del_unicast:
304 [ # # ]: 0 : if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
305 : 0 : dev_uc_del(real_dev, dev->dev_addr);
306 : : out:
307 : 0 : netif_carrier_off(dev);
308 : 0 : return err;
309 : : }
310 : :
311 : 0 : static int vlan_dev_stop(struct net_device *dev)
312 : : {
313 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
314 : 0 : struct net_device *real_dev = vlan->real_dev;
315 : :
316 : 0 : dev_mc_unsync(real_dev, dev);
317 : 0 : dev_uc_unsync(real_dev, dev);
318 [ # # ]: 0 : if (dev->flags & IFF_ALLMULTI)
319 : 0 : dev_set_allmulti(real_dev, -1);
320 [ # # ]: 0 : if (dev->flags & IFF_PROMISC)
321 : 0 : dev_set_promiscuity(real_dev, -1);
322 : :
323 [ # # ]: 0 : if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
324 : 0 : dev_uc_del(real_dev, dev->dev_addr);
325 : :
326 [ # # ]: 0 : if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
327 : 0 : netif_carrier_off(dev);
328 : 0 : return 0;
329 : : }
330 : :
331 : 0 : static int vlan_dev_set_mac_address(struct net_device *dev, void *p)
332 : : {
333 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
334 : : struct sockaddr *addr = p;
335 : : int err;
336 : :
337 [ # # ]: 0 : if (!is_valid_ether_addr(addr->sa_data))
338 : : return -EADDRNOTAVAIL;
339 : :
340 [ # # ]: 0 : if (!(dev->flags & IFF_UP))
341 : : goto out;
342 : :
343 [ # # ]: 0 : if (!ether_addr_equal(addr->sa_data, real_dev->dev_addr)) {
344 : 0 : err = dev_uc_add(real_dev, addr->sa_data);
345 [ # # ]: 0 : if (err < 0)
346 : : return err;
347 : : }
348 : :
349 [ # # ]: 0 : if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
350 : 0 : dev_uc_del(real_dev, dev->dev_addr);
351 : :
352 : : out:
353 : 0 : ether_addr_copy(dev->dev_addr, addr->sa_data);
354 : 0 : return 0;
355 : : }
356 : :
357 : 0 : static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
358 : : {
359 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
360 : 0 : const struct net_device_ops *ops = real_dev->netdev_ops;
361 : : struct ifreq ifrr;
362 : : int err = -EOPNOTSUPP;
363 : :
364 : 0 : strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
365 : 0 : ifrr.ifr_ifru = ifr->ifr_ifru;
366 : :
367 [ # # # ]: 0 : switch (cmd) {
368 : : case SIOCSHWTSTAMP:
369 [ # # ]: 0 : if (!net_eq(dev_net(dev), &init_net))
370 : : break;
371 : : /* fall through */
372 : : case SIOCGMIIPHY:
373 : : case SIOCGMIIREG:
374 : : case SIOCSMIIREG:
375 : : case SIOCGHWTSTAMP:
376 [ # # # # ]: 0 : if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
377 : 0 : err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
378 : : break;
379 : : }
380 : :
381 [ # # ]: 0 : if (!err)
382 : 0 : ifr->ifr_ifru = ifrr.ifr_ifru;
383 : :
384 : 0 : return err;
385 : : }
386 : :
387 : 0 : static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)
388 : : {
389 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
390 : 0 : const struct net_device_ops *ops = real_dev->netdev_ops;
391 : : int err = 0;
392 : :
393 [ # # # # ]: 0 : if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
394 : 0 : err = ops->ndo_neigh_setup(real_dev, pa);
395 : :
396 : 0 : return err;
397 : : }
398 : :
399 : : #if IS_ENABLED(CONFIG_FCOE)
400 : : static int vlan_dev_fcoe_ddp_setup(struct net_device *dev, u16 xid,
401 : : struct scatterlist *sgl, unsigned int sgc)
402 : : {
403 : : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
404 : : const struct net_device_ops *ops = real_dev->netdev_ops;
405 : : int rc = 0;
406 : :
407 : : if (ops->ndo_fcoe_ddp_setup)
408 : : rc = ops->ndo_fcoe_ddp_setup(real_dev, xid, sgl, sgc);
409 : :
410 : : return rc;
411 : : }
412 : :
413 : : static int vlan_dev_fcoe_ddp_done(struct net_device *dev, u16 xid)
414 : : {
415 : : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
416 : : const struct net_device_ops *ops = real_dev->netdev_ops;
417 : : int len = 0;
418 : :
419 : : if (ops->ndo_fcoe_ddp_done)
420 : : len = ops->ndo_fcoe_ddp_done(real_dev, xid);
421 : :
422 : : return len;
423 : : }
424 : :
425 : : static int vlan_dev_fcoe_enable(struct net_device *dev)
426 : : {
427 : : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
428 : : const struct net_device_ops *ops = real_dev->netdev_ops;
429 : : int rc = -EINVAL;
430 : :
431 : : if (ops->ndo_fcoe_enable)
432 : : rc = ops->ndo_fcoe_enable(real_dev);
433 : : return rc;
434 : : }
435 : :
436 : : static int vlan_dev_fcoe_disable(struct net_device *dev)
437 : : {
438 : : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
439 : : const struct net_device_ops *ops = real_dev->netdev_ops;
440 : : int rc = -EINVAL;
441 : :
442 : : if (ops->ndo_fcoe_disable)
443 : : rc = ops->ndo_fcoe_disable(real_dev);
444 : : return rc;
445 : : }
446 : :
447 : : static int vlan_dev_fcoe_ddp_target(struct net_device *dev, u16 xid,
448 : : struct scatterlist *sgl, unsigned int sgc)
449 : : {
450 : : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
451 : : const struct net_device_ops *ops = real_dev->netdev_ops;
452 : : int rc = 0;
453 : :
454 : : if (ops->ndo_fcoe_ddp_target)
455 : : rc = ops->ndo_fcoe_ddp_target(real_dev, xid, sgl, sgc);
456 : :
457 : : return rc;
458 : : }
459 : : #endif
460 : :
461 : : #ifdef NETDEV_FCOE_WWNN
462 : : static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
463 : : {
464 : : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
465 : : const struct net_device_ops *ops = real_dev->netdev_ops;
466 : : int rc = -EINVAL;
467 : :
468 : : if (ops->ndo_fcoe_get_wwn)
469 : : rc = ops->ndo_fcoe_get_wwn(real_dev, wwn, type);
470 : : return rc;
471 : : }
472 : : #endif
473 : :
474 : 0 : static void vlan_dev_change_rx_flags(struct net_device *dev, int change)
475 : : {
476 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
477 : :
478 [ # # ]: 0 : if (dev->flags & IFF_UP) {
479 [ # # ]: 0 : if (change & IFF_ALLMULTI)
480 [ # # ]: 0 : dev_set_allmulti(real_dev, dev->flags & IFF_ALLMULTI ? 1 : -1);
481 [ # # ]: 0 : if (change & IFF_PROMISC)
482 [ # # ]: 0 : dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1);
483 : : }
484 : 0 : }
485 : :
486 : 0 : static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)
487 : : {
488 : 0 : dev_mc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
489 : 0 : dev_uc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
490 : 0 : }
491 : :
492 : : static const struct header_ops vlan_header_ops = {
493 : : .create = vlan_dev_hard_header,
494 : : .parse = eth_header_parse,
495 : : };
496 : :
497 : 0 : static int vlan_passthru_hard_header(struct sk_buff *skb, struct net_device *dev,
498 : : unsigned short type,
499 : : const void *daddr, const void *saddr,
500 : : unsigned int len)
501 : : {
502 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
503 : 0 : struct net_device *real_dev = vlan->real_dev;
504 : :
505 [ # # ]: 0 : if (saddr == NULL)
506 : 0 : saddr = dev->dev_addr;
507 : :
508 : 0 : return dev_hard_header(skb, real_dev, type, daddr, saddr, len);
509 : : }
510 : :
511 : : static const struct header_ops vlan_passthru_header_ops = {
512 : : .create = vlan_passthru_hard_header,
513 : : .parse = eth_header_parse,
514 : : };
515 : :
516 : : static struct device_type vlan_type = {
517 : : .name = "vlan",
518 : : };
519 : :
520 : : static const struct net_device_ops vlan_netdev_ops;
521 : :
522 : 0 : static int vlan_dev_init(struct net_device *dev)
523 : : {
524 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
525 : 0 : struct net_device *real_dev = vlan->real_dev;
526 : :
527 : 0 : netif_carrier_off(dev);
528 : :
529 : : /* IFF_BROADCAST|IFF_MULTICAST; ??? */
530 : 0 : dev->flags = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
531 : : IFF_MASTER | IFF_SLAVE);
532 : 0 : dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
533 : 0 : (1<<__LINK_STATE_DORMANT))) |
534 : : (1<<__LINK_STATE_PRESENT);
535 : :
536 [ # # ]: 0 : if (vlan->flags & VLAN_FLAG_BRIDGE_BINDING)
537 : 0 : dev->state |= (1 << __LINK_STATE_NOCARRIER);
538 : :
539 : 0 : dev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG |
540 : : NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE |
541 : : NETIF_F_GSO_ENCAP_ALL |
542 : : NETIF_F_HIGHDMA | NETIF_F_SCTP_CRC |
543 : : NETIF_F_ALL_FCOE;
544 : :
545 : 0 : dev->features |= dev->hw_features | NETIF_F_LLTX;
546 : 0 : dev->gso_max_size = real_dev->gso_max_size;
547 : 0 : dev->gso_max_segs = real_dev->gso_max_segs;
548 [ # # ]: 0 : if (dev->features & NETIF_F_VLAN_FEATURES)
549 : 0 : netdev_warn(real_dev, "VLAN features are set incorrectly. Q-in-Q configurations may not work correctly.\n");
550 : :
551 : 0 : dev->vlan_features = real_dev->vlan_features & ~NETIF_F_ALL_FCOE;
552 : 0 : dev->hw_enc_features = vlan_tnl_features(real_dev);
553 : 0 : dev->mpls_features = real_dev->mpls_features;
554 : :
555 : : /* ipv6 shared card related stuff */
556 : 0 : dev->dev_id = real_dev->dev_id;
557 : :
558 [ # # ]: 0 : if (is_zero_ether_addr(dev->dev_addr)) {
559 : 0 : ether_addr_copy(dev->dev_addr, real_dev->dev_addr);
560 : 0 : dev->addr_assign_type = NET_ADDR_STOLEN;
561 : : }
562 [ # # ]: 0 : if (is_zero_ether_addr(dev->broadcast))
563 : 0 : memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len);
564 : :
565 : : #if IS_ENABLED(CONFIG_FCOE)
566 : : dev->fcoe_ddp_xid = real_dev->fcoe_ddp_xid;
567 : : #endif
568 : :
569 : 0 : dev->needed_headroom = real_dev->needed_headroom;
570 [ # # ]: 0 : if (vlan_hw_offload_capable(real_dev->features, vlan->vlan_proto)) {
571 : 0 : dev->header_ops = &vlan_passthru_header_ops;
572 : 0 : dev->hard_header_len = real_dev->hard_header_len;
573 : : } else {
574 : 0 : dev->header_ops = &vlan_header_ops;
575 : 0 : dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
576 : : }
577 : :
578 : 0 : dev->netdev_ops = &vlan_netdev_ops;
579 : :
580 : 0 : SET_NETDEV_DEVTYPE(dev, &vlan_type);
581 : :
582 [ # # # # ]: 0 : vlan->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
583 [ # # ]: 0 : if (!vlan->vlan_pcpu_stats)
584 : : return -ENOMEM;
585 : :
586 : 0 : return 0;
587 : : }
588 : :
589 : : /* Note: this function might be called multiple times for the same device. */
590 : 0 : void vlan_dev_uninit(struct net_device *dev)
591 : : {
592 : : struct vlan_priority_tci_mapping *pm;
593 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
594 : : int i;
595 : :
596 [ # # ]: 0 : for (i = 0; i < ARRAY_SIZE(vlan->egress_priority_map); i++) {
597 [ # # ]: 0 : while ((pm = vlan->egress_priority_map[i]) != NULL) {
598 : 0 : vlan->egress_priority_map[i] = pm->next;
599 : 0 : kfree(pm);
600 : : }
601 : : }
602 : 0 : }
603 : :
604 : 0 : static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
605 : : netdev_features_t features)
606 : : {
607 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
608 : : netdev_features_t old_features = features;
609 : : netdev_features_t lower_features;
610 : :
611 : 0 : lower_features = netdev_intersect_features((real_dev->vlan_features |
612 : : NETIF_F_RXCSUM),
613 : : real_dev->features);
614 : :
615 : : /* Add HW_CSUM setting to preserve user ability to control
616 : : * checksum offload on the vlan device.
617 : : */
618 [ # # ]: 0 : if (lower_features & (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM))
619 : 0 : lower_features |= NETIF_F_HW_CSUM;
620 : : features = netdev_intersect_features(features, lower_features);
621 : 0 : features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE);
622 : 0 : features |= NETIF_F_LLTX;
623 : :
624 : 0 : return features;
625 : : }
626 : :
627 : 0 : static int vlan_ethtool_get_link_ksettings(struct net_device *dev,
628 : : struct ethtool_link_ksettings *cmd)
629 : : {
630 : : const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
631 : :
632 : 0 : return __ethtool_get_link_ksettings(vlan->real_dev, cmd);
633 : : }
634 : :
635 : 0 : static void vlan_ethtool_get_drvinfo(struct net_device *dev,
636 : : struct ethtool_drvinfo *info)
637 : : {
638 : 0 : strlcpy(info->driver, vlan_fullname, sizeof(info->driver));
639 : 0 : strlcpy(info->version, vlan_version, sizeof(info->version));
640 : 0 : strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
641 : 0 : }
642 : :
643 : 0 : static int vlan_ethtool_get_ts_info(struct net_device *dev,
644 : : struct ethtool_ts_info *info)
645 : : {
646 : : const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
647 : 0 : const struct ethtool_ops *ops = vlan->real_dev->ethtool_ops;
648 : 0 : struct phy_device *phydev = vlan->real_dev->phydev;
649 : :
650 [ # # # # : 0 : if (phydev && phydev->drv && phydev->drv->ts_info) {
# # ]
651 : 0 : return phydev->drv->ts_info(phydev, info);
652 [ # # ]: 0 : } else if (ops->get_ts_info) {
653 : 0 : return ops->get_ts_info(vlan->real_dev, info);
654 : : } else {
655 : 0 : info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
656 : : SOF_TIMESTAMPING_SOFTWARE;
657 : 0 : info->phc_index = -1;
658 : : }
659 : :
660 : 0 : return 0;
661 : : }
662 : :
663 : 0 : static void vlan_dev_get_stats64(struct net_device *dev,
664 : : struct rtnl_link_stats64 *stats)
665 : : {
666 : : struct vlan_pcpu_stats *p;
667 : : u32 rx_errors = 0, tx_dropped = 0;
668 : : int i;
669 : :
670 [ # # ]: 0 : for_each_possible_cpu(i) {
671 : : u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes;
672 : : unsigned int start;
673 : :
674 : 0 : p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
675 : : do {
676 : : start = u64_stats_fetch_begin_irq(&p->syncp);
677 : 0 : rxpackets = p->rx_packets;
678 : 0 : rxbytes = p->rx_bytes;
679 : 0 : rxmulticast = p->rx_multicast;
680 : 0 : txpackets = p->tx_packets;
681 : 0 : txbytes = p->tx_bytes;
682 [ # # ]: 0 : } while (u64_stats_fetch_retry_irq(&p->syncp, start));
683 : :
684 : 0 : stats->rx_packets += rxpackets;
685 : 0 : stats->rx_bytes += rxbytes;
686 : 0 : stats->multicast += rxmulticast;
687 : 0 : stats->tx_packets += txpackets;
688 : 0 : stats->tx_bytes += txbytes;
689 : : /* rx_errors & tx_dropped are u32 */
690 : 0 : rx_errors += p->rx_errors;
691 : 0 : tx_dropped += p->tx_dropped;
692 : : }
693 : 0 : stats->rx_errors = rx_errors;
694 : 0 : stats->tx_dropped = tx_dropped;
695 : 0 : }
696 : :
697 : : #ifdef CONFIG_NET_POLL_CONTROLLER
698 : 0 : static void vlan_dev_poll_controller(struct net_device *dev)
699 : : {
700 : 0 : return;
701 : : }
702 : :
703 : 0 : static int vlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo)
704 : : {
705 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
706 : 0 : struct net_device *real_dev = vlan->real_dev;
707 : : struct netpoll *netpoll;
708 : : int err = 0;
709 : :
710 : 0 : netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
711 : : err = -ENOMEM;
712 [ # # ]: 0 : if (!netpoll)
713 : : goto out;
714 : :
715 : 0 : err = __netpoll_setup(netpoll, real_dev);
716 [ # # ]: 0 : if (err) {
717 : 0 : kfree(netpoll);
718 : 0 : goto out;
719 : : }
720 : :
721 : 0 : vlan->netpoll = netpoll;
722 : :
723 : : out:
724 : 0 : return err;
725 : : }
726 : :
727 : 0 : static void vlan_dev_netpoll_cleanup(struct net_device *dev)
728 : : {
729 : : struct vlan_dev_priv *vlan= vlan_dev_priv(dev);
730 : 0 : struct netpoll *netpoll = vlan->netpoll;
731 : :
732 [ # # ]: 0 : if (!netpoll)
733 : 0 : return;
734 : :
735 : 0 : vlan->netpoll = NULL;
736 : 0 : __netpoll_free(netpoll);
737 : : }
738 : : #endif /* CONFIG_NET_POLL_CONTROLLER */
739 : :
740 : 0 : static int vlan_dev_get_iflink(const struct net_device *dev)
741 : : {
742 : 0 : struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
743 : :
744 : 0 : return real_dev->ifindex;
745 : : }
746 : :
747 : : static const struct ethtool_ops vlan_ethtool_ops = {
748 : : .get_link_ksettings = vlan_ethtool_get_link_ksettings,
749 : : .get_drvinfo = vlan_ethtool_get_drvinfo,
750 : : .get_link = ethtool_op_get_link,
751 : : .get_ts_info = vlan_ethtool_get_ts_info,
752 : : };
753 : :
754 : : static const struct net_device_ops vlan_netdev_ops = {
755 : : .ndo_change_mtu = vlan_dev_change_mtu,
756 : : .ndo_init = vlan_dev_init,
757 : : .ndo_uninit = vlan_dev_uninit,
758 : : .ndo_open = vlan_dev_open,
759 : : .ndo_stop = vlan_dev_stop,
760 : : .ndo_start_xmit = vlan_dev_hard_start_xmit,
761 : : .ndo_validate_addr = eth_validate_addr,
762 : : .ndo_set_mac_address = vlan_dev_set_mac_address,
763 : : .ndo_set_rx_mode = vlan_dev_set_rx_mode,
764 : : .ndo_change_rx_flags = vlan_dev_change_rx_flags,
765 : : .ndo_do_ioctl = vlan_dev_ioctl,
766 : : .ndo_neigh_setup = vlan_dev_neigh_setup,
767 : : .ndo_get_stats64 = vlan_dev_get_stats64,
768 : : #if IS_ENABLED(CONFIG_FCOE)
769 : : .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup,
770 : : .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done,
771 : : .ndo_fcoe_enable = vlan_dev_fcoe_enable,
772 : : .ndo_fcoe_disable = vlan_dev_fcoe_disable,
773 : : .ndo_fcoe_ddp_target = vlan_dev_fcoe_ddp_target,
774 : : #endif
775 : : #ifdef NETDEV_FCOE_WWNN
776 : : .ndo_fcoe_get_wwn = vlan_dev_fcoe_get_wwn,
777 : : #endif
778 : : #ifdef CONFIG_NET_POLL_CONTROLLER
779 : : .ndo_poll_controller = vlan_dev_poll_controller,
780 : : .ndo_netpoll_setup = vlan_dev_netpoll_setup,
781 : : .ndo_netpoll_cleanup = vlan_dev_netpoll_cleanup,
782 : : #endif
783 : : .ndo_fix_features = vlan_dev_fix_features,
784 : : .ndo_get_iflink = vlan_dev_get_iflink,
785 : : };
786 : :
787 : 0 : static void vlan_dev_free(struct net_device *dev)
788 : : {
789 : : struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
790 : :
791 : 0 : free_percpu(vlan->vlan_pcpu_stats);
792 : 0 : vlan->vlan_pcpu_stats = NULL;
793 : 0 : }
794 : :
795 : 0 : void vlan_setup(struct net_device *dev)
796 : : {
797 : 0 : ether_setup(dev);
798 : :
799 : 0 : dev->priv_flags |= IFF_802_1Q_VLAN | IFF_NO_QUEUE;
800 : 0 : dev->priv_flags |= IFF_UNICAST_FLT;
801 : 0 : dev->priv_flags &= ~IFF_TX_SKB_SHARING;
802 : : netif_keep_dst(dev);
803 : :
804 : 0 : dev->netdev_ops = &vlan_netdev_ops;
805 : 0 : dev->needs_free_netdev = true;
806 : 0 : dev->priv_destructor = vlan_dev_free;
807 : 0 : dev->ethtool_ops = &vlan_ethtool_ops;
808 : :
809 : 0 : dev->min_mtu = 0;
810 : 0 : dev->max_mtu = ETH_MAX_MTU;
811 : :
812 : 0 : eth_zero_addr(dev->broadcast);
813 : 0 : }
|