vserver 1.9.3
[linux-2.6.git] / include / linux / vs_network.h
1 #ifndef _NX_VS_NETWORK_H
2 #define _NX_VS_NETWORK_H
3
4 #include <linux/kernel.h>
5 #include <linux/rcupdate.h>
6 #include <linux/sched.h>
7
8 #include "vserver/network.h"
9 #include "vserver/debug.h"
10
11
12 extern int proc_pid_nx_info(struct task_struct *, char *);
13
14
15 #define get_nx_info(i)  __get_nx_info(i,__FILE__,__LINE__)
16
17 static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
18         const char *_file, int _line)
19 {
20         if (!nxi)
21                 return NULL;
22         vxlprintk(VXD_CBIT(nid, 2), "get_nx_info(%p[#%d.%d])",
23                 nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
24                 _file, _line);
25         atomic_inc(&nxi->nx_usecnt);
26         return nxi;
27 }
28
29
30 #define free_nx_info(i) \
31         call_rcu(&i->nx_rcu, rcu_free_nx_info);
32
33 #define put_nx_info(i)  __put_nx_info(i,__FILE__,__LINE__)
34
35 static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _line)
36 {
37         if (!nxi)
38                 return;
39         vxlprintk(VXD_CBIT(nid, 2), "put_nx_info(%p[#%d.%d])",
40                 nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
41                 _file, _line);
42         if (atomic_dec_and_test(&nxi->nx_usecnt))
43                 free_nx_info(nxi);
44 }
45
46 #define set_nx_info(p,i) __set_nx_info(p,i,__FILE__,__LINE__)
47
48 static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
49         const char *_file, int _line)
50 {
51         struct nx_info *nxo;
52
53         if (!nxi)
54                 return;
55
56         vxlprintk(VXD_CBIT(nid, 3), "set_nx_info(%p[#%d.%d.%d])",
57                 nxi, nxi?nxi->nx_id:0,
58                 nxi?atomic_read(&nxi->nx_usecnt):0,
59                 nxi?atomic_read(&nxi->nx_refcnt):0,
60                 _file, _line);
61
62         atomic_inc(&nxi->nx_refcnt);
63         nxo = xchg(nxp, __get_nx_info(nxi, _file, _line));
64         BUG_ON(nxo);
65 }
66
67 #define clr_nx_info(p)  __clr_nx_info(p,__FILE__,__LINE__)
68
69 static inline void __clr_nx_info(struct nx_info **nxp,
70         const char *_file, int _line)
71 {
72         struct nx_info *nxo;
73
74         nxo = xchg(nxp, NULL);
75         if (!nxo)
76                 return;
77
78         vxlprintk(VXD_CBIT(nid, 3), "clr_nx_info(%p[#%d.%d.%d])",
79                 nxo, nxo?nxo->nx_id:0,
80                 nxo?atomic_read(&nxo->nx_usecnt):0,
81                 nxo?atomic_read(&nxo->nx_refcnt):0,
82                 _file, _line);
83
84         if (atomic_dec_and_test(&nxo->nx_refcnt))
85                 unhash_nx_info(nxo);
86         __put_nx_info(nxo, _file, _line);
87 }
88
89
90 #define task_get_nx_info(i)     __task_get_nx_info(i,__FILE__,__LINE__)
91
92 static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
93         const char *_file, int _line)
94 {
95         struct nx_info *nxi;
96
97         task_lock(p);
98         nxi = __get_nx_info(p->nx_info, _file, _line);
99         vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)",
100                 p, _file, _line);
101         task_unlock(p);
102         return nxi;
103 }
104
105 #define nx_verify_info(p,i)     \
106         __nx_verify_info((p)->nx_info,i,__FILE__,__LINE__)
107
108 static __inline__ void __nx_verify_info(
109         struct nx_info *ipa, struct nx_info *ipb,
110         const char *_file, int _line)
111 {
112         if (ipa == ipb)
113                 return;
114         printk(KERN_ERR "ip bad assumption (%p==%p) at %s:%d\n",
115                 ipa, ipb, _file, _line);
116 }
117
118
119 #define nx_task_nid(t)  ((t)->nid)
120
121 #define nx_current_nid() nx_task_nid(current)
122
123 #define nx_check(c,m)   __nx_check(nx_current_nid(),c,m)
124
125 #define nx_weak_check(c,m)      ((m) ? nx_check(c,m) : 1)
126
127
128 #define __nx_flags(v,m,f)       (((v) & (m)) ^ (f))
129
130 #define __nx_task_flags(t,m,f) \
131         (((t) && ((t)->nx_info)) ? \
132                 __nx_flags((t)->nx_info->nx_flags,(m),(f)) : 0)
133
134 #define nx_current_flags() \
135         ((current->nx_info) ? current->nx_info->nx_flags : 0)
136
137 #define nx_flags(m,f)   __nx_flags(nx_current_flags(),(m),(f))
138
139
140 #define nx_current_ncaps() \
141         ((current->nx_info) ? current->nx_info->nx_ncaps : 0)
142
143 #define nx_ncaps(c)     (nx_current_ncaps() & (c))
144
145
146 static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
147 {
148         int n,i;
149
150         if (!nxi)
151                 return 1;
152
153         n = nxi->nbipv4;
154         for (i=0; i<n; i++) {
155                 if (nxi->ipv4[i] == addr)
156                         return 1;
157         }
158         return 0;
159 }
160
161
162 #else
163 #warning duplicate inclusion
164 #endif