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 11a0a53c8bSDenis V. Lunev #include <net/netns/unix.h> 122aaef4e4SDenis V. Lunev #include <net/netns/packet.h> 13a0a53c8bSDenis V. Lunev 14457c4cbcSEric W. Biederman struct proc_dir_entry; 152774c7abSEric W. Biederman struct net_device; 1697c53cacSDenis V. Lunev struct sock; 171597fbc0SPavel Emelyanov struct ctl_table_header; 181597fbc0SPavel Emelyanov 195f256becSEric W. Biederman struct net { 205f256becSEric W. Biederman atomic_t count; /* To decided when the network 215f256becSEric W. Biederman * namespace should be freed. 225f256becSEric W. Biederman */ 235f256becSEric W. Biederman atomic_t use_count; /* To track references we 245f256becSEric W. Biederman * destroy on demand 255f256becSEric W. Biederman */ 265f256becSEric W. Biederman struct list_head list; /* list of network namespaces */ 275f256becSEric W. Biederman struct work_struct work; /* work struct for freeing */ 28457c4cbcSEric W. Biederman 29457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net; 30457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_stat; 31457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_root; 32881d966bSEric W. Biederman 3395bdfccbSEric W. Biederman struct list_head sysctl_table_headers; 3495bdfccbSEric W. Biederman 352774c7abSEric W. Biederman struct net_device *loopback_dev; /* The loopback */ 362774c7abSEric W. Biederman 37881d966bSEric W. Biederman struct list_head dev_base_head; 38881d966bSEric W. Biederman struct hlist_head *dev_name_head; 39881d966bSEric W. Biederman struct hlist_head *dev_index_head; 4097c53cacSDenis V. Lunev 4197c53cacSDenis V. Lunev struct sock *rtnl; /* rtnetlink socket */ 42d12d01d6SDenis V. Lunev 43024626e3SPavel Emelyanov /* core sysctls */ 44024626e3SPavel Emelyanov struct ctl_table_header *sysctl_core_hdr; 45b8e1f9b5SPavel Emelyanov int sysctl_somaxconn; 46024626e3SPavel Emelyanov 472aaef4e4SDenis V. Lunev struct netns_packet packet; 48a0a53c8bSDenis V. Lunev struct netns_unix unx; 495f256becSEric W. Biederman }; 505f256becSEric W. Biederman 514fabcd71SDaniel Lezcano #ifdef CONFIG_NET 524fabcd71SDaniel Lezcano /* Init's network namespace */ 535f256becSEric W. Biederman extern struct net init_net; 544fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net, 554fabcd71SDaniel Lezcano #else 564fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) 574fabcd71SDaniel Lezcano #endif 584fabcd71SDaniel Lezcano 595f256becSEric W. Biederman extern struct list_head net_namespace_list; 605f256becSEric W. Biederman 619dd776b6SEric W. Biederman #ifdef CONFIG_NET 629dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 639dd776b6SEric W. Biederman #else 649dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 659dd776b6SEric W. Biederman { 669dd776b6SEric W. Biederman /* There is nothing to copy so this is a noop */ 679dd776b6SEric W. Biederman return net_ns; 689dd776b6SEric W. Biederman } 699dd776b6SEric W. Biederman #endif 709dd776b6SEric W. Biederman 71d4655795SPavel Emelyanov #ifdef CONFIG_NET_NS 725f256becSEric W. Biederman extern void __put_net(struct net *net); 735f256becSEric W. Biederman 745f256becSEric W. Biederman static inline struct net *get_net(struct net *net) 755f256becSEric W. Biederman { 765f256becSEric W. Biederman atomic_inc(&net->count); 775f256becSEric W. Biederman return net; 785f256becSEric W. Biederman } 795f256becSEric W. Biederman 80077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net) 81077130c0SEric W. Biederman { 82077130c0SEric W. Biederman /* Used when we know struct net exists but we 83077130c0SEric W. Biederman * aren't guaranteed a previous reference count 84077130c0SEric W. Biederman * exists. If the reference count is zero this 85077130c0SEric W. Biederman * function fails and returns NULL. 86077130c0SEric W. Biederman */ 87077130c0SEric W. Biederman if (!atomic_inc_not_zero(&net->count)) 88077130c0SEric W. Biederman net = NULL; 89077130c0SEric W. Biederman return net; 90077130c0SEric W. Biederman } 91077130c0SEric W. Biederman 925f256becSEric W. Biederman static inline void put_net(struct net *net) 935f256becSEric W. Biederman { 945f256becSEric W. Biederman if (atomic_dec_and_test(&net->count)) 955f256becSEric W. Biederman __put_net(net); 965f256becSEric W. Biederman } 975f256becSEric W. Biederman 985f256becSEric W. Biederman static inline struct net *hold_net(struct net *net) 995f256becSEric W. Biederman { 1005f256becSEric W. Biederman atomic_inc(&net->use_count); 1015f256becSEric W. Biederman return net; 1025f256becSEric W. Biederman } 1035f256becSEric W. Biederman 1045f256becSEric W. Biederman static inline void release_net(struct net *net) 1055f256becSEric W. Biederman { 1065f256becSEric W. Biederman atomic_dec(&net->use_count); 1075f256becSEric W. Biederman } 108d4655795SPavel Emelyanov #else 109d4655795SPavel Emelyanov static inline struct net *get_net(struct net *net) 110d4655795SPavel Emelyanov { 111d4655795SPavel Emelyanov return net; 112d4655795SPavel Emelyanov } 113d4655795SPavel Emelyanov 114d4655795SPavel Emelyanov static inline void put_net(struct net *net) 115d4655795SPavel Emelyanov { 116d4655795SPavel Emelyanov } 117d4655795SPavel Emelyanov 118d4655795SPavel Emelyanov static inline struct net *hold_net(struct net *net) 119d4655795SPavel Emelyanov { 120d4655795SPavel Emelyanov return net; 121d4655795SPavel Emelyanov } 122d4655795SPavel Emelyanov 123d4655795SPavel Emelyanov static inline void release_net(struct net *net) 124d4655795SPavel Emelyanov { 125d4655795SPavel Emelyanov } 126d4655795SPavel Emelyanov 127d4655795SPavel Emelyanov static inline struct net *maybe_get_net(struct net *net) 128d4655795SPavel Emelyanov { 129d4655795SPavel Emelyanov return net; 130d4655795SPavel Emelyanov } 131d4655795SPavel Emelyanov #endif 1325f256becSEric W. Biederman 1335f256becSEric W. Biederman #define for_each_net(VAR) \ 1345f256becSEric W. Biederman list_for_each_entry(VAR, &net_namespace_list, list) 1355f256becSEric W. Biederman 1364665079cSPavel Emelyanov #ifdef CONFIG_NET_NS 1374665079cSPavel Emelyanov #define __net_init 1384665079cSPavel Emelyanov #define __net_exit 139022cbae6SDenis V. Lunev #define __net_initdata 1404665079cSPavel Emelyanov #else 1414665079cSPavel Emelyanov #define __net_init __init 1424665079cSPavel Emelyanov #define __net_exit __exit_refok 143022cbae6SDenis V. Lunev #define __net_initdata __initdata 1444665079cSPavel Emelyanov #endif 1455f256becSEric W. Biederman 1465f256becSEric W. Biederman struct pernet_operations { 1475f256becSEric W. Biederman struct list_head list; 1485f256becSEric W. Biederman int (*init)(struct net *net); 1495f256becSEric W. Biederman void (*exit)(struct net *net); 1505f256becSEric W. Biederman }; 1515f256becSEric W. Biederman 1525f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *); 1535f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *); 1545f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *); 1555f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *); 1565f256becSEric W. Biederman 15795bdfccbSEric W. Biederman struct ctl_path; 15895bdfccbSEric W. Biederman struct ctl_table; 15995bdfccbSEric W. Biederman struct ctl_table_header; 16095bdfccbSEric W. Biederman extern struct ctl_table_header *register_net_sysctl_table(struct net *net, 16195bdfccbSEric W. Biederman const struct ctl_path *path, struct ctl_table *table); 16295bdfccbSEric W. Biederman extern void unregister_net_sysctl_table(struct ctl_table_header *header); 16395bdfccbSEric W. Biederman 1645f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */ 165