1 /* 2 * Operations on the network namespace 3 */ 4 #ifndef __NET_NET_NAMESPACE_H 5 #define __NET_NET_NAMESPACE_H 6 7 #include <asm/atomic.h> 8 #include <linux/workqueue.h> 9 #include <linux/list.h> 10 11 struct proc_dir_entry; 12 struct net { 13 atomic_t count; /* To decided when the network 14 * namespace should be freed. 15 */ 16 atomic_t use_count; /* To track references we 17 * destroy on demand 18 */ 19 struct list_head list; /* list of network namespaces */ 20 struct work_struct work; /* work struct for freeing */ 21 22 struct proc_dir_entry *proc_net; 23 struct proc_dir_entry *proc_net_stat; 24 struct proc_dir_entry *proc_net_root; 25 26 struct list_head dev_base_head; 27 struct hlist_head *dev_name_head; 28 struct hlist_head *dev_index_head; 29 }; 30 31 #ifdef CONFIG_NET 32 /* Init's network namespace */ 33 extern struct net init_net; 34 #define INIT_NET_NS(net_ns) .net_ns = &init_net, 35 #else 36 #define INIT_NET_NS(net_ns) 37 #endif 38 39 extern struct list_head net_namespace_list; 40 41 #ifdef CONFIG_NET 42 extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 43 #else 44 static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 45 { 46 /* There is nothing to copy so this is a noop */ 47 return net_ns; 48 } 49 #endif 50 51 extern void __put_net(struct net *net); 52 53 static inline struct net *get_net(struct net *net) 54 { 55 #ifdef CONFIG_NET 56 atomic_inc(&net->count); 57 #endif 58 return net; 59 } 60 61 static inline struct net *maybe_get_net(struct net *net) 62 { 63 /* Used when we know struct net exists but we 64 * aren't guaranteed a previous reference count 65 * exists. If the reference count is zero this 66 * function fails and returns NULL. 67 */ 68 if (!atomic_inc_not_zero(&net->count)) 69 net = NULL; 70 return net; 71 } 72 73 static inline void put_net(struct net *net) 74 { 75 #ifdef CONFIG_NET 76 if (atomic_dec_and_test(&net->count)) 77 __put_net(net); 78 #endif 79 } 80 81 static inline struct net *hold_net(struct net *net) 82 { 83 #ifdef CONFIG_NET 84 atomic_inc(&net->use_count); 85 #endif 86 return net; 87 } 88 89 static inline void release_net(struct net *net) 90 { 91 #ifdef CONFIG_NET 92 atomic_dec(&net->use_count); 93 #endif 94 } 95 96 extern void net_lock(void); 97 extern void net_unlock(void); 98 99 #define for_each_net(VAR) \ 100 list_for_each_entry(VAR, &net_namespace_list, list) 101 102 103 struct pernet_operations { 104 struct list_head list; 105 int (*init)(struct net *net); 106 void (*exit)(struct net *net); 107 }; 108 109 extern int register_pernet_subsys(struct pernet_operations *); 110 extern void unregister_pernet_subsys(struct pernet_operations *); 111 extern int register_pernet_device(struct pernet_operations *); 112 extern void unregister_pernet_device(struct pernet_operations *); 113 114 #endif /* __NET_NET_NAMESPACE_H */ 115