diff options
Diffstat (limited to 'net/8021q/vlan_mvrp.c')
| -rw-r--r-- | net/8021q/vlan_mvrp.c | 76 | 
1 files changed, 76 insertions, 0 deletions
diff --git a/net/8021q/vlan_mvrp.c b/net/8021q/vlan_mvrp.c new file mode 100644 index 00000000000..e0fe091801b --- /dev/null +++ b/net/8021q/vlan_mvrp.c @@ -0,0 +1,76 @@ +/* + *	IEEE 802.1Q Multiple VLAN Registration Protocol (MVRP) + * + *	Copyright (c) 2012 Massachusetts Institute of Technology + * + *	Adapted from code in net/8021q/vlan_gvrp.c + *	Copyright (c) 2008 Patrick McHardy <kaber@trash.net> + * + *	This program is free software; you can redistribute it and/or + *	modify it under the terms of the GNU General Public License + *	version 2 as published by the Free Software Foundation. + */ +#include <linux/types.h> +#include <linux/if_ether.h> +#include <linux/if_vlan.h> +#include <net/mrp.h> +#include "vlan.h" + +#define MRP_MVRP_ADDRESS	{ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x21 } + +enum mvrp_attributes { +	MVRP_ATTR_INVALID, +	MVRP_ATTR_VID, +	__MVRP_ATTR_MAX +}; +#define MVRP_ATTR_MAX	(__MVRP_ATTR_MAX - 1) + +static struct mrp_application vlan_mrp_app __read_mostly = { +	.type		= MRP_APPLICATION_MVRP, +	.maxattr	= MVRP_ATTR_MAX, +	.pkttype.type	= htons(ETH_P_MVRP), +	.group_address	= MRP_MVRP_ADDRESS, +	.version	= 0, +}; + +int vlan_mvrp_request_join(const struct net_device *dev) +{ +	const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); +	__be16 vlan_id = htons(vlan->vlan_id); + +	if (vlan->vlan_proto != htons(ETH_P_8021Q)) +		return 0; +	return mrp_request_join(vlan->real_dev, &vlan_mrp_app, +				&vlan_id, sizeof(vlan_id), MVRP_ATTR_VID); +} + +void vlan_mvrp_request_leave(const struct net_device *dev) +{ +	const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); +	__be16 vlan_id = htons(vlan->vlan_id); + +	if (vlan->vlan_proto != htons(ETH_P_8021Q)) +		return; +	mrp_request_leave(vlan->real_dev, &vlan_mrp_app, +			  &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID); +} + +int vlan_mvrp_init_applicant(struct net_device *dev) +{ +	return mrp_init_applicant(dev, &vlan_mrp_app); +} + +void vlan_mvrp_uninit_applicant(struct net_device *dev) +{ +	mrp_uninit_applicant(dev, &vlan_mrp_app); +} + +int __init vlan_mvrp_init(void) +{ +	return mrp_register_application(&vlan_mrp_app); +} + +void vlan_mvrp_uninit(void) +{ +	mrp_unregister_application(&vlan_mrp_app); +}  | 
