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; 141597fbc0SPavel Emelyanov struct ctl_table_header; 151597fbc0SPavel Emelyanov 165f256becSEric W. Biederman struct net { 175f256becSEric W. Biederman atomic_t count; /* To decided when the network 185f256becSEric W. Biederman * namespace should be freed. 195f256becSEric W. Biederman */ 205f256becSEric W. Biederman atomic_t use_count; /* To track references we 215f256becSEric W. Biederman * destroy on demand 225f256becSEric W. Biederman */ 235f256becSEric W. Biederman struct list_head list; /* list of network namespaces */ 245f256becSEric W. Biederman struct work_struct work; /* work struct for freeing */ 25457c4cbcSEric W. Biederman 26457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net; 27457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_stat; 28457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_root; 29881d966bSEric W. Biederman 3095bdfccbSEric W. Biederman struct list_head sysctl_table_headers; 3195bdfccbSEric W. Biederman 322774c7abSEric W. Biederman struct net_device *loopback_dev; /* The loopback */ 332774c7abSEric W. Biederman 34881d966bSEric W. Biederman struct list_head dev_base_head; 35881d966bSEric W. Biederman struct hlist_head *dev_name_head; 36881d966bSEric W. Biederman struct hlist_head *dev_index_head; 3797c53cacSDenis V. Lunev 3897c53cacSDenis V. Lunev struct sock *rtnl; /* rtnetlink socket */ 39d12d01d6SDenis V. Lunev 40024626e3SPavel Emelyanov /* core sysctls */ 41024626e3SPavel Emelyanov struct ctl_table_header *sysctl_core_hdr; 42b8e1f9b5SPavel Emelyanov int sysctl_somaxconn; 43024626e3SPavel Emelyanov 44d12d01d6SDenis V. Lunev /* List of all packet sockets. */ 45d12d01d6SDenis V. Lunev rwlock_t packet_sklist_lock; 46d12d01d6SDenis V. Lunev struct hlist_head packet_sklist; 47d392e497SPavel Emelyanov 48d392e497SPavel Emelyanov /* unix sockets */ 49d392e497SPavel Emelyanov int sysctl_unix_max_dgram_qlen; 501597fbc0SPavel Emelyanov struct ctl_table_header *unix_ctl; 515f256becSEric W. Biederman }; 525f256becSEric W. Biederman 534fabcd71SDaniel Lezcano #ifdef CONFIG_NET 544fabcd71SDaniel Lezcano /* Init's network namespace */ 555f256becSEric W. Biederman extern struct net init_net; 564fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net, 574fabcd71SDaniel Lezcano #else 584fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) 594fabcd71SDaniel Lezcano #endif 604fabcd71SDaniel Lezcano 615f256becSEric W. Biederman extern struct list_head net_namespace_list; 625f256becSEric W. Biederman 639dd776b6SEric W. Biederman #ifdef CONFIG_NET 649dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 659dd776b6SEric W. Biederman #else 669dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 679dd776b6SEric W. Biederman { 689dd776b6SEric W. Biederman /* There is nothing to copy so this is a noop */ 699dd776b6SEric W. Biederman return net_ns; 709dd776b6SEric W. Biederman } 719dd776b6SEric W. Biederman #endif 729dd776b6SEric W. Biederman 73d4655795SPavel Emelyanov #ifdef CONFIG_NET_NS 745f256becSEric W. Biederman extern void __put_net(struct net *net); 755f256becSEric W. Biederman 765f256becSEric W. Biederman static inline struct net *get_net(struct net *net) 775f256becSEric W. Biederman { 785f256becSEric W. Biederman atomic_inc(&net->count); 795f256becSEric W. Biederman return net; 805f256becSEric W. Biederman } 815f256becSEric W. Biederman 82077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net) 83077130c0SEric W. Biederman { 84077130c0SEric W. Biederman /* Used when we know struct net exists but we 85077130c0SEric W. Biederman * aren't guaranteed a previous reference count 86077130c0SEric W. Biederman * exists. If the reference count is zero this 87077130c0SEric W. Biederman * function fails and returns NULL. 88077130c0SEric W. Biederman */ 89077130c0SEric W. Biederman if (!atomic_inc_not_zero(&net->count)) 90077130c0SEric W. Biederman net = NULL; 91077130c0SEric W. Biederman return net; 92077130c0SEric W. Biederman } 93077130c0SEric W. Biederman 945f256becSEric W. Biederman static inline void put_net(struct net *net) 955f256becSEric W. Biederman { 965f256becSEric W. Biederman if (atomic_dec_and_test(&net->count)) 975f256becSEric W. Biederman __put_net(net); 985f256becSEric W. Biederman } 995f256becSEric W. Biederman 1005f256becSEric W. Biederman static inline struct net *hold_net(struct net *net) 1015f256becSEric W. Biederman { 1025f256becSEric W. Biederman atomic_inc(&net->use_count); 1035f256becSEric W. Biederman return net; 1045f256becSEric W. Biederman } 1055f256becSEric W. Biederman 1065f256becSEric W. Biederman static inline void release_net(struct net *net) 1075f256becSEric W. Biederman { 1085f256becSEric W. Biederman atomic_dec(&net->use_count); 1095f256becSEric W. Biederman } 110d4655795SPavel Emelyanov #else 111d4655795SPavel Emelyanov static inline struct net *get_net(struct net *net) 112d4655795SPavel Emelyanov { 113d4655795SPavel Emelyanov return net; 114d4655795SPavel Emelyanov } 115d4655795SPavel Emelyanov 116d4655795SPavel Emelyanov static inline void put_net(struct net *net) 117d4655795SPavel Emelyanov { 118d4655795SPavel Emelyanov } 119d4655795SPavel Emelyanov 120d4655795SPavel Emelyanov static inline struct net *hold_net(struct net *net) 121d4655795SPavel Emelyanov { 122d4655795SPavel Emelyanov return net; 123d4655795SPavel Emelyanov } 124d4655795SPavel Emelyanov 125d4655795SPavel Emelyanov static inline void release_net(struct net *net) 126d4655795SPavel Emelyanov { 127d4655795SPavel Emelyanov } 128d4655795SPavel Emelyanov 129d4655795SPavel Emelyanov static inline struct net *maybe_get_net(struct net *net) 130d4655795SPavel Emelyanov { 131d4655795SPavel Emelyanov return net; 132d4655795SPavel Emelyanov } 133d4655795SPavel Emelyanov #endif 1345f256becSEric W. Biederman 1355f256becSEric W. Biederman #define for_each_net(VAR) \ 1365f256becSEric W. Biederman list_for_each_entry(VAR, &net_namespace_list, list) 1375f256becSEric W. Biederman 1384665079cSPavel Emelyanov #ifdef CONFIG_NET_NS 1394665079cSPavel Emelyanov #define __net_init 1404665079cSPavel Emelyanov #define __net_exit 141022cbae6SDenis V. Lunev #define __net_initdata 1424665079cSPavel Emelyanov #else 1434665079cSPavel Emelyanov #define __net_init __init 1444665079cSPavel Emelyanov #define __net_exit __exit_refok 145022cbae6SDenis V. Lunev #define __net_initdata __initdata 1464665079cSPavel Emelyanov #endif 1475f256becSEric W. Biederman 1485f256becSEric W. Biederman struct pernet_operations { 1495f256becSEric W. Biederman struct list_head list; 1505f256becSEric W. Biederman int (*init)(struct net *net); 1515f256becSEric W. Biederman void (*exit)(struct net *net); 1525f256becSEric W. Biederman }; 1535f256becSEric W. Biederman 1545f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *); 1555f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *); 1565f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *); 1575f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *); 1585f256becSEric W. Biederman 15995bdfccbSEric W. Biederman struct ctl_path; 16095bdfccbSEric W. Biederman struct ctl_table; 16195bdfccbSEric W. Biederman struct ctl_table_header; 16295bdfccbSEric W. Biederman extern struct ctl_table_header *register_net_sysctl_table(struct net *net, 16395bdfccbSEric W. Biederman const struct ctl_path *path, struct ctl_table *table); 16495bdfccbSEric W. Biederman extern void unregister_net_sysctl_table(struct ctl_table_header *header); 16595bdfccbSEric W. Biederman 1665f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */ 167