1276333Sian// SPDX-License-Identifier: GPL-2.0-or-later 2276333Sian/* 3276333Sian * INET 802.1Q VLAN 4276333Sian * Ethernet-type device handling. 5276333Sian * 6276333Sian * Authors: Ben Greear <greearb@candelatech.com> 7276333Sian * Please send support related email to: netdev@vger.kernel.org 8276333Sian * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html 9276333Sian * 10276333Sian * Fixes: 11276333Sian * Fix for packet capture - Nick Eggleston <nick@dccinc.com>; 12276333Sian * Add HW acceleration hooks - David S. Miller <davem@redhat.com>; 13276333Sian * Correct all the locking - David S. Miller <davem@redhat.com>; 14276333Sian * Use hash table for VLAN groups - David S. Miller <davem@redhat.com> 15276333Sian */ 16276333Sian 17276333Sian#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 18276333Sian 19276333Sian#include <linux/capability.h> 20276333Sian#include <linux/module.h> 21276333Sian#include <linux/netdevice.h> 22276333Sian#include <linux/skbuff.h> 23276333Sian#include <linux/slab.h> 24276333Sian#include <linux/init.h> 25276333Sian#include <linux/rculist.h> 26276333Sian#include <net/p8022.h> 27276333Sian#include <net/arp.h> 28276333Sian#include <linux/rtnetlink.h> 29276333Sian#include <linux/notifier.h> 30276333Sian#include <net/rtnetlink.h> 31276333Sian#include <net/net_namespace.h> 32282767Sandrew#include <net/netns/generic.h> 33282767Sandrew#include <linux/uaccess.h> 34282767Sandrew 35295315Smmel#include <linux/if_vlan.h> 36282767Sandrew#include "vlan.h" 37295315Smmel#include "vlanproc.h" 38295315Smmel 39295315Smmel#define DRV_VERSION "1.8" 40295315Smmel 41276333Sian/* Global VLAN variables */ 42295315Smmel 43295315Smmelunsigned int vlan_net_id __read_mostly; 44295315Smmel 45295315Smmelconst char vlan_fullname[] = "802.1Q VLAN Support"; 46276333Sianconst char vlan_version[] = DRV_VERSION; 47276333Sian 48295319Smmel/* End of global variables definitions. */ 49279811Sian 50279811Sianstatic int vlan_group_prealloc_vid(struct vlan_group *vg, 51279811Sian __be16 vlan_proto, u16 vlan_id) 52295315Smmel{ 53295315Smmel struct net_device **array; 54295315Smmel unsigned int vidx; 55295315Smmel unsigned int size; 56295315Smmel int pidx; 57295315Smmel 58295315Smmel ASSERT_RTNL(); 59307344Smmel 60307344Smmel pidx = vlan_proto_idx(vlan_proto); 61295315Smmel if (pidx < 0) 62276333Sian return -EINVAL; 63276333Sian 64276333Sian vidx = vlan_id / VLAN_GROUP_ARRAY_PART_LEN; 65276333Sian array = vg->vlan_devices_arrays[pidx][vidx]; 66276333Sian if (array != NULL) 67276333Sian return 0; 68328966Smmel 69276333Sian size = sizeof(struct net_device *) * VLAN_GROUP_ARRAY_PART_LEN; 70276333Sian array = kzalloc(size, GFP_KERNEL_ACCOUNT); 71328966Smmel if (array == NULL) 72276333Sian return -ENOBUFS; 73276333Sian 74276333Sian /* paired with smp_rmb() in __vlan_group_get_device() */ 75276333Sian smp_wmb(); 76280985Sandrew 77280985Sandrew vg->vlan_devices_arrays[pidx][vidx] = array; 78280985Sandrew return 0; 79280985Sandrew} 80280985Sandrew 81280985Sandrewstatic void vlan_stacked_transfer_operstate(const struct net_device *rootdev, 82280985Sandrew struct net_device *dev, 83280985Sandrew struct vlan_dev_priv *vlan) 84280985Sandrew{ 85276333Sian if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING)) 86276333Sian netif_stacked_transfer_operstate(rootdev, dev); 87276333Sian} 88276333Sian 89276333Sianvoid unregister_vlan_dev(struct net_device *dev, struct list_head *head) 90276333Sian{ 91276333Sian struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 92276333Sian struct net_device *real_dev = vlan->real_dev; 93276333Sian struct vlan_info *vlan_info; 94328966Smmel struct vlan_group *grp; 95276333Sian u16 vlan_id = vlan->vlan_id; 96276333Sian 97276333Sian ASSERT_RTNL(); 98276333Sian 99280985Sandrew vlan_info = rtnl_dereference(real_dev->vlan_info); 100280985Sandrew BUG_ON(!vlan_info); 101280985Sandrew 102280985Sandrew grp = &vlan_info->grp; 103280985Sandrew 104280985Sandrew grp->nr_vlan_devs--; 105280985Sandrew 106276333Sian if (vlan->flags & VLAN_FLAG_MVRP) 107276333Sian vlan_mvrp_request_leave(dev); 108276333Sian if (vlan->flags & VLAN_FLAG_GVRP) 109276333Sian vlan_gvrp_request_leave(dev); 110276333Sian 111276333Sian vlan_group_set_device(grp, vlan->vlan_proto, vlan_id, NULL); 112276333Sian 113276333Sian netdev_upper_dev_unlink(real_dev, dev); 114276333Sian /* Because unregister_netdevice_queue() makes sure at least one rcu 115276333Sian * grace period is respected before device freeing, 116276333Sian * we dont need to call synchronize_net() here. 117276333Sian */ 118276333Sian unregister_netdevice_queue(dev, head); 119276333Sian 120276333Sian if (grp->nr_vlan_devs == 0) { 121276333Sian vlan_mvrp_uninit_applicant(real_dev); 122276333Sian vlan_gvrp_uninit_applicant(real_dev); 123276333Sian } 124276333Sian 125276333Sian vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id); 126276333Sian} 127276333Sian 128276333Sianint vlan_check_real_dev(struct net_device *real_dev, 129276333Sian __be16 protocol, u16 vlan_id, 130276333Sian struct netlink_ext_ack *extack) 131276333Sian{ 132276333Sian const char *name = real_dev->name; 133276333Sian 134276333Sian if (real_dev->features & NETIF_F_VLAN_CHALLENGED) { 135276333Sian pr_info("VLANs not supported on %s\n", name); 136276333Sian NL_SET_ERR_MSG_MOD(extack, "VLANs not supported on device"); 137276333Sian return -EOPNOTSUPP; 138276333Sian } 139276333Sian 140276333Sian if (vlan_find_dev(real_dev, protocol, vlan_id) != NULL) { 141276333Sian NL_SET_ERR_MSG_MOD(extack, "VLAN device already exists"); 142276333Sian return -EEXIST; 143276333Sian } 144276333Sian 145276333Sian return 0; 146276333Sian} 147276333Sian 148276333Sianint register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack) 149276333Sian{ 150276333Sian struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 151276333Sian struct net_device *real_dev = vlan->real_dev; 152276333Sian u16 vlan_id = vlan->vlan_id; 153276333Sian struct vlan_info *vlan_info; 154276333Sian struct vlan_group *grp; 155294740Szbb int err; 156294740Szbb 157294740Szbb err = vlan_vid_add(real_dev, vlan->vlan_proto, vlan_id); 158294740Szbb if (err) 159294740Szbb return err; 160294740Szbb 161294740Szbb vlan_info = rtnl_dereference(real_dev->vlan_info); 162294740Szbb /* vlan_info should be there now. vlan_vid_add took care of it */ 163294740Szbb BUG_ON(!vlan_info); 164294740Szbb 165294740Szbb grp = &vlan_info->grp; 166294740Szbb if (grp->nr_vlan_devs == 0) { 167276333Sian err = vlan_gvrp_init_applicant(real_dev); 168276333Sian if (err < 0) 169283365Sandrew goto out_vid_del; 170283365Sandrew err = vlan_mvrp_init_applicant(real_dev); 171276333Sian if (err < 0) 172276333Sian goto out_uninit_gvrp; 173276333Sian } 174276333Sian 175276333Sian err = vlan_group_prealloc_vid(grp, vlan->vlan_proto, vlan_id); 176276333Sian if (err < 0) 177276333Sian goto out_uninit_mvrp; 178276333Sian 179282547Szbb err = register_netdevice(dev); 180276333Sian if (err < 0) 181283365Sandrew goto out_uninit_mvrp; 182283365Sandrew 183290656Sskra err = netdev_upper_dev_link(real_dev, dev, extack); 184290656Sskra if (err) 185298455Sskra goto out_unregister_netdev; 186298455Sskra 187290656Sskra vlan_stacked_transfer_operstate(real_dev, dev, vlan); 188282547Szbb linkwatch_fire_event(dev); /* _MUST_ call rfc2863_policy() */ 189276333Sian 190276333Sian /* So, got the sucker initialized, now lets place 191276333Sian * it into our local structure. 192276333Sian */ 193276333Sian vlan_group_set_device(grp, vlan->vlan_proto, vlan_id, dev); 194276333Sian grp->nr_vlan_devs++; 195276333Sian 196276333Sian return 0; 197283365Sandrew 198283365Sandrewout_unregister_netdev: 199276333Sian unregister_netdevice(dev); 200283365Sandrewout_uninit_mvrp: 201276333Sian if (grp->nr_vlan_devs == 0) 202276333Sian vlan_mvrp_uninit_applicant(real_dev); 203276333Sianout_uninit_gvrp: 204276333Sian if (grp->nr_vlan_devs == 0) 205276333Sian vlan_gvrp_uninit_applicant(real_dev); 206276333Sianout_vid_del: 207276333Sian vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id); 208276333Sian return err; 209276333Sian} 210276333Sian 211276333Sian/* Attach a VLAN device to a mac address (ie Ethernet Card). 212276333Sian * Returns 0 if the device was created or a negative error code otherwise. 213276333Sian */ 214276333Sianstatic int register_vlan_device(struct net_device *real_dev, u16 vlan_id) 215276333Sian{ 216276333Sian struct net_device *new_dev; 217276803Sian struct vlan_dev_priv *vlan; 218276803Sian struct net *net = dev_net(real_dev); 219276803Sian struct vlan_net *vn = net_generic(net, vlan_net_id); 220283365Sandrew char name[IFNAMSIZ]; 221283365Sandrew int err; 222283365Sandrew 223283365Sandrew if (vlan_id >= VLAN_VID_MASK) 224276803Sian return -ERANGE; 225276803Sian 226276803Sian err = vlan_check_real_dev(real_dev, htons(ETH_P_8021Q), vlan_id, 227276803Sian NULL); 228276803Sian if (err < 0) 229276803Sian return err; 230276803Sian 231276803Sian /* Gotta set up the fields for the device. */ 232276803Sian switch (vn->name_type) { 233276803Sian case VLAN_NAME_TYPE_RAW_PLUS_VID: 234276803Sian /* name will look like: eth1.0005 */ 235276803Sian snprintf(name, IFNAMSIZ, "%s.%.4i", real_dev->name, vlan_id); 236276803Sian break; 237276803Sian case VLAN_NAME_TYPE_PLUS_VID_NO_PAD: 238276803Sian /* Put our vlan.VID in the name. 239276803Sian * Name will look like: vlan5 240276803Sian */ 241276803Sian snprintf(name, IFNAMSIZ, "vlan%i", vlan_id); 242276803Sian break; 243276803Sian case VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD: 244276803Sian /* Put our vlan.VID in the name. 245276803Sian * Name will look like: eth0.5 246276803Sian */ 247276803Sian snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id); 248276803Sian break; 249276803Sian case VLAN_NAME_TYPE_PLUS_VID: 250277415Sandrew /* Put our vlan.VID in the name. 251277415Sandrew * Name will look like: vlan0005 252277415Sandrew */ 253277415Sandrew default: 254277415Sandrew snprintf(name, IFNAMSIZ, "vlan%.4i", vlan_id); 255277415Sandrew } 256277415Sandrew 257280985Sandrew new_dev = alloc_netdev(sizeof(struct vlan_dev_priv), name, 258280985Sandrew NET_NAME_UNKNOWN, vlan_setup); 259280985Sandrew 260280985Sandrew if (new_dev == NULL) 261280985Sandrew return -ENOBUFS; 262280985Sandrew 263280985Sandrew dev_net_set(new_dev, net); 264280985Sandrew /* need 4 bytes for extra VLAN header info, 265280985Sandrew * hope the underlying device can handle it. 266280985Sandrew */ 267280985Sandrew new_dev->mtu = real_dev->mtu; 268280985Sandrew 269280985Sandrew vlan = vlan_dev_priv(new_dev); 270280985Sandrew vlan->vlan_proto = htons(ETH_P_8021Q); 271280985Sandrew vlan->vlan_id = vlan_id; 272280985Sandrew vlan->real_dev = real_dev; 273280985Sandrew vlan->dent = NULL; 274280985Sandrew vlan->flags = VLAN_FLAG_REORDER_HDR; 275280985Sandrew 276280985Sandrew new_dev->rtnl_link_ops = &vlan_link_ops; 277280985Sandrew err = register_vlan_dev(new_dev, NULL); 278280985Sandrew if (err < 0) 279280985Sandrew goto out_free_newdev; 280280985Sandrew 281280985Sandrew return 0; 282280985Sandrew 283280985Sandrewout_free_newdev: 284280985Sandrew free_netdev(new_dev); 285280985Sandrew return err; 286280985Sandrew} 287280985Sandrew 288276333Sianstatic void vlan_sync_address(struct net_device *dev, 289276333Sian struct net_device *vlandev) 290276333Sian{ 291276333Sian struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev); 292276333Sian 293276334Sian /* May be called without an actual change */ 294276334Sian if (ether_addr_equal(vlan->real_dev_addr, dev->dev_addr)) 295276334Sian return; 296276334Sian 297276334Sian /* vlan continues to inherit address of lower device */ 298276334Sian if (vlan_dev_inherit_address(vlandev, dev)) 299276334Sian goto out; 300276334Sian 301276334Sian /* vlan address was different from the old address and is equal to 302276334Sian * the new address */ 303276334Sian if (!ether_addr_equal(vlandev->dev_addr, vlan->real_dev_addr) && 304276334Sian ether_addr_equal(vlandev->dev_addr, dev->dev_addr)) 305276334Sian dev_uc_del(dev, vlandev->dev_addr); 306276334Sian 307276334Sian /* vlan address was equal to the old address and is different from 308276334Sian * the new address */ 309276334Sian if (ether_addr_equal(vlandev->dev_addr, vlan->real_dev_addr) && 310276334Sian !ether_addr_equal(vlandev->dev_addr, dev->dev_addr)) 311276334Sian dev_uc_add(dev, vlandev->dev_addr); 312276334Sian 313276334Sianout: 314276334Sian ether_addr_copy(vlan->real_dev_addr, dev->dev_addr); 315276334Sian} 316276334Sian 317276334Sianstatic void vlan_transfer_features(struct net_device *dev, 318276334Sian struct net_device *vlandev) 319276334Sian{ 320276334Sian struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev); 321282984Sian 322276334Sian netif_inherit_tso_max(vlandev, dev); 323276334Sian 324282984Sian if (vlan_hw_offload_capable(dev->features, vlan->vlan_proto)) 325282984Sian vlandev->hard_header_len = dev->hard_header_len; 326276334Sian else 327282984Sian vlandev->hard_header_len = dev->hard_header_len + VLAN_HLEN; 328276334Sian 329276334Sian#if IS_ENABLED(CONFIG_FCOE) 330276334Sian vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid; 331276334Sian#endif 332276334Sian 333282984Sian vlandev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 334276334Sian vlandev->priv_flags |= (vlan->real_dev->priv_flags & IFF_XMIT_DST_RELEASE); 335282984Sian vlandev->hw_enc_features = vlan_tnl_features(vlan->real_dev); 336276334Sian 337282984Sian netdev_update_features(vlandev); 338282984Sian} 339282984Sian 340282984Sianstatic int __vlan_device_event(struct net_device *dev, unsigned long event) 341276334Sian{ 342282984Sian int err = 0; 343282984Sian 344276334Sian switch (event) { 345276334Sian case NETDEV_CHANGENAME: 346276334Sian vlan_proc_rem_dev(dev); 347276334Sian err = vlan_proc_add_dev(dev); 348276803Sian break; 349276334Sian case NETDEV_REGISTER: 350276334Sian err = vlan_proc_add_dev(dev); 351276334Sian break; 352276334Sian case NETDEV_UNREGISTER: 353276334Sian vlan_proc_rem_dev(dev); 354276334Sian break; 355276334Sian } 356276334Sian 357276334Sian return err; 358276334Sian} 359276334Sian 360276340Sianstatic int vlan_device_event(struct notifier_block *unused, unsigned long event, 361276334Sian void *ptr) 362276334Sian{ 363276334Sian struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(ptr); 364276334Sian struct net_device *dev = netdev_notifier_info_to_dev(ptr); 365276334Sian struct vlan_group *grp; 366276334Sian struct vlan_info *vlan_info; 367276334Sian int i, flgs; 368276334Sian struct net_device *vlandev; 369282984Sian struct vlan_dev_priv *vlan; 370276334Sian bool last = false; 371276334Sian LIST_HEAD(list); 372282984Sian int err; 373282984Sian 374276334Sian if (is_vlan_dev(dev)) { 375282984Sian int err = __vlan_device_event(dev, event); 376276334Sian 377276334Sian if (err) 378276334Sian return notifier_from_errno(err); 379276334Sian } 380282984Sian 381276334Sian if ((event == NETDEV_UP) && 382282984Sian (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) { 383276334Sian pr_info("adding VLAN 0 to HW filter on device %s\n", 384282984Sian dev->name); 385282984Sian vlan_vid_add(dev, htons(ETH_P_8021Q), 0); 386282984Sian } 387282984Sian if (event == NETDEV_DOWN && 388276334Sian (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) 389282984Sian vlan_vid_del(dev, htons(ETH_P_8021Q), 0); 390276334Sian 391276334Sian vlan_info = rtnl_dereference(dev->vlan_info); 392276334Sian if (!vlan_info) 393276803Sian goto out; 394276803Sian grp = &vlan_info->grp; 395276803Sian 396276803Sian /* It is OK that we do not hold the group lock right now, 397282984Sian * as we run under the RTNL lock. 398282984Sian */ 399276803Sian 400276334Sian switch (event) { 401276334Sian case NETDEV_CHANGE: 402276334Sian /* Propagate real device state to vlan devices */ 403276334Sian vlan_group_for_each_dev(grp, i, vlandev) 404276334Sian vlan_stacked_transfer_operstate(dev, vlandev, 405276334Sian vlan_dev_priv(vlandev)); 406276334Sian break; 407276334Sian 408282984Sian case NETDEV_CHANGEADDR: 409276334Sian /* Adjust unicast filters on underlying device */ 410282984Sian vlan_group_for_each_dev(grp, i, vlandev) { 411276334Sian flgs = vlandev->flags; 412276334Sian if (!(flgs & IFF_UP)) 413282984Sian continue; 414282984Sian 415276803Sian vlan_sync_address(dev, vlandev); 416276334Sian } 417276334Sian break; 418276334Sian 419276334Sian case NETDEV_CHANGEMTU: 420276334Sian vlan_group_for_each_dev(grp, i, vlandev) { 421276334Sian if (vlandev->mtu <= dev->mtu) 422276803Sian continue; 423276334Sian 424276334Sian dev_set_mtu(vlandev, dev->mtu); 425276334Sian } 426276334Sian break; 427276334Sian 428276334Sian case NETDEV_FEAT_CHANGE: 429276334Sian /* Propagate device features to underlying device */ 430276334Sian vlan_group_for_each_dev(grp, i, vlandev) 431276334Sian vlan_transfer_features(dev, vlandev); 432276334Sian break; 433276334Sian 434276334Sian case NETDEV_DOWN: { 435276803Sian struct net_device *tmp; 436276334Sian LIST_HEAD(close_list); 437276334Sian 438276334Sian /* Put all VLANs for this dev in the down state too. */ 439276334Sian vlan_group_for_each_dev(grp, i, vlandev) { 440276334Sian flgs = vlandev->flags; 441276334Sian if (!(flgs & IFF_UP)) 442276334Sian continue; 443276334Sian 444279811Sian vlan = vlan_dev_priv(vlandev); 445279811Sian if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING)) 446279811Sian list_add(&vlandev->close_list, &close_list); 447279811Sian } 448279811Sian 449279811Sian dev_close_many(&close_list, false); 450279811Sian 451279811Sian list_for_each_entry_safe(vlandev, tmp, &close_list, close_list) { 452279811Sian vlan_stacked_transfer_operstate(dev, vlandev, 453279811Sian vlan_dev_priv(vlandev)); 454279811Sian list_del_init(&vlandev->close_list); 455279811Sian } 456279811Sian list_del(&close_list); 457276334Sian break; 458276334Sian } 459282984Sian case NETDEV_UP: 460276334Sian /* Put all VLANs for this dev in the up state too. */ 461282984Sian vlan_group_for_each_dev(grp, i, vlandev) { 462276334Sian flgs = dev_get_flags(vlandev); 463276334Sian if (flgs & IFF_UP) 464282984Sian continue; 465282984Sian 466276803Sian vlan = vlan_dev_priv(vlandev); 467276334Sian if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING)) 468276334Sian dev_change_flags(vlandev, flgs | IFF_UP, 469276334Sian extack); 470276334Sian vlan_stacked_transfer_operstate(dev, vlandev, vlan); 471276334Sian } 472276334Sian break; 473276334Sian 474276334Sian case NETDEV_UNREGISTER: 475282984Sian /* twiddle thumbs on netns device moves */ 476282984Sian if (dev->reg_state != NETREG_UNREGISTERING) 477282984Sian break; 478282984Sian 479282984Sian vlan_group_for_each_dev(grp, i, vlandev) { 480282984Sian /* removal of last vid destroys vlan_info, abort 481282984Sian * afterwards */ 482282984Sian if (vlan_info->nr_vids == 1) 483276334Sian last = true; 484282984Sian 485276334Sian unregister_vlan_dev(vlandev, &list); 486282984Sian if (last) 487276334Sian break; 488276334Sian } 489282984Sian unregister_netdevice_many(&list); 490282984Sian break; 491276334Sian 492282984Sian case NETDEV_PRE_TYPE_CHANGE: 493282984Sian /* Forbid underlaying device to change its type. */ 494282984Sian if (vlan_uses_dev(dev)) 495276334Sian return NOTIFY_BAD; 496276334Sian break; 497276334Sian 498276334Sian case NETDEV_NOTIFY_PEERS: 499276334Sian case NETDEV_BONDING_FAILOVER: 500282984Sian case NETDEV_RESEND_IGMP: 501289887Sian /* Propagate to vlan devices */ 502289759Sjah vlan_group_for_each_dev(grp, i, vlandev) 503289887Sian call_netdevice_notifiers(event, vlandev); 504289887Sian break; 505289887Sian 506289887Sian case NETDEV_CVLAN_FILTER_PUSH_INFO: 507289887Sian err = vlan_filter_push_vids(vlan_info, htons(ETH_P_8021Q)); 508289887Sian if (err) 509289759Sjah return notifier_from_errno(err); 510289759Sjah break; 511289887Sian 512289759Sjah case NETDEV_CVLAN_FILTER_DROP_INFO: 513289759Sjah vlan_filter_drop_vids(vlan_info, htons(ETH_P_8021Q)); 514289759Sjah break; 515289759Sjah 516289759Sjah case NETDEV_SVLAN_FILTER_PUSH_INFO: 517289759Sjah err = vlan_filter_push_vids(vlan_info, htons(ETH_P_8021AD)); 518289759Sjah if (err) 519289759Sjah return notifier_from_errno(err); 520289759Sjah break; 521289759Sjah 522289759Sjah case NETDEV_SVLAN_FILTER_DROP_INFO: 523289759Sjah vlan_filter_drop_vids(vlan_info, htons(ETH_P_8021AD)); 524289759Sjah break; 525289759Sjah } 526289759Sjah 527289759Sjahout: 528282984Sian return NOTIFY_DONE; 529282984Sian} 530282984Sian 531282984Sianstatic struct notifier_block vlan_notifier_block __read_mostly = { 532282984Sian .notifier_call = vlan_device_event, 533282984Sian}; 534276334Sian 535282984Sian/* 536276334Sian * VLAN IOCTL handler. 537282984Sian * o execute requested action or pass command to the device driver 538276334Sian * arg is really a struct vlan_ioctl_args __user *. 539276334Sian */ 540282984Sianstatic int vlan_ioctl_handler(struct net *net, void __user *arg) 541282984Sian{ 542276334Sian int err; 543276334Sian struct vlan_ioctl_args args; 544276334Sian struct net_device *dev = NULL; 545276334Sian 546276334Sian if (copy_from_user(&args, arg, sizeof(struct vlan_ioctl_args))) 547276334Sian return -EFAULT; 548276334Sian 549276334Sian /* Null terminate this sucker, just in case. */ 550276334Sian args.device1[sizeof(args.device1) - 1] = 0; 551276334Sian args.u.device2[sizeof(args.u.device2) - 1] = 0; 552276334Sian 553276334Sian rtnl_lock(); 554276334Sian 555276334Sian switch (args.cmd) { 556276334Sian case SET_VLAN_INGRESS_PRIORITY_CMD: 557276334Sian case SET_VLAN_EGRESS_PRIORITY_CMD: 558282984Sian case SET_VLAN_FLAG_CMD: 559282984Sian case ADD_VLAN_CMD: 560276334Sian case DEL_VLAN_CMD: 561276334Sian case GET_VLAN_REALDEV_NAME_CMD: 562276334Sian case GET_VLAN_VID_CMD: 563276334Sian err = -ENODEV; 564276334Sian dev = __dev_get_by_name(net, args.device1); 565276334Sian if (!dev) 566276334Sian goto out; 567276334Sian 568282984Sian err = -EINVAL; 569282984Sian if (args.cmd != ADD_VLAN_CMD && !is_vlan_dev(dev)) 570276334Sian goto out; 571276334Sian } 572276334Sian 573276334Sian switch (args.cmd) { 574276334Sian case SET_VLAN_INGRESS_PRIORITY_CMD: 575276334Sian err = -EPERM; 576276334Sian if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 577276334Sian break; 578276334Sian vlan_dev_set_ingress_priority(dev, 579276334Sian args.u.skb_priority, 580276334Sian args.vlan_qos); 581276334Sian err = 0; 582276334Sian break; 583276334Sian 584276334Sian case SET_VLAN_EGRESS_PRIORITY_CMD: 585276334Sian err = -EPERM; 586276334Sian if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 587282767Sandrew break; 588298455Sskra err = vlan_dev_set_egress_priority(dev, 589298455Sskra args.u.skb_priority, 590298455Sskra args.vlan_qos); 591298455Sskra break; 592298455Sskra 593298455Sskra case SET_VLAN_FLAG_CMD: 594298455Sskra err = -EPERM; 595298455Sskra if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 596298455Sskra break; 597298455Sskra err = vlan_dev_change_flags(dev, 598298455Sskra args.vlan_qos ? args.u.flag : 0, 599298455Sskra args.u.flag); 600298455Sskra break; 601298455Sskra 602298455Sskra case SET_VLAN_NAME_TYPE_CMD: 603298455Sskra err = -EPERM; 604298455Sskra if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 605298455Sskra break; 606298455Sskra if (args.u.name_type < VLAN_NAME_TYPE_HIGHEST) { 607298455Sskra struct vlan_net *vn; 608298455Sskra 609298455Sskra vn = net_generic(net, vlan_net_id); 610298455Sskra vn->name_type = args.u.name_type; 611298455Sskra err = 0; 612298455Sskra } else { 613298455Sskra err = -EINVAL; 614298455Sskra } 615298455Sskra break; 616298455Sskra 617298455Sskra case ADD_VLAN_CMD: 618298455Sskra err = -EPERM; 619298455Sskra if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 620298455Sskra break; 621298455Sskra err = register_vlan_device(dev, args.u.VID); 622298455Sskra break; 623298455Sskra 624298455Sskra case DEL_VLAN_CMD: 625298455Sskra err = -EPERM; 626298455Sskra if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 627298455Sskra break; 628298455Sskra unregister_vlan_dev(dev, NULL); 629298455Sskra err = 0; 630298455Sskra break; 631298455Sskra 632298455Sskra case GET_VLAN_REALDEV_NAME_CMD: 633298455Sskra err = 0; 634298455Sskra vlan_dev_get_realdev_name(dev, args.u.device2, 635276333Sian sizeof(args.u.device2)); 636 if (copy_to_user(arg, &args, 637 sizeof(struct vlan_ioctl_args))) 638 err = -EFAULT; 639 break; 640 641 case GET_VLAN_VID_CMD: 642 err = 0; 643 args.u.VID = vlan_dev_vlan_id(dev); 644 if (copy_to_user(arg, &args, 645 sizeof(struct vlan_ioctl_args))) 646 err = -EFAULT; 647 break; 648 649 default: 650 err = -EOPNOTSUPP; 651 break; 652 } 653out: 654 rtnl_unlock(); 655 return err; 656} 657 658static int __net_init vlan_init_net(struct net *net) 659{ 660 struct vlan_net *vn = net_generic(net, vlan_net_id); 661 int err; 662 663 vn->name_type = VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD; 664 665 err = vlan_proc_init(net); 666 667 return err; 668} 669 670static void __net_exit vlan_exit_net(struct net *net) 671{ 672 vlan_proc_cleanup(net); 673} 674 675static struct pernet_operations vlan_net_ops = { 676 .init = vlan_init_net, 677 .exit = vlan_exit_net, 678 .id = &vlan_net_id, 679 .size = sizeof(struct vlan_net), 680}; 681 682static int __init vlan_proto_init(void) 683{ 684 int err; 685 686 pr_info("%s v%s\n", vlan_fullname, vlan_version); 687 688 err = register_pernet_subsys(&vlan_net_ops); 689 if (err < 0) 690 goto err0; 691 692 err = register_netdevice_notifier(&vlan_notifier_block); 693 if (err < 0) 694 goto err2; 695 696 err = vlan_gvrp_init(); 697 if (err < 0) 698 goto err3; 699 700 err = vlan_mvrp_init(); 701 if (err < 0) 702 goto err4; 703 704 err = vlan_netlink_init(); 705 if (err < 0) 706 goto err5; 707 708 vlan_ioctl_set(vlan_ioctl_handler); 709 return 0; 710 711err5: 712 vlan_mvrp_uninit(); 713err4: 714 vlan_gvrp_uninit(); 715err3: 716 unregister_netdevice_notifier(&vlan_notifier_block); 717err2: 718 unregister_pernet_subsys(&vlan_net_ops); 719err0: 720 return err; 721} 722 723static void __exit vlan_cleanup_module(void) 724{ 725 vlan_ioctl_set(NULL); 726 727 vlan_netlink_fini(); 728 729 unregister_netdevice_notifier(&vlan_notifier_block); 730 731 unregister_pernet_subsys(&vlan_net_ops); 732 rcu_barrier(); /* Wait for completion of call_rcu()'s */ 733 734 vlan_mvrp_uninit(); 735 vlan_gvrp_uninit(); 736} 737 738module_init(vlan_proto_init); 739module_exit(vlan_cleanup_module); 740 741MODULE_DESCRIPTION("802.1Q/802.1ad VLAN Protocol"); 742MODULE_LICENSE("GPL"); 743MODULE_VERSION(DRV_VERSION); 744