15f256becSEric W. Biederman /* 25f256becSEric W. Biederman * Operations on the network namespace 35f256becSEric W. Biederman */ 45f256becSEric W. Biederman #ifndef __NET_NET_NAMESPACE_H 55f256becSEric W. Biederman #define __NET_NET_NAMESPACE_H 65f256becSEric W. Biederman 75f256becSEric W. Biederman #include <asm/atomic.h> 85f256becSEric W. Biederman #include <linux/workqueue.h> 95f256becSEric W. Biederman #include <linux/list.h> 105f256becSEric W. Biederman 11457c4cbcSEric W. Biederman struct proc_dir_entry; 125f256becSEric W. Biederman struct net { 135f256becSEric W. Biederman atomic_t count; /* To decided when the network 145f256becSEric W. Biederman * namespace should be freed. 155f256becSEric W. Biederman */ 165f256becSEric W. Biederman atomic_t use_count; /* To track references we 175f256becSEric W. Biederman * destroy on demand 185f256becSEric W. Biederman */ 195f256becSEric W. Biederman struct list_head list; /* list of network namespaces */ 205f256becSEric W. Biederman struct work_struct work; /* work struct for freeing */ 21457c4cbcSEric W. Biederman 22457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net; 23457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_stat; 24457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_root; 25881d966bSEric W. Biederman 26881d966bSEric W. Biederman struct list_head dev_base_head; 27881d966bSEric W. Biederman struct hlist_head *dev_name_head; 28881d966bSEric W. Biederman struct hlist_head *dev_index_head; 295f256becSEric W. Biederman }; 305f256becSEric W. Biederman 314fabcd71SDaniel Lezcano #ifdef CONFIG_NET 324fabcd71SDaniel Lezcano /* Init's network namespace */ 335f256becSEric W. Biederman extern struct net init_net; 344fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net, 354fabcd71SDaniel Lezcano #else 364fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) 374fabcd71SDaniel Lezcano #endif 384fabcd71SDaniel Lezcano 395f256becSEric W. Biederman extern struct list_head net_namespace_list; 405f256becSEric W. Biederman 419dd776b6SEric W. Biederman #ifdef CONFIG_NET 429dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 439dd776b6SEric W. Biederman #else 449dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 459dd776b6SEric W. Biederman { 469dd776b6SEric W. Biederman /* There is nothing to copy so this is a noop */ 479dd776b6SEric W. Biederman return net_ns; 489dd776b6SEric W. Biederman } 499dd776b6SEric W. Biederman #endif 509dd776b6SEric W. Biederman 515f256becSEric W. Biederman extern void __put_net(struct net *net); 525f256becSEric W. Biederman 535f256becSEric W. Biederman static inline struct net *get_net(struct net *net) 545f256becSEric W. Biederman { 559dd776b6SEric W. Biederman #ifdef CONFIG_NET 565f256becSEric W. Biederman atomic_inc(&net->count); 579dd776b6SEric W. Biederman #endif 585f256becSEric W. Biederman return net; 595f256becSEric W. Biederman } 605f256becSEric W. Biederman 61077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net) 62077130c0SEric W. Biederman { 63077130c0SEric W. Biederman /* Used when we know struct net exists but we 64077130c0SEric W. Biederman * aren't guaranteed a previous reference count 65077130c0SEric W. Biederman * exists. If the reference count is zero this 66077130c0SEric W. Biederman * function fails and returns NULL. 67077130c0SEric W. Biederman */ 68077130c0SEric W. Biederman if (!atomic_inc_not_zero(&net->count)) 69077130c0SEric W. Biederman net = NULL; 70077130c0SEric W. Biederman return net; 71077130c0SEric W. Biederman } 72077130c0SEric W. Biederman 735f256becSEric W. Biederman static inline void put_net(struct net *net) 745f256becSEric W. Biederman { 759dd776b6SEric W. Biederman #ifdef CONFIG_NET 765f256becSEric W. Biederman if (atomic_dec_and_test(&net->count)) 775f256becSEric W. Biederman __put_net(net); 789dd776b6SEric W. Biederman #endif 795f256becSEric W. Biederman } 805f256becSEric W. Biederman 815f256becSEric W. Biederman static inline struct net *hold_net(struct net *net) 825f256becSEric W. Biederman { 839dd776b6SEric W. Biederman #ifdef CONFIG_NET 845f256becSEric W. Biederman atomic_inc(&net->use_count); 859dd776b6SEric W. Biederman #endif 865f256becSEric W. Biederman return net; 875f256becSEric W. Biederman } 885f256becSEric W. Biederman 895f256becSEric W. Biederman static inline void release_net(struct net *net) 905f256becSEric W. Biederman { 919dd776b6SEric W. Biederman #ifdef CONFIG_NET 925f256becSEric W. Biederman atomic_dec(&net->use_count); 939dd776b6SEric W. Biederman #endif 945f256becSEric W. Biederman } 955f256becSEric W. Biederman 965f256becSEric W. Biederman extern void net_lock(void); 975f256becSEric W. Biederman extern void net_unlock(void); 985f256becSEric W. Biederman 995f256becSEric W. Biederman #define for_each_net(VAR) \ 1005f256becSEric W. Biederman list_for_each_entry(VAR, &net_namespace_list, list) 1015f256becSEric W. Biederman 1025f256becSEric W. Biederman 1035f256becSEric W. Biederman struct pernet_operations { 1045f256becSEric W. Biederman struct list_head list; 1055f256becSEric W. Biederman int (*init)(struct net *net); 1065f256becSEric W. Biederman void (*exit)(struct net *net); 1075f256becSEric W. Biederman }; 1085f256becSEric W. Biederman 1095f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *); 1105f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *); 1115f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *); 1125f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *); 1135f256becSEric W. Biederman 1145f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */ 115