1 #ifndef _NX_VS_NETWORK_H
2 #define _NX_VS_NETWORK_H
4 #include <linux/kernel.h>
5 #include <linux/rcupdate.h>
6 #include <linux/sched.h>
8 #include "vserver/network.h"
9 #include "vserver/debug.h"
12 extern int proc_pid_nx_info(struct task_struct *, char *);
15 #define get_nx_info(i) __get_nx_info(i,__FILE__,__LINE__)
17 static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
18 const char *_file, int _line)
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,
25 atomic_inc(&nxi->nx_usecnt);
30 #define free_nx_info(i) \
31 call_rcu(&i->nx_rcu, rcu_free_nx_info);
33 #define put_nx_info(i) __put_nx_info(i,__FILE__,__LINE__)
35 static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _line)
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,
42 if (atomic_dec_and_test(&nxi->nx_usecnt))
46 #define set_nx_info(p,i) __set_nx_info(p,i,__FILE__,__LINE__)
48 static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
49 const char *_file, int _line)
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,
62 atomic_inc(&nxi->nx_refcnt);
63 nxo = xchg(nxp, __get_nx_info(nxi, _file, _line));
67 #define clr_nx_info(p) __clr_nx_info(p,__FILE__,__LINE__)
69 static inline void __clr_nx_info(struct nx_info **nxp,
70 const char *_file, int _line)
74 nxo = xchg(nxp, NULL);
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,
84 if (atomic_dec_and_test(&nxo->nx_refcnt))
86 __put_nx_info(nxo, _file, _line);
90 #define task_get_nx_info(i) __task_get_nx_info(i,__FILE__,__LINE__)
92 static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
93 const char *_file, int _line)
98 nxi = __get_nx_info(p->nx_info, _file, _line);
99 vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)",
105 #define nx_verify_info(p,i) \
106 __nx_verify_info((p)->nx_info,i,__FILE__,__LINE__)
108 static __inline__ void __nx_verify_info(
109 struct nx_info *ipa, struct nx_info *ipb,
110 const char *_file, int _line)
114 printk(KERN_ERR "ip bad assumption (%p==%p) at %s:%d\n",
115 ipa, ipb, _file, _line);
119 #define nx_task_nid(t) ((t)->nid)
121 #define nx_current_nid() nx_task_nid(current)
123 #define nx_check(c,m) __nx_check(nx_current_nid(),c,m)
125 #define nx_weak_check(c,m) ((m) ? nx_check(c,m) : 1)
128 #define __nx_flags(v,m,f) (((v) & (m)) ^ (f))
130 #define __nx_task_flags(t,m,f) \
131 (((t) && ((t)->nx_info)) ? \
132 __nx_flags((t)->nx_info->nx_flags,(m),(f)) : 0)
134 #define nx_current_flags() \
135 ((current->nx_info) ? current->nx_info->nx_flags : 0)
137 #define nx_flags(m,f) __nx_flags(nx_current_flags(),(m),(f))
140 #define nx_current_ncaps() \
141 ((current->nx_info) ? current->nx_info->nx_ncaps : 0)
143 #define nx_ncaps(c) (nx_current_ncaps() & (c))
146 static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
154 for (i=0; i<n; i++) {
155 if (nxi->ipv4[i] == addr)
163 #warning duplicate inclusion