xref: /openbmc/linux/net/8021q/vlan_gvrp.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
270c03b49SPatrick McHardy /*
370c03b49SPatrick McHardy  * 	IEEE 802.1Q GARP VLAN Registration Protocol (GVRP)
470c03b49SPatrick McHardy  *
570c03b49SPatrick McHardy  * 	Copyright (c) 2008 Patrick McHardy <kaber@trash.net>
670c03b49SPatrick McHardy  */
770c03b49SPatrick McHardy #include <linux/types.h>
870c03b49SPatrick McHardy #include <linux/if_vlan.h>
970c03b49SPatrick McHardy #include <net/garp.h>
1070c03b49SPatrick McHardy #include "vlan.h"
1170c03b49SPatrick McHardy 
1270c03b49SPatrick McHardy #define GARP_GVRP_ADDRESS	{ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x21 }
1370c03b49SPatrick McHardy 
1470c03b49SPatrick McHardy enum gvrp_attributes {
1570c03b49SPatrick McHardy 	GVRP_ATTR_INVALID,
1670c03b49SPatrick McHardy 	GVRP_ATTR_VID,
1770c03b49SPatrick McHardy 	__GVRP_ATTR_MAX
1870c03b49SPatrick McHardy };
1970c03b49SPatrick McHardy #define GVRP_ATTR_MAX	(__GVRP_ATTR_MAX - 1)
2070c03b49SPatrick McHardy 
2170c03b49SPatrick McHardy static struct garp_application vlan_gvrp_app __read_mostly = {
2270c03b49SPatrick McHardy 	.proto.group_address	= GARP_GVRP_ADDRESS,
2370c03b49SPatrick McHardy 	.maxattr		= GVRP_ATTR_MAX,
2470c03b49SPatrick McHardy 	.type			= GARP_APPLICATION_GVRP,
2570c03b49SPatrick McHardy };
2670c03b49SPatrick McHardy 
vlan_gvrp_request_join(const struct net_device * dev)2770c03b49SPatrick McHardy int vlan_gvrp_request_join(const struct net_device *dev)
2870c03b49SPatrick McHardy {
297da82c06SJiri Pirko 	const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
309bb8582eSPatrick McHardy 	__be16 vlan_id = htons(vlan->vlan_id);
3170c03b49SPatrick McHardy 
321fd9b1fcSPatrick McHardy 	if (vlan->vlan_proto != htons(ETH_P_8021Q))
331fd9b1fcSPatrick McHardy 		return 0;
3470c03b49SPatrick McHardy 	return garp_request_join(vlan->real_dev, &vlan_gvrp_app,
359bb8582eSPatrick McHardy 				 &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID);
3670c03b49SPatrick McHardy }
3770c03b49SPatrick McHardy 
vlan_gvrp_request_leave(const struct net_device * dev)3870c03b49SPatrick McHardy void vlan_gvrp_request_leave(const struct net_device *dev)
3970c03b49SPatrick McHardy {
407da82c06SJiri Pirko 	const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
419bb8582eSPatrick McHardy 	__be16 vlan_id = htons(vlan->vlan_id);
4270c03b49SPatrick McHardy 
431fd9b1fcSPatrick McHardy 	if (vlan->vlan_proto != htons(ETH_P_8021Q))
441fd9b1fcSPatrick McHardy 		return;
4570c03b49SPatrick McHardy 	garp_request_leave(vlan->real_dev, &vlan_gvrp_app,
469bb8582eSPatrick McHardy 			   &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID);
4770c03b49SPatrick McHardy }
4870c03b49SPatrick McHardy 
vlan_gvrp_init_applicant(struct net_device * dev)4970c03b49SPatrick McHardy int vlan_gvrp_init_applicant(struct net_device *dev)
5070c03b49SPatrick McHardy {
5170c03b49SPatrick McHardy 	return garp_init_applicant(dev, &vlan_gvrp_app);
5270c03b49SPatrick McHardy }
5370c03b49SPatrick McHardy 
vlan_gvrp_uninit_applicant(struct net_device * dev)5470c03b49SPatrick McHardy void vlan_gvrp_uninit_applicant(struct net_device *dev)
5570c03b49SPatrick McHardy {
5670c03b49SPatrick McHardy 	garp_uninit_applicant(dev, &vlan_gvrp_app);
5770c03b49SPatrick McHardy }
5870c03b49SPatrick McHardy 
vlan_gvrp_init(void)5970c03b49SPatrick McHardy int __init vlan_gvrp_init(void)
6070c03b49SPatrick McHardy {
6170c03b49SPatrick McHardy 	return garp_register_application(&vlan_gvrp_app);
6270c03b49SPatrick McHardy }
6370c03b49SPatrick McHardy 
vlan_gvrp_uninit(void)6470c03b49SPatrick McHardy void vlan_gvrp_uninit(void)
6570c03b49SPatrick McHardy {
6670c03b49SPatrick McHardy 	garp_unregister_application(&vlan_gvrp_app);
6770c03b49SPatrick McHardy }
68