Branch data Line data Source code
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 : : 14 : : enum 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 : : 21 : : static 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 : : 27 : 0 : int vlan_gvrp_request_join(const struct net_device *dev) 28 : : { 29 : : const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 30 : 0 : __be16 vlan_id = htons(vlan->vlan_id); 31 : : 32 : 0 : if (vlan->vlan_proto != htons(ETH_P_8021Q)) 33 : : return 0; 34 : 0 : return garp_request_join(vlan->real_dev, &vlan_gvrp_app, 35 : : &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); 36 : : } 37 : : 38 : 0 : void vlan_gvrp_request_leave(const struct net_device *dev) 39 : : { 40 : : const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 41 : 0 : __be16 vlan_id = htons(vlan->vlan_id); 42 : : 43 : 0 : if (vlan->vlan_proto != htons(ETH_P_8021Q)) 44 : 0 : return; 45 : 0 : garp_request_leave(vlan->real_dev, &vlan_gvrp_app, 46 : : &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); 47 : : } 48 : : 49 : 0 : int vlan_gvrp_init_applicant(struct net_device *dev) 50 : : { 51 : 0 : return garp_init_applicant(dev, &vlan_gvrp_app); 52 : : } 53 : : 54 : 0 : void vlan_gvrp_uninit_applicant(struct net_device *dev) 55 : : { 56 : 0 : garp_uninit_applicant(dev, &vlan_gvrp_app); 57 : 0 : } 58 : : 59 : 3 : int __init vlan_gvrp_init(void) 60 : : { 61 : 3 : return garp_register_application(&vlan_gvrp_app); 62 : : } 63 : : 64 : 0 : void vlan_gvrp_uninit(void) 65 : : { 66 : 0 : garp_unregister_application(&vlan_gvrp_app); 67 : 0 : }