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