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> 138afd351cSPavel Emelyanov #include <net/netns/ipv4.h> 14b0f159dbSDaniel Lezcano #include <net/netns/ipv6.h> 158d870052SAlexey Dobriyan #include <net/netns/x_tables.h> 16a0a53c8bSDenis V. Lunev 17457c4cbcSEric W. Biederman struct proc_dir_entry; 182774c7abSEric W. Biederman struct net_device; 1997c53cacSDenis V. Lunev struct sock; 201597fbc0SPavel Emelyanov struct ctl_table_header; 211597fbc0SPavel Emelyanov 225f256becSEric W. Biederman struct net { 235f256becSEric W. Biederman atomic_t count; /* To decided when the network 245f256becSEric W. Biederman * namespace should be freed. 255f256becSEric W. Biederman */ 265f256becSEric W. Biederman atomic_t use_count; /* To track references we 275f256becSEric W. Biederman * destroy on demand 285f256becSEric W. Biederman */ 295f256becSEric W. Biederman struct list_head list; /* list of network namespaces */ 305f256becSEric W. Biederman struct work_struct work; /* work struct for freeing */ 31457c4cbcSEric W. Biederman 32457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net; 33457c4cbcSEric W. Biederman struct proc_dir_entry *proc_net_stat; 34881d966bSEric W. Biederman 3595bdfccbSEric W. Biederman struct list_head sysctl_table_headers; 3695bdfccbSEric W. Biederman 372774c7abSEric W. Biederman struct net_device *loopback_dev; /* The loopback */ 382774c7abSEric W. Biederman 39881d966bSEric W. Biederman struct list_head dev_base_head; 40881d966bSEric W. Biederman struct hlist_head *dev_name_head; 41881d966bSEric W. Biederman struct hlist_head *dev_index_head; 4297c53cacSDenis V. Lunev 435fd30ee7SDenis V. Lunev /* core fib_rules */ 445fd30ee7SDenis V. Lunev struct list_head rules_ops; 455fd30ee7SDenis V. Lunev spinlock_t rules_mod_lock; 465fd30ee7SDenis V. Lunev 4797c53cacSDenis V. Lunev struct sock *rtnl; /* rtnetlink socket */ 48d12d01d6SDenis V. Lunev 49024626e3SPavel Emelyanov /* core sysctls */ 50024626e3SPavel Emelyanov struct ctl_table_header *sysctl_core_hdr; 51b8e1f9b5SPavel Emelyanov int sysctl_somaxconn; 52024626e3SPavel Emelyanov 532aaef4e4SDenis V. Lunev struct netns_packet packet; 54a0a53c8bSDenis V. Lunev struct netns_unix unx; 558afd351cSPavel Emelyanov struct netns_ipv4 ipv4; 56b0f159dbSDaniel Lezcano #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 57b0f159dbSDaniel Lezcano struct netns_ipv6 ipv6; 58b0f159dbSDaniel Lezcano #endif 598d870052SAlexey Dobriyan #ifdef CONFIG_NETFILTER 608d870052SAlexey Dobriyan struct netns_xt xt; 618d870052SAlexey Dobriyan #endif 625f256becSEric W. Biederman }; 635f256becSEric W. Biederman 644fabcd71SDaniel Lezcano #ifdef CONFIG_NET 654fabcd71SDaniel Lezcano /* Init's network namespace */ 665f256becSEric W. Biederman extern struct net init_net; 674fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net, 684fabcd71SDaniel Lezcano #else 694fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) 704fabcd71SDaniel Lezcano #endif 714fabcd71SDaniel Lezcano 725f256becSEric W. Biederman extern struct list_head net_namespace_list; 735f256becSEric W. Biederman 749dd776b6SEric W. Biederman #ifdef CONFIG_NET 759dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns); 769dd776b6SEric W. Biederman #else 779dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns) 789dd776b6SEric W. Biederman { 799dd776b6SEric W. Biederman /* There is nothing to copy so this is a noop */ 809dd776b6SEric W. Biederman return net_ns; 819dd776b6SEric W. Biederman } 829dd776b6SEric W. Biederman #endif 839dd776b6SEric W. Biederman 84d4655795SPavel Emelyanov #ifdef CONFIG_NET_NS 855f256becSEric W. Biederman extern void __put_net(struct net *net); 865f256becSEric W. Biederman 875f256becSEric W. Biederman static inline struct net *get_net(struct net *net) 885f256becSEric W. Biederman { 895f256becSEric W. Biederman atomic_inc(&net->count); 905f256becSEric W. Biederman return net; 915f256becSEric W. Biederman } 925f256becSEric W. Biederman 93077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net) 94077130c0SEric W. Biederman { 95077130c0SEric W. Biederman /* Used when we know struct net exists but we 96077130c0SEric W. Biederman * aren't guaranteed a previous reference count 97077130c0SEric W. Biederman * exists. If the reference count is zero this 98077130c0SEric W. Biederman * function fails and returns NULL. 99077130c0SEric W. Biederman */ 100077130c0SEric W. Biederman if (!atomic_inc_not_zero(&net->count)) 101077130c0SEric W. Biederman net = NULL; 102077130c0SEric W. Biederman return net; 103077130c0SEric W. Biederman } 104077130c0SEric W. Biederman 1055f256becSEric W. Biederman static inline void put_net(struct net *net) 1065f256becSEric W. Biederman { 1075f256becSEric W. Biederman if (atomic_dec_and_test(&net->count)) 1085f256becSEric W. Biederman __put_net(net); 1095f256becSEric W. Biederman } 1105f256becSEric W. Biederman 1115f256becSEric W. Biederman static inline struct net *hold_net(struct net *net) 1125f256becSEric W. Biederman { 1135f256becSEric W. Biederman atomic_inc(&net->use_count); 1145f256becSEric W. Biederman return net; 1155f256becSEric W. Biederman } 1165f256becSEric W. Biederman 1175f256becSEric W. Biederman static inline void release_net(struct net *net) 1185f256becSEric W. Biederman { 1195f256becSEric W. Biederman atomic_dec(&net->use_count); 1205f256becSEric W. Biederman } 121878628fbSYOSHIFUJI Hideaki 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 *hold_net(struct net *net) 138d4655795SPavel Emelyanov { 139d4655795SPavel Emelyanov return net; 140d4655795SPavel Emelyanov } 141d4655795SPavel Emelyanov 142d4655795SPavel Emelyanov static inline void release_net(struct net *net) 143d4655795SPavel Emelyanov { 144d4655795SPavel Emelyanov } 145d4655795SPavel Emelyanov 146d4655795SPavel Emelyanov static inline struct net *maybe_get_net(struct net *net) 147d4655795SPavel Emelyanov { 148d4655795SPavel Emelyanov return net; 149d4655795SPavel Emelyanov } 150878628fbSYOSHIFUJI Hideaki 151878628fbSYOSHIFUJI Hideaki static inline 152878628fbSYOSHIFUJI Hideaki int net_eq(const struct net *net1, const struct net *net2) 153878628fbSYOSHIFUJI Hideaki { 154878628fbSYOSHIFUJI Hideaki return 1; 155878628fbSYOSHIFUJI Hideaki } 156d4655795SPavel Emelyanov #endif 1575f256becSEric W. Biederman 1585f256becSEric W. Biederman #define for_each_net(VAR) \ 1595f256becSEric W. Biederman list_for_each_entry(VAR, &net_namespace_list, list) 1605f256becSEric W. Biederman 1614665079cSPavel Emelyanov #ifdef CONFIG_NET_NS 1624665079cSPavel Emelyanov #define __net_init 1634665079cSPavel Emelyanov #define __net_exit 164022cbae6SDenis V. Lunev #define __net_initdata 1654665079cSPavel Emelyanov #else 1664665079cSPavel Emelyanov #define __net_init __init 1674665079cSPavel Emelyanov #define __net_exit __exit_refok 168022cbae6SDenis V. Lunev #define __net_initdata __initdata 1694665079cSPavel Emelyanov #endif 1705f256becSEric W. Biederman 1715f256becSEric W. Biederman struct pernet_operations { 1725f256becSEric W. Biederman struct list_head list; 1735f256becSEric W. Biederman int (*init)(struct net *net); 1745f256becSEric W. Biederman void (*exit)(struct net *net); 1755f256becSEric W. Biederman }; 1765f256becSEric W. Biederman 1775f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *); 1785f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *); 1795f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *); 1805f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *); 1815f256becSEric W. Biederman 18295bdfccbSEric W. Biederman struct ctl_path; 18395bdfccbSEric W. Biederman struct ctl_table; 18495bdfccbSEric W. Biederman struct ctl_table_header; 18595bdfccbSEric W. Biederman extern struct ctl_table_header *register_net_sysctl_table(struct net *net, 18695bdfccbSEric W. Biederman const struct ctl_path *path, struct ctl_table *table); 18795bdfccbSEric W. Biederman extern void unregister_net_sysctl_table(struct ctl_table_header *header); 18895bdfccbSEric W. Biederman 1895f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */ 190