Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86fbe9bb authored by David Ward's avatar David Ward Committed by David S. Miller
Browse files

net/8021q: Implement Multiple VLAN Registration Protocol (MVRP)



Initial implementation of the Multiple VLAN Registration Protocol
(MVRP) from IEEE 802.1Q-2011, based on the existing implementation
of the GARP VLAN Registration Protocol (GVRP).

Signed-off-by: default avatarDavid Ward <david.ward@ll.mit.edu>
Acked-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent febf018d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@
#define ETH_P_802_EX1	0x88B5		/* 802.1 Local Experimental 1.  */
#define ETH_P_TIPC	0x88CA		/* TIPC 			*/
#define ETH_P_8021AH	0x88E7          /* 802.1ah Backbone Service Tag */
#define ETH_P_MVRP	0x88F5          /* 802.1Q MVRP                  */
#define ETH_P_1588	0x88F7		/* IEEE 1588 Timesync */
#define ETH_P_FCOE	0x8906		/* Fibre Channel over Ethernet  */
#define ETH_P_TDLS	0x890D          /* TDLS */
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ enum vlan_flags {
	VLAN_FLAG_REORDER_HDR	= 0x1,
	VLAN_FLAG_GVRP		= 0x2,
	VLAN_FLAG_LOOSE_BINDING	= 0x4,
	VLAN_FLAG_MVRP		= 0x8,
};

enum vlan_name_types {
+11 −0
Original line number Diff line number Diff line
@@ -27,3 +27,14 @@ config VLAN_8021Q_GVRP
	  automatic propagation of registered VLANs to switches.

	  If unsure, say N.

config VLAN_8021Q_MVRP
	bool "MVRP (Multiple VLAN Registration Protocol) support"
	depends on VLAN_8021Q
	select MRP
	help
	  Select this to enable MVRP end-system support. MVRP is used for
	  automatic propagation of registered VLANs to switches; it
	  supersedes GVRP and is not backwards-compatible.

	  If unsure, say N.
+1 −0
Original line number Diff line number Diff line
@@ -6,5 +6,6 @@ obj-$(CONFIG_VLAN_8021Q) += 8021q.o

8021q-y					:= vlan.o vlan_dev.o vlan_netlink.o
8021q-$(CONFIG_VLAN_8021Q_GVRP)		+= vlan_gvrp.o
8021q-$(CONFIG_VLAN_8021Q_MVRP)		+= vlan_mvrp.o
8021q-$(CONFIG_PROC_FS)			+= vlanproc.o
+22 −5
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)

	grp->nr_vlan_devs--;

	if (vlan->flags & VLAN_FLAG_MVRP)
		vlan_mvrp_request_leave(dev);
	if (vlan->flags & VLAN_FLAG_GVRP)
		vlan_gvrp_request_leave(dev);

@@ -107,8 +109,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)

	netdev_upper_dev_unlink(real_dev, dev);

	if (grp->nr_vlan_devs == 0)
	if (grp->nr_vlan_devs == 0) {
		vlan_mvrp_uninit_applicant(real_dev);
		vlan_gvrp_uninit_applicant(real_dev);
	}

	/* Get rid of the vlan's reference to real_dev */
	dev_put(real_dev);
@@ -151,15 +155,18 @@ int register_vlan_dev(struct net_device *dev)
		err = vlan_gvrp_init_applicant(real_dev);
		if (err < 0)
			goto out_vid_del;
		err = vlan_mvrp_init_applicant(real_dev);
		if (err < 0)
			goto out_uninit_gvrp;
	}

	err = vlan_group_prealloc_vid(grp, vlan_id);
	if (err < 0)
		goto out_uninit_applicant;
		goto out_uninit_mvrp;

	err = netdev_upper_dev_link(real_dev, dev);
	if (err)
		goto out_uninit_applicant;
		goto out_uninit_mvrp;

	err = register_netdevice(dev);
	if (err < 0)
@@ -181,7 +188,10 @@ int register_vlan_dev(struct net_device *dev)

out_upper_dev_unlink:
	netdev_upper_dev_unlink(real_dev, dev);
out_uninit_applicant:
out_uninit_mvrp:
	if (grp->nr_vlan_devs == 0)
		vlan_mvrp_uninit_applicant(real_dev);
out_uninit_gvrp:
	if (grp->nr_vlan_devs == 0)
		vlan_gvrp_uninit_applicant(real_dev);
out_vid_del:
@@ -655,13 +665,19 @@ static int __init vlan_proto_init(void)
	if (err < 0)
		goto err3;

	err = vlan_netlink_init();
	err = vlan_mvrp_init();
	if (err < 0)
		goto err4;

	err = vlan_netlink_init();
	if (err < 0)
		goto err5;

	vlan_ioctl_set(vlan_ioctl_handler);
	return 0;

err5:
	vlan_mvrp_uninit();
err4:
	vlan_gvrp_uninit();
err3:
@@ -682,6 +698,7 @@ static void __exit vlan_cleanup_module(void)
	unregister_pernet_subsys(&vlan_net_ops);
	rcu_barrier(); /* Wait for completion of call_rcu()'s */

	vlan_mvrp_uninit();
	vlan_gvrp_uninit();
}

Loading