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