]>
Commit | Line | Data |
---|---|---|
70c03b49 PM |
1 | /* |
2 | * IEEE 802.1Q GARP VLAN Registration Protocol (GVRP) | |
3 | * | |
4 | * Copyright (c) 2008 Patrick McHardy <[email protected]> | |
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 | { | |
7da82c06 | 32 | const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); |
9bb8582e | 33 | __be16 vlan_id = htons(vlan->vlan_id); |
70c03b49 | 34 | |
1fd9b1fc PM |
35 | if (vlan->vlan_proto != htons(ETH_P_8021Q)) |
36 | return 0; | |
70c03b49 | 37 | return garp_request_join(vlan->real_dev, &vlan_gvrp_app, |
9bb8582e | 38 | &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); |
70c03b49 PM |
39 | } |
40 | ||
41 | void vlan_gvrp_request_leave(const struct net_device *dev) | |
42 | { | |
7da82c06 | 43 | const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); |
9bb8582e | 44 | __be16 vlan_id = htons(vlan->vlan_id); |
70c03b49 | 45 | |
1fd9b1fc PM |
46 | if (vlan->vlan_proto != htons(ETH_P_8021Q)) |
47 | return; | |
70c03b49 | 48 | garp_request_leave(vlan->real_dev, &vlan_gvrp_app, |
9bb8582e | 49 | &vlan_id, sizeof(vlan_id), GVRP_ATTR_VID); |
70c03b49 PM |
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 | } |