vlan_gvrp.c (1637B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * IEEE 802.1Q GARP VLAN Registration Protocol (GVRP) 4 * 5 * Copyright (c) 2008 Patrick McHardy <kaber@trash.net> 6 */ 7#include <linux/types.h> 8#include <linux/if_vlan.h> 9#include <net/garp.h> 10#include "vlan.h" 11 12#define GARP_GVRP_ADDRESS { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x21 } 13 14enum gvrp_attributes { 15 GVRP_ATTR_INVALID, 16 GVRP_ATTR_VID, 17 __GVRP_ATTR_MAX 18}; 19#define GVRP_ATTR_MAX (__GVRP_ATTR_MAX - 1) 20 21static struct garp_application vlan_gvrp_app __read_mostly = { 22 .proto.group_address = GARP_GVRP_ADDRESS, 23 .maxattr = GVRP_ATTR_MAX, 24 .type = GARP_APPLICATION_GVRP, 25}; 26 27int vlan_gvrp_request_join(const struct net_device *dev) 28{ 29 const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 30 __be16 vlan_id = htons(vlan->vlan_id); 31 32 if (vlan->vlan_proto != htons(ETH_P_8021Q)) 33 return 0; 34 return garp_request_join(vlan->real_dev, &vlan_gvrp_app, 35 &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); 36} 37 38void vlan_gvrp_request_leave(const struct net_device *dev) 39{ 40 const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 41 __be16 vlan_id = htons(vlan->vlan_id); 42 43 if (vlan->vlan_proto != htons(ETH_P_8021Q)) 44 return; 45 garp_request_leave(vlan->real_dev, &vlan_gvrp_app, 46 &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); 47} 48 49int vlan_gvrp_init_applicant(struct net_device *dev) 50{ 51 return garp_init_applicant(dev, &vlan_gvrp_app); 52} 53 54void vlan_gvrp_uninit_applicant(struct net_device *dev) 55{ 56 garp_uninit_applicant(dev, &vlan_gvrp_app); 57} 58 59int __init vlan_gvrp_init(void) 60{ 61 return garp_register_application(&vlan_gvrp_app); 62} 63 64void vlan_gvrp_uninit(void) 65{ 66 garp_unregister_application(&vlan_gvrp_app); 67}