diff options
Diffstat (limited to 'net/8021q/vlan_gvrp.c')
-rw-r--r-- | net/8021q/vlan_gvrp.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/net/8021q/vlan_gvrp.c b/net/8021q/vlan_gvrp.c new file mode 100644 index 000000000000..061ceceeef12 --- /dev/null +++ b/net/8021q/vlan_gvrp.c | |||
@@ -0,0 +1,66 @@ | |||
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_info *vlan = vlan_dev_info(dev); | ||
33 | __be16 vlan_id = htons(vlan->vlan_id); | ||
34 | |||
35 | return garp_request_join(vlan->real_dev, &vlan_gvrp_app, | ||
36 | &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); | ||
37 | } | ||
38 | |||
39 | void vlan_gvrp_request_leave(const struct net_device *dev) | ||
40 | { | ||
41 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); | ||
42 | __be16 vlan_id = htons(vlan->vlan_id); | ||
43 | |||
44 | garp_request_leave(vlan->real_dev, &vlan_gvrp_app, | ||
45 | &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); | ||
46 | } | ||
47 | |||
48 | int vlan_gvrp_init_applicant(struct net_device *dev) | ||
49 | { | ||
50 | return garp_init_applicant(dev, &vlan_gvrp_app); | ||
51 | } | ||
52 | |||
53 | void vlan_gvrp_uninit_applicant(struct net_device *dev) | ||
54 | { | ||
55 | garp_uninit_applicant(dev, &vlan_gvrp_app); | ||
56 | } | ||
57 | |||
58 | int __init vlan_gvrp_init(void) | ||
59 | { | ||
60 | return garp_register_application(&vlan_gvrp_app); | ||
61 | } | ||
62 | |||
63 | void vlan_gvrp_uninit(void) | ||
64 | { | ||
65 | garp_unregister_application(&vlan_gvrp_app); | ||
66 | } | ||