xref: /openbmc/linux/include/net/net_namespace.h (revision 97c53cac)
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