1 // SPDX-License-Identifier: GPL-2.0-only << 2 /* 1 /* 3 * IEEE 802.1Q GARP VLAN Registration Pro 2 * IEEE 802.1Q GARP VLAN Registration Protocol (GVRP) 4 * 3 * 5 * Copyright (c) 2008 Patrick McHardy <ka 4 * Copyright (c) 2008 Patrick McHardy <kaber@trash.net> >> 5 * >> 6 * This program is free software; you can redistribute it and/or >> 7 * modify it under the terms of the GNU General Public License >> 8 * version 2 as published by the Free Software Foundation. 6 */ 9 */ 7 #include <linux/types.h> 10 #include <linux/types.h> 8 #include <linux/if_vlan.h> 11 #include <linux/if_vlan.h> 9 #include <net/garp.h> 12 #include <net/garp.h> 10 #include "vlan.h" 13 #include "vlan.h" 11 14 12 #define GARP_GVRP_ADDRESS { 0x01, 0x80, 15 #define GARP_GVRP_ADDRESS { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x21 } 13 16 14 enum gvrp_attributes { 17 enum gvrp_attributes { 15 GVRP_ATTR_INVALID, 18 GVRP_ATTR_INVALID, 16 GVRP_ATTR_VID, 19 GVRP_ATTR_VID, 17 __GVRP_ATTR_MAX 20 __GVRP_ATTR_MAX 18 }; 21 }; 19 #define GVRP_ATTR_MAX (__GVRP_ATTR_MAX - 1) 22 #define GVRP_ATTR_MAX (__GVRP_ATTR_MAX - 1) 20 23 21 static struct garp_application vlan_gvrp_app _ 24 static struct garp_application vlan_gvrp_app __read_mostly = { 22 .proto.group_address = GARP_GVRP_AD 25 .proto.group_address = GARP_GVRP_ADDRESS, 23 .maxattr = GVRP_ATTR_MA 26 .maxattr = GVRP_ATTR_MAX, 24 .type = GARP_APPLICA 27 .type = GARP_APPLICATION_GVRP, 25 }; 28 }; 26 29 27 int vlan_gvrp_request_join(const struct net_de 30 int vlan_gvrp_request_join(const struct net_device *dev) 28 { 31 { 29 const struct vlan_dev_priv *vlan = vla 32 const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 30 __be16 vlan_id = htons(vlan->vlan_id); 33 __be16 vlan_id = htons(vlan->vlan_id); 31 34 32 if (vlan->vlan_proto != htons(ETH_P_80 35 if (vlan->vlan_proto != htons(ETH_P_8021Q)) 33 return 0; 36 return 0; 34 return garp_request_join(vlan->real_de 37 return garp_request_join(vlan->real_dev, &vlan_gvrp_app, 35 &vlan_id, siz 38 &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); 36 } 39 } 37 40 38 void vlan_gvrp_request_leave(const struct net_ 41 void vlan_gvrp_request_leave(const struct net_device *dev) 39 { 42 { 40 const struct vlan_dev_priv *vlan = vla 43 const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 41 __be16 vlan_id = htons(vlan->vlan_id); 44 __be16 vlan_id = htons(vlan->vlan_id); 42 45 43 if (vlan->vlan_proto != htons(ETH_P_80 46 if (vlan->vlan_proto != htons(ETH_P_8021Q)) 44 return; 47 return; 45 garp_request_leave(vlan->real_dev, &vl 48 garp_request_leave(vlan->real_dev, &vlan_gvrp_app, 46 &vlan_id, sizeof(vl 49 &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); 47 } 50 } 48 51 49 int vlan_gvrp_init_applicant(struct net_device 52 int vlan_gvrp_init_applicant(struct net_device *dev) 50 { 53 { 51 return garp_init_applicant(dev, &vlan_ 54 return garp_init_applicant(dev, &vlan_gvrp_app); 52 } 55 } 53 56 54 void vlan_gvrp_uninit_applicant(struct net_dev 57 void vlan_gvrp_uninit_applicant(struct net_device *dev) 55 { 58 { 56 garp_uninit_applicant(dev, &vlan_gvrp_ 59 garp_uninit_applicant(dev, &vlan_gvrp_app); 57 } 60 } 58 61 59 int __init vlan_gvrp_init(void) 62 int __init vlan_gvrp_init(void) 60 { 63 { 61 return garp_register_application(&vlan 64 return garp_register_application(&vlan_gvrp_app); 62 } 65 } 63 66 64 void vlan_gvrp_uninit(void) 67 void vlan_gvrp_uninit(void) 65 { 68 { 66 garp_unregister_application(&vlan_gvrp 69 garp_unregister_application(&vlan_gvrp_app); 67 } 70 } 68 71
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.