linux/net/8021q/vlan.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   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:
  11 *              Fix for packet capture - Nick Eggleston <nick@dccinc.com>;
  12 *              Add HW acceleration hooks - David S. Miller <davem@redhat.com>;
  13 *              Correct all the locking - David S. Miller <davem@redhat.com>;
  14 *              Use hash table for VLAN groups - David S. Miller <davem@redhat.com>
  15 */
  16
  17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  18
  19#include <linux/capability.h>
  20#include <linux/module.h>
  21#include <linux/netdevice.h>
  22#include <linux/skbuff.h>
  23#include <linux/slab.h>
  24#include <linux/init.h>
  25#include <linux/rculist.h>
  26#include <net/p8022.h>
  27#include <net/arp.h>
  28#include <linux/rtnetlink.h>
  29#include <linux/notifier.h>
  30#include <net/rtnetlink.h>
  31#include <net/net_namespace.h>
  32#include <net/netns/generic.h>
  33#include <linux/uaccess.h>
  34
  35#include <linux/if_vlan.h>
  36#include "vlan.h"
  37#include "vlanproc.h"
  38
  39#define DRV_VERSION "1.8"
  40
  41/* Global VLAN variables */
  42
  43unsigned int vlan_net_id __read_mostly;
  44
  45const char vlan_fullname[] = "802.1Q VLAN Support";
  46const char vlan_version[] = DRV_VERSION;
  47
  48/* End of global variables definitions. */
  49
  50static int vlan_group_prealloc_vid(struct vlan_group *vg,
  51                                   __be16 vlan_proto, u16 vlan_id)
  52{
  53        struct net_device **array;
  54        unsigned int vidx;
  55        unsigned int size;
  56        int pidx;
  57
  58        ASSERT_RTNL();
  59
  60        pidx  = vlan_proto_idx(vlan_proto);
  61        if (pidx < 0)
  62                return -EINVAL;
  63
  64        vidx  = vlan_id / VLAN_GROUP_ARRAY_PART_LEN;
  65        array = vg->vlan_devices_arrays[pidx][vidx];
  66        if (array != NULL)
  67                return 0;
  68
  69        size = sizeof(struct net_device *) * VLAN_GROUP_ARRAY_PART_LEN;
  70        array = kzalloc(size, GFP_KERNEL_ACCOUNT);
  71        if (array == NULL)
  72                return -ENOBUFS;
  73
  74        /* paired with smp_rmb() in __vlan_group_get_device() */
  75        smp_wmb();
  76
  77        vg->vlan_devices_arrays[pidx][vidx] = array;
  78        return 0;
  79}
  80
  81static void vlan_stacked_transfer_operstate(const struct net_device *rootdev,
  82                                            struct net_device *dev,
  83                                            struct vlan_dev_priv *vlan)
  84{
  85        if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
  86                netif_stacked_transfer_operstate(rootdev, dev);
  87}
  88
  89void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
  90{
  91        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
  92        struct net_device *real_dev = vlan->real_dev;
  93        struct vlan_info *vlan_info;
  94        struct vlan_group *grp;
  95        u16 vlan_id = vlan->vlan_id;
  96
  97        ASSERT_RTNL();
  98
  99        vlan_info = rtnl_dereference(real_dev->vlan_info);
 100        BUG_ON(!vlan_info);
 101
 102        grp = &vlan_info->grp;
 103
 104        grp->nr_vlan_devs--;
 105
 106        if (vlan->flags & VLAN_FLAG_MVRP)
 107                vlan_mvrp_request_leave(dev);
 108        if (vlan->flags & VLAN_FLAG_GVRP)
 109                vlan_gvrp_request_leave(dev);
 110
 111        vlan_group_set_device(grp, vlan->vlan_proto, vlan_id, NULL);
 112
 113        netdev_upper_dev_unlink(real_dev, dev);
 114        /* Because unregister_netdevice_queue() makes sure at least one rcu
 115         * grace period is respected before device freeing,
 116         * we dont need to call synchronize_net() here.
 117         */
 118        unregister_netdevice_queue(dev, head);
 119
 120        if (grp->nr_vlan_devs == 0) {
 121                vlan_mvrp_uninit_applicant(real_dev);
 122                vlan_gvrp_uninit_applicant(real_dev);
 123        }
 124
 125        vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
 126}
 127
 128int vlan_check_real_dev(struct net_device *real_dev,
 129                        __be16 protocol, u16 vlan_id,
 130                        struct netlink_ext_ack *extack)
 131{
 132        const char *name = real_dev->name;
 133
 134        if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
 135                pr_info("VLANs not supported on %s\n", name);
 136                NL_SET_ERR_MSG_MOD(extack, "VLANs not supported on device");
 137                return -EOPNOTSUPP;
 138        }
 139
 140        if (vlan_find_dev(real_dev, protocol, vlan_id) != NULL) {
 141                NL_SET_ERR_MSG_MOD(extack, "VLAN device already exists");
 142                return -EEXIST;
 143        }
 144
 145        return 0;
 146}
 147
 148int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack)
 149{
 150        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
 151        struct net_device *real_dev = vlan->real_dev;
 152        u16 vlan_id = vlan->vlan_id;
 153        struct vlan_info *vlan_info;
 154        struct vlan_group *grp;
 155        int err;
 156
 157        err = vlan_vid_add(real_dev, vlan->vlan_proto, vlan_id);
 158        if (err)
 159                return err;
 160
 161        vlan_info = rtnl_dereference(real_dev->vlan_info);
 162        /* vlan_info should be there now. vlan_vid_add took care of it */
 163        BUG_ON(!vlan_info);
 164
 165        grp = &vlan_info->grp;
 166        if (grp->nr_vlan_devs == 0) {
 167                err = vlan_gvrp_init_applicant(real_dev);
 168                if (err < 0)
 169                        goto out_vid_del;
 170                err = vlan_mvrp_init_applicant(real_dev);
 171                if (err < 0)
 172                        goto out_uninit_gvrp;
 173        }
 174
 175        err = vlan_group_prealloc_vid(grp, vlan->vlan_proto, vlan_id);
 176        if (err < 0)
 177                goto out_uninit_mvrp;
 178
 179        err = register_netdevice(dev);
 180        if (err < 0)
 181                goto out_uninit_mvrp;
 182
 183        err = netdev_upper_dev_link(real_dev, dev, extack);
 184        if (err)
 185                goto out_unregister_netdev;
 186
 187        vlan_stacked_transfer_operstate(real_dev, dev, vlan);
 188        linkwatch_fire_event(dev); /* _MUST_ call rfc2863_policy() */
 189
 190        /* So, got the sucker initialized, now lets place
 191         * it into our local structure.
 192         */
 193        vlan_group_set_device(grp, vlan->vlan_proto, vlan_id, dev);
 194        grp->nr_vlan_devs++;
 195
 196        return 0;
 197
 198out_unregister_netdev:
 199        unregister_netdevice(dev);
 200out_uninit_mvrp:
 201        if (grp->nr_vlan_devs == 0)
 202                vlan_mvrp_uninit_applicant(real_dev);
 203out_uninit_gvrp:
 204        if (grp->nr_vlan_devs == 0)
 205                vlan_gvrp_uninit_applicant(real_dev);
 206out_vid_del:
 207        vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
 208        return err;
 209}
 210
 211/*  Attach a VLAN device to a mac address (ie Ethernet Card).
 212 *  Returns 0 if the device was created or a negative error code otherwise.
 213 */
 214static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
 215{
 216        struct net_device *new_dev;
 217        struct vlan_dev_priv *vlan;
 218        struct net *net = dev_net(real_dev);
 219        struct vlan_net *vn = net_generic(net, vlan_net_id);
 220        char name[IFNAMSIZ];
 221        int err;
 222
 223        if (vlan_id >= VLAN_VID_MASK)
 224                return -ERANGE;
 225
 226        err = vlan_check_real_dev(real_dev, htons(ETH_P_8021Q), vlan_id,
 227                                  NULL);
 228        if (err < 0)
 229                return err;
 230
 231        /* Gotta set up the fields for the device. */
 232        switch (vn->name_type) {
 233        case VLAN_NAME_TYPE_RAW_PLUS_VID:
 234                /* name will look like:  eth1.0005 */
 235                snprintf(name, IFNAMSIZ, "%s.%.4i", real_dev->name, vlan_id);
 236                break;
 237        case VLAN_NAME_TYPE_PLUS_VID_NO_PAD:
 238                /* Put our vlan.VID in the name.
 239                 * Name will look like:  vlan5
 240                 */
 241                snprintf(name, IFNAMSIZ, "vlan%i", vlan_id);
 242                break;
 243        case VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD:
 244                /* Put our vlan.VID in the name.
 245                 * Name will look like:  eth0.5
 246                 */
 247                snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id);
 248                break;
 249        case VLAN_NAME_TYPE_PLUS_VID:
 250                /* Put our vlan.VID in the name.
 251                 * Name will look like:  vlan0005
 252                 */
 253        default:
 254                snprintf(name, IFNAMSIZ, "vlan%.4i", vlan_id);
 255        }
 256
 257        new_dev = alloc_netdev(sizeof(struct vlan_dev_priv), name,
 258                               NET_NAME_UNKNOWN, vlan_setup);
 259
 260        if (new_dev == NULL)
 261                return -ENOBUFS;
 262
 263        dev_net_set(new_dev, net);
 264        /* need 4 bytes for extra VLAN header info,
 265         * hope the underlying device can handle it.
 266         */
 267        new_dev->mtu = real_dev->mtu;
 268
 269        vlan = vlan_dev_priv(new_dev);
 270        vlan->vlan_proto = htons(ETH_P_8021Q);
 271        vlan->vlan_id = vlan_id;
 272        vlan->real_dev = real_dev;
 273        vlan->dent = NULL;
 274        vlan->flags = VLAN_FLAG_REORDER_HDR;
 275
 276        new_dev->rtnl_link_ops = &vlan_link_ops;
 277        err = register_vlan_dev(new_dev, NULL);
 278        if (err < 0)
 279                goto out_free_newdev;
 280
 281        return 0;
 282
 283out_free_newdev:
 284        free_netdev(new_dev);
 285        return err;
 286}
 287
 288static void vlan_sync_address(struct net_device *dev,
 289                              struct net_device *vlandev)
 290{
 291        struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev);
 292
 293        /* May be called without an actual change */
 294        if (ether_addr_equal(vlan->real_dev_addr, dev->dev_addr))
 295                return;
 296
 297        /* vlan continues to inherit address of lower device */
 298        if (vlan_dev_inherit_address(vlandev, dev))
 299                goto out;
 300
 301        /* vlan address was different from the old address and is equal to
 302         * the new address */
 303        if (!ether_addr_equal(vlandev->dev_addr, vlan->real_dev_addr) &&
 304            ether_addr_equal(vlandev->dev_addr, dev->dev_addr))
 305                dev_uc_del(dev, vlandev->dev_addr);
 306
 307        /* vlan address was equal to the old address and is different from
 308         * the new address */
 309        if (ether_addr_equal(vlandev->dev_addr, vlan->real_dev_addr) &&
 310            !ether_addr_equal(vlandev->dev_addr, dev->dev_addr))
 311                dev_uc_add(dev, vlandev->dev_addr);
 312
 313out:
 314        ether_addr_copy(vlan->real_dev_addr, dev->dev_addr);
 315}
 316
 317static void vlan_transfer_features(struct net_device *dev,
 318                                   struct net_device *vlandev)
 319{
 320        struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev);
 321
 322        vlandev->gso_max_size = dev->gso_max_size;
 323        vlandev->gso_max_segs = dev->gso_max_segs;
 324
 325        if (vlan_hw_offload_capable(dev->features, vlan->vlan_proto))
 326                vlandev->hard_header_len = dev->hard_header_len;
 327        else
 328                vlandev->hard_header_len = dev->hard_header_len + VLAN_HLEN;
 329
 330#if IS_ENABLED(CONFIG_FCOE)
 331        vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid;
 332#endif
 333
 334        vlandev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
 335        vlandev->priv_flags |= (vlan->real_dev->priv_flags & IFF_XMIT_DST_RELEASE);
 336        vlandev->hw_enc_features = vlan_tnl_features(vlan->real_dev);
 337
 338        netdev_update_features(vlandev);
 339}
 340
 341static int __vlan_device_event(struct net_device *dev, unsigned long event)
 342{
 343        int err = 0;
 344
 345        switch (event) {
 346        case NETDEV_CHANGENAME:
 347                vlan_proc_rem_dev(dev);
 348                err = vlan_proc_add_dev(dev);
 349                break;
 350        case NETDEV_REGISTER:
 351                err = vlan_proc_add_dev(dev);
 352                break;
 353        case NETDEV_UNREGISTER:
 354                vlan_proc_rem_dev(dev);
 355                break;
 356        }
 357
 358        return err;
 359}
 360
 361static int vlan_device_event(struct notifier_block *unused, unsigned long event,
 362                             void *ptr)
 363{
 364        struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(ptr);
 365        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 366        struct vlan_group *grp;
 367        struct vlan_info *vlan_info;
 368        int i, flgs;
 369        struct net_device *vlandev;
 370        struct vlan_dev_priv *vlan;
 371        bool last = false;
 372        LIST_HEAD(list);
 373        int err;
 374
 375        if (is_vlan_dev(dev)) {
 376                int err = __vlan_device_event(dev, event);
 377
 378                if (err)
 379                        return notifier_from_errno(err);
 380        }
 381
 382        if ((event == NETDEV_UP) &&
 383            (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) {
 384                pr_info("adding VLAN 0 to HW filter on device %s\n",
 385                        dev->name);
 386                vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
 387        }
 388        if (event == NETDEV_DOWN &&
 389            (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
 390                vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
 391
 392        vlan_info = rtnl_dereference(dev->vlan_info);
 393        if (!vlan_info)
 394                goto out;
 395        grp = &vlan_info->grp;
 396
 397        /* It is OK that we do not hold the group lock right now,
 398         * as we run under the RTNL lock.
 399         */
 400
 401        switch (event) {
 402        case NETDEV_CHANGE:
 403                /* Propagate real device state to vlan devices */
 404                vlan_group_for_each_dev(grp, i, vlandev)
 405                        vlan_stacked_transfer_operstate(dev, vlandev,
 406                                                        vlan_dev_priv(vlandev));
 407                break;
 408
 409        case NETDEV_CHANGEADDR:
 410                /* Adjust unicast filters on underlying device */
 411                vlan_group_for_each_dev(grp, i, vlandev) {
 412                        flgs = vlandev->flags;
 413                        if (!(flgs & IFF_UP))
 414                                continue;
 415
 416                        vlan_sync_address(dev, vlandev);
 417                }
 418                break;
 419
 420        case NETDEV_CHANGEMTU:
 421                vlan_group_for_each_dev(grp, i, vlandev) {
 422                        if (vlandev->mtu <= dev->mtu)
 423                                continue;
 424
 425                        dev_set_mtu(vlandev, dev->mtu);
 426                }
 427                break;
 428
 429        case NETDEV_FEAT_CHANGE:
 430                /* Propagate device features to underlying device */
 431                vlan_group_for_each_dev(grp, i, vlandev)
 432                        vlan_transfer_features(dev, vlandev);
 433                break;
 434
 435        case NETDEV_DOWN: {
 436                struct net_device *tmp;
 437                LIST_HEAD(close_list);
 438
 439                /* Put all VLANs for this dev in the down state too.  */
 440                vlan_group_for_each_dev(grp, i, vlandev) {
 441                        flgs = vlandev->flags;
 442                        if (!(flgs & IFF_UP))
 443                                continue;
 444
 445                        vlan = vlan_dev_priv(vlandev);
 446                        if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
 447                                list_add(&vlandev->close_list, &close_list);
 448                }
 449
 450                dev_close_many(&close_list, false);
 451
 452                list_for_each_entry_safe(vlandev, tmp, &close_list, close_list) {
 453                        vlan_stacked_transfer_operstate(dev, vlandev,
 454                                                        vlan_dev_priv(vlandev));
 455                        list_del_init(&vlandev->close_list);
 456                }
 457                list_del(&close_list);
 458                break;
 459        }
 460        case NETDEV_UP:
 461                /* Put all VLANs for this dev in the up state too.  */
 462                vlan_group_for_each_dev(grp, i, vlandev) {
 463                        flgs = dev_get_flags(vlandev);
 464                        if (flgs & IFF_UP)
 465                                continue;
 466
 467                        vlan = vlan_dev_priv(vlandev);
 468                        if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
 469                                dev_change_flags(vlandev, flgs | IFF_UP,
 470                                                 extack);
 471                        vlan_stacked_transfer_operstate(dev, vlandev, vlan);
 472                }
 473                break;
 474
 475        case NETDEV_UNREGISTER:
 476                /* twiddle thumbs on netns device moves */
 477                if (dev->reg_state != NETREG_UNREGISTERING)
 478                        break;
 479
 480                vlan_group_for_each_dev(grp, i, vlandev) {
 481                        /* removal of last vid destroys vlan_info, abort
 482                         * afterwards */
 483                        if (vlan_info->nr_vids == 1)
 484                                last = true;
 485
 486                        unregister_vlan_dev(vlandev, &list);
 487                        if (last)
 488                                break;
 489                }
 490                unregister_netdevice_many(&list);
 491                break;
 492
 493        case NETDEV_PRE_TYPE_CHANGE:
 494                /* Forbid underlaying device to change its type. */
 495                if (vlan_uses_dev(dev))
 496                        return NOTIFY_BAD;
 497                break;
 498
 499        case NETDEV_NOTIFY_PEERS:
 500        case NETDEV_BONDING_FAILOVER:
 501        case NETDEV_RESEND_IGMP:
 502                /* Propagate to vlan devices */
 503                vlan_group_for_each_dev(grp, i, vlandev)
 504                        call_netdevice_notifiers(event, vlandev);
 505                break;
 506
 507        case NETDEV_CVLAN_FILTER_PUSH_INFO:
 508                err = vlan_filter_push_vids(vlan_info, htons(ETH_P_8021Q));
 509                if (err)
 510                        return notifier_from_errno(err);
 511                break;
 512
 513        case NETDEV_CVLAN_FILTER_DROP_INFO:
 514                vlan_filter_drop_vids(vlan_info, htons(ETH_P_8021Q));
 515                break;
 516
 517        case NETDEV_SVLAN_FILTER_PUSH_INFO:
 518                err = vlan_filter_push_vids(vlan_info, htons(ETH_P_8021AD));
 519                if (err)
 520                        return notifier_from_errno(err);
 521                break;
 522
 523        case NETDEV_SVLAN_FILTER_DROP_INFO:
 524                vlan_filter_drop_vids(vlan_info, htons(ETH_P_8021AD));
 525                break;
 526        }
 527
 528out:
 529        return NOTIFY_DONE;
 530}
 531
 532static struct notifier_block vlan_notifier_block __read_mostly = {
 533        .notifier_call = vlan_device_event,
 534};
 535
 536/*
 537 *      VLAN IOCTL handler.
 538 *      o execute requested action or pass command to the device driver
 539 *   arg is really a struct vlan_ioctl_args __user *.
 540 */
 541static int vlan_ioctl_handler(struct net *net, void __user *arg)
 542{
 543        int err;
 544        struct vlan_ioctl_args args;
 545        struct net_device *dev = NULL;
 546
 547        if (copy_from_user(&args, arg, sizeof(struct vlan_ioctl_args)))
 548                return -EFAULT;
 549
 550        /* Null terminate this sucker, just in case. */
 551        args.device1[sizeof(args.device1) - 1] = 0;
 552        args.u.device2[sizeof(args.u.device2) - 1] = 0;
 553
 554        rtnl_lock();
 555
 556        switch (args.cmd) {
 557        case SET_VLAN_INGRESS_PRIORITY_CMD:
 558        case SET_VLAN_EGRESS_PRIORITY_CMD:
 559        case SET_VLAN_FLAG_CMD:
 560        case ADD_VLAN_CMD:
 561        case DEL_VLAN_CMD:
 562        case GET_VLAN_REALDEV_NAME_CMD:
 563        case GET_VLAN_VID_CMD:
 564                err = -ENODEV;
 565                dev = __dev_get_by_name(net, args.device1);
 566                if (!dev)
 567                        goto out;
 568
 569                err = -EINVAL;
 570                if (args.cmd != ADD_VLAN_CMD && !is_vlan_dev(dev))
 571                        goto out;
 572        }
 573
 574        switch (args.cmd) {
 575        case SET_VLAN_INGRESS_PRIORITY_CMD:
 576                err = -EPERM;
 577                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 578                        break;
 579                vlan_dev_set_ingress_priority(dev,
 580                                              args.u.skb_priority,
 581                                              args.vlan_qos);
 582                err = 0;
 583                break;
 584
 585        case SET_VLAN_EGRESS_PRIORITY_CMD:
 586                err = -EPERM;
 587                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 588                        break;
 589                err = vlan_dev_set_egress_priority(dev,
 590                                                   args.u.skb_priority,
 591                                                   args.vlan_qos);
 592                break;
 593
 594        case SET_VLAN_FLAG_CMD:
 595                err = -EPERM;
 596                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 597                        break;
 598                err = vlan_dev_change_flags(dev,
 599                                            args.vlan_qos ? args.u.flag : 0,
 600                                            args.u.flag);
 601                break;
 602
 603        case SET_VLAN_NAME_TYPE_CMD:
 604                err = -EPERM;
 605                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 606                        break;
 607                if (args.u.name_type < VLAN_NAME_TYPE_HIGHEST) {
 608                        struct vlan_net *vn;
 609
 610                        vn = net_generic(net, vlan_net_id);
 611                        vn->name_type = args.u.name_type;
 612                        err = 0;
 613                } else {
 614                        err = -EINVAL;
 615                }
 616                break;
 617
 618        case ADD_VLAN_CMD:
 619                err = -EPERM;
 620                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 621                        break;
 622                err = register_vlan_device(dev, args.u.VID);
 623                break;
 624
 625        case DEL_VLAN_CMD:
 626                err = -EPERM;
 627                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 628                        break;
 629                unregister_vlan_dev(dev, NULL);
 630                err = 0;
 631                break;
 632
 633        case GET_VLAN_REALDEV_NAME_CMD:
 634                err = 0;
 635                vlan_dev_get_realdev_name(dev, args.u.device2,
 636                                          sizeof(args.u.device2));
 637                if (copy_to_user(arg, &args,
 638                                 sizeof(struct vlan_ioctl_args)))
 639                        err = -EFAULT;
 640                break;
 641
 642        case GET_VLAN_VID_CMD:
 643                err = 0;
 644                args.u.VID = vlan_dev_vlan_id(dev);
 645                if (copy_to_user(arg, &args,
 646                                 sizeof(struct vlan_ioctl_args)))
 647                      err = -EFAULT;
 648                break;
 649
 650        default:
 651                err = -EOPNOTSUPP;
 652                break;
 653        }
 654out:
 655        rtnl_unlock();
 656        return err;
 657}
 658
 659static int __net_init vlan_init_net(struct net *net)
 660{
 661        struct vlan_net *vn = net_generic(net, vlan_net_id);
 662        int err;
 663
 664        vn->name_type = VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD;
 665
 666        err = vlan_proc_init(net);
 667
 668        return err;
 669}
 670
 671static void __net_exit vlan_exit_net(struct net *net)
 672{
 673        vlan_proc_cleanup(net);
 674}
 675
 676static struct pernet_operations vlan_net_ops = {
 677        .init = vlan_init_net,
 678        .exit = vlan_exit_net,
 679        .id   = &vlan_net_id,
 680        .size = sizeof(struct vlan_net),
 681};
 682
 683static int __init vlan_proto_init(void)
 684{
 685        int err;
 686
 687        pr_info("%s v%s\n", vlan_fullname, vlan_version);
 688
 689        err = register_pernet_subsys(&vlan_net_ops);
 690        if (err < 0)
 691                goto err0;
 692
 693        err = register_netdevice_notifier(&vlan_notifier_block);
 694        if (err < 0)
 695                goto err2;
 696
 697        err = vlan_gvrp_init();
 698        if (err < 0)
 699                goto err3;
 700
 701        err = vlan_mvrp_init();
 702        if (err < 0)
 703                goto err4;
 704
 705        err = vlan_netlink_init();
 706        if (err < 0)
 707                goto err5;
 708
 709        vlan_ioctl_set(vlan_ioctl_handler);
 710        return 0;
 711
 712err5:
 713        vlan_mvrp_uninit();
 714err4:
 715        vlan_gvrp_uninit();
 716err3:
 717        unregister_netdevice_notifier(&vlan_notifier_block);
 718err2:
 719        unregister_pernet_subsys(&vlan_net_ops);
 720err0:
 721        return err;
 722}
 723
 724static void __exit vlan_cleanup_module(void)
 725{
 726        vlan_ioctl_set(NULL);
 727
 728        vlan_netlink_fini();
 729
 730        unregister_netdevice_notifier(&vlan_notifier_block);
 731
 732        unregister_pernet_subsys(&vlan_net_ops);
 733        rcu_barrier(); /* Wait for completion of call_rcu()'s */
 734
 735        vlan_mvrp_uninit();
 736        vlan_gvrp_uninit();
 737}
 738
 739module_init(vlan_proto_init);
 740module_exit(vlan_cleanup_module);
 741
 742MODULE_LICENSE("GPL");
 743MODULE_VERSION(DRV_VERSION);
 744