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; 122774c7abSEric W. Biederman struct net_device; 1397c53cacSDenis V. Lunev struct sock; 145f256becSEric W. Biederman struct net { 155f256becSEric W. Biederman atomic_t count; /* To decided when the network 165f256becSEric W. Biederman * namespace should be freed. 175f256becSEric W. Biederman */ 185f256becSEric W. Biederman atomic_t use_count; /* To track references we 195f256becSEric W. Biederman * destroy on demand 205f256becSEric W. Biederman */ 215f256becSEric W. Biederman struct list_head list; /* list of network namespaces */ 225f256becSEric W. Biederman struct work_struct work; /* work struct for freeing */ 23457c4cbcSEric W. Biederman 24457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net; 25457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_stat; 26457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_root; 27881d966bSEric W. Biederman 282774c7abSEric W. Biederman struct net_device *loopback_dev; /* The loopback */ 292774c7abSEric W. Biederman 30881d966bSEric W. Biederman struct list_head dev_base_head; 31881d966bSEric W. Biederman struct hlist_head *dev_name_head; 32881d966bSEric W. Biederman struct hlist_head *dev_index_head; 3397c53cacSDenis V. Lunev 3497c53cacSDenis V. Lunev struct sock *rtnl; /* rtnetlink socket */ 355f256becSEric W. Biederman }; 365f256becSEric W. Biederman 374fabcd71SDaniel Lezcano #ifdef CONFIG_NET 384fabcd71SDaniel Lezcano /* Init's network namespace */ 395f256becSEric W. Biederman extern struct net init_net; 404fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net, 414fabcd71SDaniel Lezcano #else 424fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) 434fabcd71SDaniel Lezcano #endif 444fabcd71SDaniel Lezcano 455f256becSEric W. Biederman extern struct list_head net_namespace_list; 465f256becSEric W. Biederman 479dd776b6SEric W. Biederman #ifdef CONFIG_NET 489dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 499dd776b6SEric W. Biederman #else 509dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 519dd776b6SEric W. Biederman { 529dd776b6SEric W. Biederman /* There is nothing to copy so this is a noop */ 539dd776b6SEric W. Biederman return net_ns; 549dd776b6SEric W. Biederman } 559dd776b6SEric W. Biederman #endif 569dd776b6SEric W. Biederman 57d4655795SPavel Emelyanov #ifdef CONFIG_NET_NS 585f256becSEric W. Biederman extern void __put_net(struct net *net); 595f256becSEric W. Biederman 605f256becSEric W. Biederman static inline struct net *get_net(struct net *net) 615f256becSEric W. Biederman { 625f256becSEric W. Biederman atomic_inc(&net->count); 635f256becSEric W. Biederman return net; 645f256becSEric W. Biederman } 655f256becSEric W. Biederman 66077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net) 67077130c0SEric W. Biederman { 68077130c0SEric W. Biederman /* Used when we know struct net exists but we 69077130c0SEric W. Biederman * aren't guaranteed a previous reference count 70077130c0SEric W. Biederman * exists. If the reference count is zero this 71077130c0SEric W. Biederman * function fails and returns NULL. 72077130c0SEric W. Biederman */ 73077130c0SEric W. Biederman if (!atomic_inc_not_zero(&net->count)) 74077130c0SEric W. Biederman net = NULL; 75077130c0SEric W. Biederman return net; 76077130c0SEric W. Biederman } 77077130c0SEric W. Biederman 785f256becSEric W. Biederman static inline void put_net(struct net *net) 795f256becSEric W. Biederman { 805f256becSEric W. Biederman if (atomic_dec_and_test(&net->count)) 815f256becSEric W. Biederman __put_net(net); 825f256becSEric W. Biederman } 835f256becSEric W. Biederman 845f256becSEric W. Biederman static inline struct net *hold_net(struct net *net) 855f256becSEric W. Biederman { 865f256becSEric W. Biederman atomic_inc(&net->use_count); 875f256becSEric W. Biederman return net; 885f256becSEric W. Biederman } 895f256becSEric W. Biederman 905f256becSEric W. Biederman static inline void release_net(struct net *net) 915f256becSEric W. Biederman { 925f256becSEric W. Biederman atomic_dec(&net->use_count); 935f256becSEric W. Biederman } 94d4655795SPavel Emelyanov #else 95d4655795SPavel Emelyanov static inline struct net *get_net(struct net *net) 96d4655795SPavel Emelyanov { 97d4655795SPavel Emelyanov return net; 98d4655795SPavel Emelyanov } 99d4655795SPavel Emelyanov 100d4655795SPavel Emelyanov static inline void put_net(struct net *net) 101d4655795SPavel Emelyanov { 102d4655795SPavel Emelyanov } 103d4655795SPavel Emelyanov 104d4655795SPavel Emelyanov static inline struct net *hold_net(struct net *net) 105d4655795SPavel Emelyanov { 106d4655795SPavel Emelyanov return net; 107d4655795SPavel Emelyanov } 108d4655795SPavel Emelyanov 109d4655795SPavel Emelyanov static inline void release_net(struct net *net) 110d4655795SPavel Emelyanov { 111d4655795SPavel Emelyanov } 112d4655795SPavel Emelyanov 113d4655795SPavel Emelyanov static inline struct net *maybe_get_net(struct net *net) 114d4655795SPavel Emelyanov { 115d4655795SPavel Emelyanov return net; 116d4655795SPavel Emelyanov } 117d4655795SPavel Emelyanov #endif 1185f256becSEric W. Biederman 1195f256becSEric W. Biederman #define for_each_net(VAR) \ 1205f256becSEric W. Biederman list_for_each_entry(VAR, &net_namespace_list, list) 1215f256becSEric W. Biederman 1224665079cSPavel Emelyanov #ifdef CONFIG_NET_NS 1234665079cSPavel Emelyanov #define __net_init 1244665079cSPavel Emelyanov #define __net_exit 125022cbae6SDenis V. Lunev #define __net_initdata 1264665079cSPavel Emelyanov #else 1274665079cSPavel Emelyanov #define __net_init __init 1284665079cSPavel Emelyanov #define __net_exit __exit_refok 129022cbae6SDenis V. Lunev #define __net_initdata __initdata 1304665079cSPavel Emelyanov #endif 1315f256becSEric W. Biederman 1325f256becSEric W. Biederman struct pernet_operations { 1335f256becSEric W. Biederman struct list_head list; 1345f256becSEric W. Biederman int (*init)(struct net *net); 1355f256becSEric W. Biederman void (*exit)(struct net *net); 1365f256becSEric W. Biederman }; 1375f256becSEric W. Biederman 1385f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *); 1395f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *); 1405f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *); 1415f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *); 1425f256becSEric W. Biederman 1435f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */ 144