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