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