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