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 118efa6e93SPavel Emelyanov #include <net/netns/core.h> 12a0a53c8bSDenis V. Lunev #include <net/netns/unix.h> 132aaef4e4SDenis V. Lunev #include <net/netns/packet.h> 148afd351cSPavel Emelyanov #include <net/netns/ipv4.h> 15b0f159dbSDaniel Lezcano #include <net/netns/ipv6.h> 1667019cc9SPavel Emelyanov #include <net/netns/dccp.h> 178d870052SAlexey Dobriyan #include <net/netns/x_tables.h> 18a0a53c8bSDenis V. Lunev 19457c4cbcSEric W. Biederman struct proc_dir_entry; 202774c7abSEric W. Biederman struct net_device; 2197c53cacSDenis V. Lunev struct sock; 221597fbc0SPavel Emelyanov struct ctl_table_header; 23dec827d1SPavel Emelyanov struct net_generic; 241597fbc0SPavel Emelyanov 255f256becSEric W. Biederman struct net { 265f256becSEric W. Biederman atomic_t count; /* To decided when the network 275f256becSEric W. Biederman * namespace should be freed. 285f256becSEric W. Biederman */ 295d1e4468SDenis V. Lunev #ifdef NETNS_REFCNT_DEBUG 305f256becSEric W. Biederman atomic_t use_count; /* To track references we 315f256becSEric W. Biederman * destroy on demand 325f256becSEric W. Biederman */ 335d1e4468SDenis V. Lunev #endif 345f256becSEric W. Biederman struct list_head list; /* list of network namespaces */ 355f256becSEric W. Biederman struct work_struct work; /* work struct for freeing */ 36457c4cbcSEric W. Biederman 37457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net; 38457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_stat; 39881d966bSEric W. Biederman 4095bdfccbSEric W. Biederman struct list_head sysctl_table_headers; 4195bdfccbSEric W. Biederman 422774c7abSEric W. Biederman struct net_device *loopback_dev; /* The loopback */ 432774c7abSEric W. Biederman 44881d966bSEric W. Biederman struct list_head dev_base_head; 45881d966bSEric W. Biederman struct hlist_head *dev_name_head; 46881d966bSEric W. Biederman struct hlist_head *dev_index_head; 4797c53cacSDenis V. Lunev 485fd30ee7SDenis V. Lunev /* core fib_rules */ 495fd30ee7SDenis V. Lunev struct list_head rules_ops; 505fd30ee7SDenis V. Lunev spinlock_t rules_mod_lock; 515fd30ee7SDenis V. Lunev 5297c53cacSDenis V. Lunev struct sock *rtnl; /* rtnetlink socket */ 53d12d01d6SDenis V. Lunev 548efa6e93SPavel Emelyanov struct netns_core core; 552aaef4e4SDenis V. Lunev struct netns_packet packet; 56a0a53c8bSDenis V. Lunev struct netns_unix unx; 578afd351cSPavel Emelyanov struct netns_ipv4 ipv4; 58b0f159dbSDaniel Lezcano #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 59b0f159dbSDaniel Lezcano struct netns_ipv6 ipv6; 60b0f159dbSDaniel Lezcano #endif 6167019cc9SPavel Emelyanov #if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE) 6267019cc9SPavel Emelyanov struct netns_dccp dccp; 6367019cc9SPavel Emelyanov #endif 648d870052SAlexey Dobriyan #ifdef CONFIG_NETFILTER 658d870052SAlexey Dobriyan struct netns_xt xt; 668d870052SAlexey Dobriyan #endif 67dec827d1SPavel Emelyanov struct net_generic *gen; 685f256becSEric W. Biederman }; 695f256becSEric W. Biederman 70225c0a01SDenis V. Lunev 71c0f39322SDenis V. Lunev #include <linux/seq_file_net.h> 72c0f39322SDenis V. Lunev 734fabcd71SDaniel Lezcano /* Init's network namespace */ 745f256becSEric W. Biederman extern struct net init_net; 75a4aa834aSDenis V. Lunev 76a4aa834aSDenis V. Lunev #ifdef CONFIG_NET 774fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net, 784fabcd71SDaniel Lezcano 799dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 80225c0a01SDenis V. Lunev 81225c0a01SDenis V. Lunev #else /* CONFIG_NET */ 82225c0a01SDenis V. Lunev 83225c0a01SDenis V. Lunev #define INIT_NET_NS(net_ns) 84225c0a01SDenis V. Lunev 859dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 869dd776b6SEric W. Biederman { 879dd776b6SEric W. Biederman /* There is nothing to copy so this is a noop */ 889dd776b6SEric W. Biederman return net_ns; 899dd776b6SEric W. Biederman } 90225c0a01SDenis V. Lunev #endif /* CONFIG_NET */ 91225c0a01SDenis V. Lunev 92225c0a01SDenis V. Lunev 93225c0a01SDenis V. Lunev extern struct list_head net_namespace_list; 949dd776b6SEric W. Biederman 95d4655795SPavel Emelyanov #ifdef CONFIG_NET_NS 965f256becSEric W. Biederman extern void __put_net(struct net *net); 975f256becSEric W. Biederman 985f256becSEric W. Biederman static inline struct net *get_net(struct net *net) 995f256becSEric W. Biederman { 1005f256becSEric W. Biederman atomic_inc(&net->count); 1015f256becSEric W. Biederman return net; 1025f256becSEric W. Biederman } 1035f256becSEric W. Biederman 104077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net) 105077130c0SEric W. Biederman { 106077130c0SEric W. Biederman /* Used when we know struct net exists but we 107077130c0SEric W. Biederman * aren't guaranteed a previous reference count 108077130c0SEric W. Biederman * exists. If the reference count is zero this 109077130c0SEric W. Biederman * function fails and returns NULL. 110077130c0SEric W. Biederman */ 111077130c0SEric W. Biederman if (!atomic_inc_not_zero(&net->count)) 112077130c0SEric W. Biederman net = NULL; 113077130c0SEric W. Biederman return net; 114077130c0SEric W. Biederman } 115077130c0SEric W. Biederman 1165f256becSEric W. Biederman static inline void put_net(struct net *net) 1175f256becSEric W. Biederman { 1185f256becSEric W. Biederman if (atomic_dec_and_test(&net->count)) 1195f256becSEric W. Biederman __put_net(net); 1205f256becSEric W. Biederman } 1215f256becSEric W. Biederman 122878628fbSYOSHIFUJI Hideaki static inline 123878628fbSYOSHIFUJI Hideaki int net_eq(const struct net *net1, const struct net *net2) 124878628fbSYOSHIFUJI Hideaki { 125878628fbSYOSHIFUJI Hideaki return net1 == net2; 126878628fbSYOSHIFUJI Hideaki } 127d4655795SPavel Emelyanov #else 128d4655795SPavel Emelyanov static inline struct net *get_net(struct net *net) 129d4655795SPavel Emelyanov { 130d4655795SPavel Emelyanov return net; 131d4655795SPavel Emelyanov } 132d4655795SPavel Emelyanov 133d4655795SPavel Emelyanov static inline void put_net(struct net *net) 134d4655795SPavel Emelyanov { 135d4655795SPavel Emelyanov } 136d4655795SPavel Emelyanov 137d4655795SPavel Emelyanov static inline struct net *maybe_get_net(struct net *net) 138d4655795SPavel Emelyanov { 139d4655795SPavel Emelyanov return net; 140d4655795SPavel Emelyanov } 141878628fbSYOSHIFUJI Hideaki 142878628fbSYOSHIFUJI Hideaki static inline 143878628fbSYOSHIFUJI Hideaki int net_eq(const struct net *net1, const struct net *net2) 144878628fbSYOSHIFUJI Hideaki { 145878628fbSYOSHIFUJI Hideaki return 1; 146878628fbSYOSHIFUJI Hideaki } 147d4655795SPavel Emelyanov #endif 1485f256becSEric W. Biederman 1495d1e4468SDenis V. Lunev 1505d1e4468SDenis V. Lunev #ifdef NETNS_REFCNT_DEBUG 1515d1e4468SDenis V. Lunev static inline struct net *hold_net(struct net *net) 1525d1e4468SDenis V. Lunev { 1535d1e4468SDenis V. Lunev if (net) 1545d1e4468SDenis V. Lunev atomic_inc(&net->use_count); 1555d1e4468SDenis V. Lunev return net; 1565d1e4468SDenis V. Lunev } 1575d1e4468SDenis V. Lunev 1585d1e4468SDenis V. Lunev static inline void release_net(struct net *net) 1595d1e4468SDenis V. Lunev { 1605d1e4468SDenis V. Lunev if (net) 1615d1e4468SDenis V. Lunev atomic_dec(&net->use_count); 1625d1e4468SDenis V. Lunev } 1635d1e4468SDenis V. Lunev #else 1645d1e4468SDenis V. Lunev static inline struct net *hold_net(struct net *net) 1655d1e4468SDenis V. Lunev { 1665d1e4468SDenis V. Lunev return net; 1675d1e4468SDenis V. Lunev } 1685d1e4468SDenis V. Lunev 1695d1e4468SDenis V. Lunev static inline void release_net(struct net *net) 1705d1e4468SDenis V. Lunev { 1715d1e4468SDenis V. Lunev } 1725d1e4468SDenis V. Lunev #endif 1735d1e4468SDenis V. Lunev 1745d1e4468SDenis V. Lunev 1755f256becSEric W. Biederman #define for_each_net(VAR) \ 1765f256becSEric W. Biederman list_for_each_entry(VAR, &net_namespace_list, list) 1775f256becSEric W. Biederman 1784665079cSPavel Emelyanov #ifdef CONFIG_NET_NS 1794665079cSPavel Emelyanov #define __net_init 1804665079cSPavel Emelyanov #define __net_exit 181022cbae6SDenis V. Lunev #define __net_initdata 1824665079cSPavel Emelyanov #else 1834665079cSPavel Emelyanov #define __net_init __init 1844665079cSPavel Emelyanov #define __net_exit __exit_refok 185022cbae6SDenis V. Lunev #define __net_initdata __initdata 1864665079cSPavel Emelyanov #endif 1875f256becSEric W. Biederman 1885f256becSEric W. Biederman struct pernet_operations { 1895f256becSEric W. Biederman struct list_head list; 1905f256becSEric W. Biederman int (*init)(struct net *net); 1915f256becSEric W. Biederman void (*exit)(struct net *net); 1925f256becSEric W. Biederman }; 1935f256becSEric W. Biederman 1945f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *); 1955f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *); 1965f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *); 1975f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *); 198c93cf61fSPavel Emelyanov extern int register_pernet_gen_device(int *id, struct pernet_operations *); 199c93cf61fSPavel Emelyanov extern void unregister_pernet_gen_device(int id, struct pernet_operations *); 2005f256becSEric W. Biederman 20195bdfccbSEric W. Biederman struct ctl_path; 20295bdfccbSEric W. Biederman struct ctl_table; 20395bdfccbSEric W. Biederman struct ctl_table_header; 20495bdfccbSEric W. Biederman extern struct ctl_table_header *register_net_sysctl_table(struct net *net, 20595bdfccbSEric W. Biederman const struct ctl_path *path, struct ctl_table *table); 20695bdfccbSEric W. Biederman extern void unregister_net_sysctl_table(struct ctl_table_header *header); 20795bdfccbSEric W. Biederman 2085f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */ 209