exit cleanly when kompare is piped to another application and this pipe is closed
[linux-2.6.git] / include / linux / vs_network.h
1 #ifndef _NX_VS_NETWORK_H
2 #define _NX_VS_NETWORK_H
3
4 #include "vserver/context.h"
5 #include "vserver/network.h"
6 #include "vserver/base.h"
7 #include "vserver/debug.h"
8
9
10 #define get_nx_info(i)  __get_nx_info(i,__FILE__,__LINE__)
11
12 static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
13         const char *_file, int _line)
14 {
15         if (!nxi)
16                 return NULL;
17
18         vxlprintk(VXD_CBIT(nid, 2), "get_nx_info(%p[#%d.%d])",
19                 nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
20                 _file, _line);
21
22         atomic_inc(&nxi->nx_usecnt);
23         return nxi;
24 }
25
26
27 extern void free_nx_info(struct nx_info *);
28
29 #define put_nx_info(i)  __put_nx_info(i,__FILE__,__LINE__)
30
31 static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _line)
32 {
33         if (!nxi)
34                 return;
35
36         vxlprintk(VXD_CBIT(nid, 2), "put_nx_info(%p[#%d.%d])",
37                 nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
38                 _file, _line);
39
40         if (atomic_dec_and_test(&nxi->nx_usecnt))
41                 free_nx_info(nxi);
42 }
43
44
45 #define init_nx_info(p,i) __init_nx_info(p,i,__FILE__,__LINE__)
46
47 static inline void __init_nx_info(struct nx_info **nxp, struct nx_info *nxi,
48                 const char *_file, int _line)
49 {
50         if (nxi) {
51                 vxlprintk(VXD_CBIT(nid, 3),
52                         "init_nx_info(%p[#%d.%d])",
53                         nxi, nxi?nxi->nx_id:0,
54                         nxi?atomic_read(&nxi->nx_usecnt):0,
55                         _file, _line);
56
57                 atomic_inc(&nxi->nx_usecnt);
58         }
59         *nxp = nxi;
60 }
61
62
63 #define set_nx_info(p,i) __set_nx_info(p,i,__FILE__,__LINE__)
64
65 static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
66         const char *_file, int _line)
67 {
68         struct nx_info *nxo;
69
70         if (!nxi)
71                 return;
72
73         vxlprintk(VXD_CBIT(nid, 3), "set_nx_info(%p[#%d.%d])",
74                 nxi, nxi?nxi->nx_id:0,
75                 nxi?atomic_read(&nxi->nx_usecnt):0,
76                 _file, _line);
77
78         atomic_inc(&nxi->nx_usecnt);
79         nxo = xchg(nxp, nxi);
80         BUG_ON(nxo);
81 }
82
83 #define clr_nx_info(p)  __clr_nx_info(p,__FILE__,__LINE__)
84
85 static inline void __clr_nx_info(struct nx_info **nxp,
86         const char *_file, int _line)
87 {
88         struct nx_info *nxo;
89
90         nxo = xchg(nxp, NULL);
91         if (!nxo)
92                 return;
93
94         vxlprintk(VXD_CBIT(nid, 3), "clr_nx_info(%p[#%d.%d])",
95                 nxo, nxo?nxo->nx_id:0,
96                 nxo?atomic_read(&nxo->nx_usecnt):0,
97                 _file, _line);
98
99         if (atomic_dec_and_test(&nxo->nx_usecnt))
100                 free_nx_info(nxo);
101 }
102
103
104 #define claim_nx_info(v,p) __claim_nx_info(v,p,__FILE__,__LINE__)
105
106 static inline void __claim_nx_info(struct nx_info *nxi,
107         struct task_struct *task, const char *_file, int _line)
108 {
109         vxlprintk(VXD_CBIT(nid, 3), "claim_nx_info(%p[#%d.%d.%d]) %p",
110                 nxi, nxi?nxi->nx_id:0,
111                 nxi?atomic_read(&nxi->nx_usecnt):0,
112                 nxi?atomic_read(&nxi->nx_tasks):0,
113                 task, _file, _line);
114
115         atomic_inc(&nxi->nx_tasks);
116 }
117
118
119 extern void unhash_nx_info(struct nx_info *);
120
121 #define release_nx_info(v,p) __release_nx_info(v,p,__FILE__,__LINE__)
122
123 static inline void __release_nx_info(struct nx_info *nxi,
124         struct task_struct *task, const char *_file, int _line)
125 {
126         vxlprintk(VXD_CBIT(nid, 3), "release_nx_info(%p[#%d.%d.%d]) %p",
127                 nxi, nxi?nxi->nx_id:0,
128                 nxi?atomic_read(&nxi->nx_usecnt):0,
129                 nxi?atomic_read(&nxi->nx_tasks):0,
130                 task, _file, _line);
131
132         might_sleep();
133
134         if (atomic_dec_and_test(&nxi->nx_tasks))
135                 unhash_nx_info(nxi);
136 }
137
138
139 #define task_get_nx_info(i)     __task_get_nx_info(i,__FILE__,__LINE__)
140
141 static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
142         const char *_file, int _line)
143 {
144         struct nx_info *nxi;
145
146         task_lock(p);
147         vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)",
148                 p, _file, _line);
149         nxi = __get_nx_info(p->nx_info, _file, _line);
150         task_unlock(p);
151         return nxi;
152 }
153
154
155
156
157 static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
158 {
159         int n,i;
160
161         if (!nxi)
162                 return 1;
163
164         n = nxi->nbipv4;
165         /* Special case accept anything if addr[0] == ::
166          * FIXME either accept this on any position or adjust address
167          * addition in kernel/vserver/network.c */
168         if (n && (nxi->ipv4[0] == 0))
169                 return 1;
170         for (i=0; i<n; i++) {
171                 if (nxi->ipv4[i] == addr)
172                         return 1;
173         }
174         return 0;
175 }
176
177 static inline void exit_nx_info(struct task_struct *p)
178 {
179         if (p->nx_info)
180                 release_nx_info(p->nx_info, p);
181 }
182
183 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
184
185 #include <net/ipv6.h>
186
187 static inline int addr6_in_nx_info(struct nx_info *nxi, const struct in6_addr *addr)
188 {
189         int n,i;
190
191         if (!nxi)
192                 return 1;
193
194         n = nxi->nbipv6;
195         /* Special case accept anything if addr[0] == :: 
196          * FIXME either accept this on any position or adjust address
197          * addition in kernel/vserver/network.c */
198         if (n && nxi->ipv6[0].s6_addr32[0] == 0 && nxi->ipv6[0].s6_addr32[1] == 0 &&
199                         nxi->ipv6[0].s6_addr32[2] == 0 && nxi->ipv6[0].s6_addr32[3] == 0)
200                 return 1;
201         for (i=0; i<n; i++) {
202                 if (ipv6_addr_equal(&(nxi->ipv6[i]), addr))
203                         return 1;
204         }
205         return 0;
206 }
207
208 extern int nx_addr6_conflict(struct nx_info *nxi, struct nx_info *nix2);
209
210 #endif /* CONFIG_IPV6 || CONFIG_IPV6_MODULE */
211
212 #ifdef CONFIG_NETWORK_SECMARK
213 #define skb_tag secmark
214 #else
215 #define skb_tag mark
216 #endif
217
218 #else
219 #warning duplicate inclusion
220 #endif