82404af6eab65f5dff36ec1d1de59aea44f1afea
[sliver-openvswitch.git] / datapath / linux / compat / net_namespace.c
1 #include <linux/if_vlan.h>
2 #include <linux/netdevice.h>
3 #include <net/net_namespace.h>
4 #include <net/netns/generic.h>
5
6 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
7 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
8 static int net_assign_generic(struct net *net, int id, void *data);
9 #endif
10
11 int __net_init compat_init_net(struct net *net, struct rpl_pernet_operations *pnet)
12 {
13         int err;
14         void *ovs_net = kzalloc(pnet->size, GFP_KERNEL);
15
16         if (!ovs_net)
17                 return -ENOMEM;
18
19         err = net_assign_generic(net, *pnet->id, ovs_net);
20         if (err)
21                 goto err;
22
23         if (pnet->init) {
24                 err = pnet->init(net);
25                 if (err)
26                         goto err;
27         }
28
29         return 0;
30 err:
31         kfree(ovs_net);
32         return err;
33 }
34
35 void __net_exit compat_exit_net(struct net *net, struct rpl_pernet_operations *pnet)
36 {
37         void *ovs_net = net_generic(net, *pnet->id);
38
39         if (pnet->exit)
40                 pnet->exit(net);
41         kfree(ovs_net);
42 }
43 #endif
44
45 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
46 #define MAX_DATA_COUNT 2
47 static struct net *net;
48
49 static void *__ovs_net_data[MAX_DATA_COUNT];
50 static int count;
51
52 static int net_assign_generic(struct net *net, int id, void *data)
53 {
54         BUG_ON(id >= MAX_DATA_COUNT);
55         __ovs_net_data[id] = data;
56         return 0;
57 }
58
59 void *net_generic(const struct net *net, int id)
60 {
61         return __ovs_net_data[id];
62 }
63
64 int rpl_register_pernet_gen_device(struct rpl_pernet_operations *rpl_pnet)
65 {
66         *rpl_pnet->id = count++;
67         return compat_init_net(net, rpl_pnet);
68 }
69
70 void rpl_unregister_pernet_gen_device(struct rpl_pernet_operations *rpl_pnet)
71 {
72         compat_exit_net(net, rpl_pnet);
73 }
74
75 #endif