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))
 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        return 0;
 276}
 277
 278void vlan_dev_get_realdev_name(const struct net_device *dev, char *result)
 279{
 280        strncpy(result, vlan_dev_priv(dev)->real_dev->name, 23);
 281}
 282
 283static int vlan_dev_open(struct net_device *dev)
 284{
 285        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
 286        struct net_device *real_dev = vlan->real_dev;
 287        int err;
 288
 289        if (!(real_dev->flags & IFF_UP) &&
 290            !(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
 291                return -ENETDOWN;
 292
 293        if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr)) {
 294                err = dev_uc_add(real_dev, dev->dev_addr);
 295                if (err < 0)
 296                        goto out;
 297        }
 298
 299        if (dev->flags & IFF_ALLMULTI) {
 300                err = dev_set_allmulti(real_dev, 1);
 301                if (err < 0)
 302                        goto del_unicast;
 303        }
 304        if (dev->flags & IFF_PROMISC) {
 305                err = dev_set_promiscuity(real_dev, 1);
 306                if (err < 0)
 307                        goto clear_allmulti;
 308        }
 309
 310        memcpy(vlan->real_dev_addr, real_dev->dev_addr, ETH_ALEN);
 311
 312        if (vlan->flags & VLAN_FLAG_GVRP)
 313                vlan_gvrp_request_join(dev);
 314
 315        if (netif_carrier_ok(real_dev))
 316                netif_carrier_on(dev);
 317        return 0;
 318
 319clear_allmulti:
 320        if (dev->flags & IFF_ALLMULTI)
 321                dev_set_allmulti(real_dev, -1);
 322del_unicast:
 323        if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
 324                dev_uc_del(real_dev, dev->dev_addr);
 325out:
 326        netif_carrier_off(dev);
 327        return err;
 328}
 329
 330static int vlan_dev_stop(struct net_device *dev)
 331{
 332        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
 333        struct net_device *real_dev = vlan->real_dev;
 334
 335        dev_mc_unsync(real_dev, dev);
 336        dev_uc_unsync(real_dev, dev);
 337        if (dev->flags & IFF_ALLMULTI)
 338                dev_set_allmulti(real_dev, -1);
 339        if (dev->flags & IFF_PROMISC)
 340                dev_set_promiscuity(real_dev, -1);
 341
 342        if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
 343                dev_uc_del(real_dev, dev->dev_addr);
 344
 345        netif_carrier_off(dev);
 346        return 0;
 347}
 348
 349static int vlan_dev_set_mac_address(struct net_device *dev, void *p)
 350{
 351        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 352        struct sockaddr *addr = p;
 353        int err;
 354
 355        if (!is_valid_ether_addr(addr->sa_data))
 356                return -EADDRNOTAVAIL;
 357
 358        if (!(dev->flags & IFF_UP))
 359                goto out;
 360
 361        if (!ether_addr_equal(addr->sa_data, real_dev->dev_addr)) {
 362                err = dev_uc_add(real_dev, addr->sa_data);
 363                if (err < 0)
 364                        return err;
 365        }
 366
 367        if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
 368                dev_uc_del(real_dev, dev->dev_addr);
 369
 370out:
 371        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 372        return 0;
 373}
 374
 375static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 376{
 377        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 378        const struct net_device_ops *ops = real_dev->netdev_ops;
 379        struct ifreq ifrr;
 380        int err = -EOPNOTSUPP;
 381
 382        strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
 383        ifrr.ifr_ifru = ifr->ifr_ifru;
 384
 385        switch (cmd) {
 386        case SIOCGMIIPHY:
 387        case SIOCGMIIREG:
 388        case SIOCSMIIREG:
 389                if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
 390                        err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
 391                break;
 392        }
 393
 394        if (!err)
 395                ifr->ifr_ifru = ifrr.ifr_ifru;
 396
 397        return err;
 398}
 399
 400static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)
 401{
 402        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 403        const struct net_device_ops *ops = real_dev->netdev_ops;
 404        int err = 0;
 405
 406        if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
 407                err = ops->ndo_neigh_setup(real_dev, pa);
 408
 409        return err;
 410}
 411
 412#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
 413static int vlan_dev_fcoe_ddp_setup(struct net_device *dev, u16 xid,
 414                                   struct scatterlist *sgl, unsigned int sgc)
 415{
 416        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 417        const struct net_device_ops *ops = real_dev->netdev_ops;
 418        int rc = 0;
 419
 420        if (ops->ndo_fcoe_ddp_setup)
 421                rc = ops->ndo_fcoe_ddp_setup(real_dev, xid, sgl, sgc);
 422
 423        return rc;
 424}
 425
 426static int vlan_dev_fcoe_ddp_done(struct net_device *dev, u16 xid)
 427{
 428        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 429        const struct net_device_ops *ops = real_dev->netdev_ops;
 430        int len = 0;
 431
 432        if (ops->ndo_fcoe_ddp_done)
 433                len = ops->ndo_fcoe_ddp_done(real_dev, xid);
 434
 435        return len;
 436}
 437
 438static int vlan_dev_fcoe_enable(struct net_device *dev)
 439{
 440        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 441        const struct net_device_ops *ops = real_dev->netdev_ops;
 442        int rc = -EINVAL;
 443
 444        if (ops->ndo_fcoe_enable)
 445                rc = ops->ndo_fcoe_enable(real_dev);
 446        return rc;
 447}
 448
 449static int vlan_dev_fcoe_disable(struct net_device *dev)
 450{
 451        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 452        const struct net_device_ops *ops = real_dev->netdev_ops;
 453        int rc = -EINVAL;
 454
 455        if (ops->ndo_fcoe_disable)
 456                rc = ops->ndo_fcoe_disable(real_dev);
 457        return rc;
 458}
 459
 460static int vlan_dev_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
 461{
 462        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 463        const struct net_device_ops *ops = real_dev->netdev_ops;
 464        int rc = -EINVAL;
 465
 466        if (ops->ndo_fcoe_get_wwn)
 467                rc = ops->ndo_fcoe_get_wwn(real_dev, wwn, type);
 468        return rc;
 469}
 470
 471static int vlan_dev_fcoe_ddp_target(struct net_device *dev, u16 xid,
 472                                    struct scatterlist *sgl, unsigned int sgc)
 473{
 474        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 475        const struct net_device_ops *ops = real_dev->netdev_ops;
 476        int rc = 0;
 477
 478        if (ops->ndo_fcoe_ddp_target)
 479                rc = ops->ndo_fcoe_ddp_target(real_dev, xid, sgl, sgc);
 480
 481        return rc;
 482}
 483#endif
 484
 485static void vlan_dev_change_rx_flags(struct net_device *dev, int change)
 486{
 487        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 488
 489        if (dev->flags & IFF_UP) {
 490                if (change & IFF_ALLMULTI)
 491                        dev_set_allmulti(real_dev, dev->flags & IFF_ALLMULTI ? 1 : -1);
 492                if (change & IFF_PROMISC)
 493                        dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1);
 494        }
 495}
 496
 497static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)
 498{
 499        dev_mc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
 500        dev_uc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev);
 501}
 502
 503/*
 504 * vlan network devices have devices nesting below it, and are a special
 505 * "super class" of normal network devices; split their locks off into a
 506 * separate class since they always nest.
 507 */
 508static struct lock_class_key vlan_netdev_xmit_lock_key;
 509static struct lock_class_key vlan_netdev_addr_lock_key;
 510
 511static void vlan_dev_set_lockdep_one(struct net_device *dev,
 512                                     struct netdev_queue *txq,
 513                                     void *_subclass)
 514{
 515        lockdep_set_class_and_subclass(&txq->_xmit_lock,
 516                                       &vlan_netdev_xmit_lock_key,
 517                                       *(int *)_subclass);
 518}
 519
 520static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass)
 521{
 522        lockdep_set_class_and_subclass(&dev->addr_list_lock,
 523                                       &vlan_netdev_addr_lock_key,
 524                                       subclass);
 525        netdev_for_each_tx_queue(dev, vlan_dev_set_lockdep_one, &subclass);
 526}
 527
 528static const struct header_ops vlan_header_ops = {
 529        .create  = vlan_dev_hard_header,
 530        .rebuild = vlan_dev_rebuild_header,
 531        .parse   = eth_header_parse,
 532};
 533
 534static const struct net_device_ops vlan_netdev_ops;
 535
 536static int vlan_dev_init(struct net_device *dev)
 537{
 538        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 539        int subclass = 0;
 540
 541        netif_carrier_off(dev);
 542
 543        /* IFF_BROADCAST|IFF_MULTICAST; ??? */
 544        dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI |
 545                                          IFF_MASTER | IFF_SLAVE);
 546        dev->iflink = real_dev->ifindex;
 547        dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
 548                                          (1<<__LINK_STATE_DORMANT))) |
 549                      (1<<__LINK_STATE_PRESENT);
 550
 551        dev->hw_features = NETIF_F_ALL_CSUM | NETIF_F_SG |
 552                           NETIF_F_FRAGLIST | NETIF_F_ALL_TSO |
 553                           NETIF_F_HIGHDMA | NETIF_F_SCTP_CSUM |
 554                           NETIF_F_ALL_FCOE;
 555
 556        dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
 557        dev->gso_max_size = real_dev->gso_max_size;
 558
 559        /* ipv6 shared card related stuff */
 560        dev->dev_id = real_dev->dev_id;
 561
 562        if (is_zero_ether_addr(dev->dev_addr))
 563                memcpy(dev->dev_addr, real_dev->dev_addr, dev->addr_len);
 564        if (is_zero_ether_addr(dev->broadcast))
 565                memcpy(dev->broadcast, real_dev->broadcast, dev->addr_len);
 566
 567#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
 568        dev->fcoe_ddp_xid = real_dev->fcoe_ddp_xid;
 569#endif
 570
 571        dev->needed_headroom = real_dev->needed_headroom;
 572        if (real_dev->features & NETIF_F_HW_VLAN_TX) {
 573                dev->header_ops      = real_dev->header_ops;
 574                dev->hard_header_len = real_dev->hard_header_len;
 575        } else {
 576                dev->header_ops      = &vlan_header_ops;
 577                dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
 578        }
 579
 580        dev->netdev_ops = &vlan_netdev_ops;
 581
 582        if (is_vlan_dev(real_dev))
 583                subclass = 1;
 584
 585        vlan_dev_set_lockdep_class(dev, subclass);
 586
 587        vlan_dev_priv(dev)->vlan_pcpu_stats = alloc_percpu(struct vlan_pcpu_stats);
 588        if (!vlan_dev_priv(dev)->vlan_pcpu_stats)
 589                return -ENOMEM;
 590
 591        return 0;
 592}
 593
 594static void vlan_dev_uninit(struct net_device *dev)
 595{
 596        struct vlan_priority_tci_mapping *pm;
 597        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
 598        int i;
 599
 600        free_percpu(vlan->vlan_pcpu_stats);
 601        vlan->vlan_pcpu_stats = NULL;
 602        for (i = 0; i < ARRAY_SIZE(vlan->egress_priority_map); i++) {
 603                while ((pm = vlan->egress_priority_map[i]) != NULL) {
 604                        vlan->egress_priority_map[i] = pm->next;
 605                        kfree(pm);
 606                }
 607        }
 608}
 609
 610static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
 611        netdev_features_t features)
 612{
 613        struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
 614        u32 old_features = features;
 615
 616        features &= real_dev->vlan_features;
 617        features |= NETIF_F_RXCSUM;
 618        features &= real_dev->features;
 619
 620        features |= old_features & NETIF_F_SOFT_FEATURES;
 621        features |= NETIF_F_LLTX;
 622
 623        return features;
 624}
 625
 626static int vlan_ethtool_get_settings(struct net_device *dev,
 627                                     struct ethtool_cmd *cmd)
 628{
 629        const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
 630
 631        return __ethtool_get_settings(vlan->real_dev, cmd);
 632}
 633
 634static void vlan_ethtool_get_drvinfo(struct net_device *dev,
 635                                     struct ethtool_drvinfo *info)
 636{
 637        strcpy(info->driver, vlan_fullname);
 638        strcpy(info->version, vlan_version);
 639        strcpy(info->fw_version, "N/A");
 640}
 641
 642static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
 643{
 644
 645        if (vlan_dev_priv(dev)->vlan_pcpu_stats) {
 646                struct vlan_pcpu_stats *p;
 647                u32 rx_errors = 0, tx_dropped = 0;
 648                int i;
 649
 650                for_each_possible_cpu(i) {
 651                        u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes;
 652                        unsigned int start;
 653
 654                        p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
 655                        do {
 656                                start = u64_stats_fetch_begin_bh(&p->syncp);
 657                                rxpackets       = p->rx_packets;
 658                                rxbytes         = p->rx_bytes;
 659                                rxmulticast     = p->rx_multicast;
 660                                txpackets       = p->tx_packets;
 661                                txbytes         = p->tx_bytes;
 662                        } while (u64_stats_fetch_retry_bh(&p->syncp, start));
 663
 664                        stats->rx_packets       += rxpackets;
 665                        stats->rx_bytes         += rxbytes;
 666                        stats->multicast        += rxmulticast;
 667                        stats->tx_packets       += txpackets;
 668                        stats->tx_bytes         += txbytes;
 669                        /* rx_errors & tx_dropped are u32 */
 670                        rx_errors       += p->rx_errors;
 671                        tx_dropped      += p->tx_dropped;
 672                }
 673                stats->rx_errors  = rx_errors;
 674                stats->tx_dropped = tx_dropped;
 675        }
 676        return stats;
 677}
 678
 679#ifdef CONFIG_NET_POLL_CONTROLLER
 680static void vlan_dev_poll_controller(struct net_device *dev)
 681{
 682        return;
 683}
 684
 685static int vlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo,
 686                                  gfp_t gfp)
 687{
 688        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
 689        struct net_device *real_dev = vlan->real_dev;
 690        struct netpoll *netpoll;
 691        int err = 0;
 692
 693        netpoll = kzalloc(sizeof(*netpoll), gfp);
 694        err = -ENOMEM;
 695        if (!netpoll)
 696                goto out;
 697
 698        err = __netpoll_setup(netpoll, real_dev, gfp);
 699        if (err) {
 700                kfree(netpoll);
 701                goto out;
 702        }
 703
 704        vlan->netpoll = netpoll;
 705
 706out:
 707        return err;
 708}
 709
 710static void vlan_dev_netpoll_cleanup(struct net_device *dev)
 711{
 712        struct vlan_dev_priv *vlan= vlan_dev_priv(dev);
 713        struct netpoll *netpoll = vlan->netpoll;
 714
 715        if (!netpoll)
 716                return;
 717
 718        vlan->netpoll = NULL;
 719
 720        __netpoll_free_rcu(netpoll);
 721}
 722#endif /* CONFIG_NET_POLL_CONTROLLER */
 723
 724static const struct ethtool_ops vlan_ethtool_ops = {
 725        .get_settings           = vlan_ethtool_get_settings,
 726        .get_drvinfo            = vlan_ethtool_get_drvinfo,
 727        .get_link               = ethtool_op_get_link,
 728};
 729
 730static const struct net_device_ops vlan_netdev_ops = {
 731        .ndo_change_mtu         = vlan_dev_change_mtu,
 732        .ndo_init               = vlan_dev_init,
 733        .ndo_uninit             = vlan_dev_uninit,
 734        .ndo_open               = vlan_dev_open,
 735        .ndo_stop               = vlan_dev_stop,
 736        .ndo_start_xmit =  vlan_dev_hard_start_xmit,
 737        .ndo_validate_addr      = eth_validate_addr,
 738        .ndo_set_mac_address    = vlan_dev_set_mac_address,
 739        .ndo_set_rx_mode        = vlan_dev_set_rx_mode,
 740        .ndo_change_rx_flags    = vlan_dev_change_rx_flags,
 741        .ndo_do_ioctl           = vlan_dev_ioctl,
 742        .ndo_neigh_setup        = vlan_dev_neigh_setup,
 743        .ndo_get_stats64        = vlan_dev_get_stats64,
 744#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
 745        .ndo_fcoe_ddp_setup     = vlan_dev_fcoe_ddp_setup,
 746        .ndo_fcoe_ddp_done      = vlan_dev_fcoe_ddp_done,
 747        .ndo_fcoe_enable        = vlan_dev_fcoe_enable,
 748        .ndo_fcoe_disable       = vlan_dev_fcoe_disable,
 749        .ndo_fcoe_get_wwn       = vlan_dev_fcoe_get_wwn,
 750        .ndo_fcoe_ddp_target    = vlan_dev_fcoe_ddp_target,
 751#endif
 752#ifdef CONFIG_NET_POLL_CONTROLLER
 753        .ndo_poll_controller    = vlan_dev_poll_controller,
 754        .ndo_netpoll_setup      = vlan_dev_netpoll_setup,
 755        .ndo_netpoll_cleanup    = vlan_dev_netpoll_cleanup,
 756#endif
 757        .ndo_fix_features       = vlan_dev_fix_features,
 758};
 759
 760void vlan_setup(struct net_device *dev)
 761{
 762        ether_setup(dev);
 763
 764        dev->priv_flags         |= IFF_802_1Q_VLAN;
 765        dev->priv_flags         &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
 766        dev->tx_queue_len       = 0;
 767
 768        dev->netdev_ops         = &vlan_netdev_ops;
 769        dev->destructor         = free_netdev;
 770        dev->ethtool_ops        = &vlan_ethtool_ops;
 771
 772        memset(dev->broadcast, 0, ETH_ALEN);
 773}
 774
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.