diff options
Diffstat (limited to 'net/8021q/vlan_mvrp.c')
-rw-r--r-- | net/8021q/vlan_mvrp.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/net/8021q/vlan_mvrp.c b/net/8021q/vlan_mvrp.c new file mode 100644 index 000000000000..d9ec1d5964aa --- /dev/null +++ b/net/8021q/vlan_mvrp.c | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * IEEE 802.1Q Multiple VLAN Registration Protocol (MVRP) | ||
3 | * | ||
4 | * Copyright (c) 2012 Massachusetts Institute of Technology | ||
5 | * | ||
6 | * Adapted from code in net/8021q/vlan_gvrp.c | ||
7 | * Copyright (c) 2008 Patrick McHardy <kaber@trash.net> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * version 2 as published by the Free Software Foundation. | ||
12 | */ | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/if_ether.h> | ||
15 | #include <linux/if_vlan.h> | ||
16 | #include <net/mrp.h> | ||
17 | #include "vlan.h" | ||
18 | |||
19 | #define MRP_MVRP_ADDRESS { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x21 } | ||
20 | |||
21 | enum mvrp_attributes { | ||
22 | MVRP_ATTR_INVALID, | ||
23 | MVRP_ATTR_VID, | ||
24 | __MVRP_ATTR_MAX | ||
25 | }; | ||
26 | #define MVRP_ATTR_MAX (__MVRP_ATTR_MAX - 1) | ||
27 | |||
28 | static struct mrp_application vlan_mrp_app __read_mostly = { | ||
29 | .type = MRP_APPLICATION_MVRP, | ||
30 | .maxattr = MVRP_ATTR_MAX, | ||
31 | .pkttype.type = htons(ETH_P_MVRP), | ||
32 | .group_address = MRP_MVRP_ADDRESS, | ||
33 | .version = 0, | ||
34 | }; | ||
35 | |||
36 | int vlan_mvrp_request_join(const struct net_device *dev) | ||
37 | { | ||
38 | const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); | ||
39 | __be16 vlan_id = htons(vlan->vlan_id); | ||
40 | |||
41 | return mrp_request_join(vlan->real_dev, &vlan_mrp_app, | ||
42 | &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID); | ||
43 | } | ||
44 | |||
45 | void vlan_mvrp_request_leave(const struct net_device *dev) | ||
46 | { | ||
47 | const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); | ||
48 | __be16 vlan_id = htons(vlan->vlan_id); | ||
49 | |||
50 | mrp_request_leave(vlan->real_dev, &vlan_mrp_app, | ||
51 | &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID); | ||
52 | } | ||
53 | |||
54 | int vlan_mvrp_init_applicant(struct net_device *dev) | ||
55 | { | ||
56 | return mrp_init_applicant(dev, &vlan_mrp_app); | ||
57 | } | ||
58 | |||
59 | void vlan_mvrp_uninit_applicant(struct net_device *dev) | ||
60 | { | ||
61 | mrp_uninit_applicant(dev, &vlan_mrp_app); | ||
62 | } | ||
63 | |||
64 | int __init vlan_mvrp_init(void) | ||
65 | { | ||
66 | return mrp_register_application(&vlan_mrp_app); | ||
67 | } | ||
68 | |||
69 | void vlan_mvrp_uninit(void) | ||
70 | { | ||
71 | mrp_unregister_application(&vlan_mrp_app); | ||
72 | } | ||