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