xref: /openbmc/linux/include/net/net_namespace.h (revision 022cbae6)
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;
135f256becSEric W. Biederman struct net {
145f256becSEric W. Biederman 	atomic_t		count;		/* To decided when the network
155f256becSEric W. Biederman 						 *  namespace should be freed.
165f256becSEric W. Biederman 						 */
175f256becSEric W. Biederman 	atomic_t		use_count;	/* To track references we
185f256becSEric W. Biederman 						 * destroy on demand
195f256becSEric W. Biederman 						 */
205f256becSEric W. Biederman 	struct list_head	list;		/* list of network namespaces */
215f256becSEric W. Biederman 	struct work_struct	work;		/* work struct for freeing */
22457c4cbcSEric W. Biederman 
23457c4cbcSEric W. Biederman 	struct proc_dir_entry 	*proc_net;
24457c4cbcSEric W. Biederman 	struct proc_dir_entry 	*proc_net_stat;
25457c4cbcSEric W. Biederman 	struct proc_dir_entry 	*proc_net_root;
26881d966bSEric W. Biederman 
272774c7abSEric W. Biederman 	struct net_device       *loopback_dev;          /* The loopback */
282774c7abSEric W. Biederman 
29881d966bSEric W. Biederman 	struct list_head 	dev_base_head;
30881d966bSEric W. Biederman 	struct hlist_head 	*dev_name_head;
31881d966bSEric W. Biederman 	struct hlist_head	*dev_index_head;
325f256becSEric W. Biederman };
335f256becSEric W. Biederman 
344fabcd71SDaniel Lezcano #ifdef CONFIG_NET
354fabcd71SDaniel Lezcano /* Init's network namespace */
365f256becSEric W. Biederman extern struct net init_net;
374fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net,
384fabcd71SDaniel Lezcano #else
394fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns)
404fabcd71SDaniel Lezcano #endif
414fabcd71SDaniel Lezcano 
425f256becSEric W. Biederman extern struct list_head net_namespace_list;
435f256becSEric W. Biederman 
449dd776b6SEric W. Biederman #ifdef CONFIG_NET
459dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns);
469dd776b6SEric W. Biederman #else
479dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns)
489dd776b6SEric W. Biederman {
499dd776b6SEric W. Biederman 	/* There is nothing to copy so this is a noop */
509dd776b6SEric W. Biederman 	return net_ns;
519dd776b6SEric W. Biederman }
529dd776b6SEric W. Biederman #endif
539dd776b6SEric W. Biederman 
54d4655795SPavel Emelyanov #ifdef CONFIG_NET_NS
555f256becSEric W. Biederman extern void __put_net(struct net *net);
565f256becSEric W. Biederman 
575f256becSEric W. Biederman static inline struct net *get_net(struct net *net)
585f256becSEric W. Biederman {
595f256becSEric W. Biederman 	atomic_inc(&net->count);
605f256becSEric W. Biederman 	return net;
615f256becSEric W. Biederman }
625f256becSEric W. Biederman 
63077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net)
64077130c0SEric W. Biederman {
65077130c0SEric W. Biederman 	/* Used when we know struct net exists but we
66077130c0SEric W. Biederman 	 * aren't guaranteed a previous reference count
67077130c0SEric W. Biederman 	 * exists.  If the reference count is zero this
68077130c0SEric W. Biederman 	 * function fails and returns NULL.
69077130c0SEric W. Biederman 	 */
70077130c0SEric W. Biederman 	if (!atomic_inc_not_zero(&net->count))
71077130c0SEric W. Biederman 		net = NULL;
72077130c0SEric W. Biederman 	return net;
73077130c0SEric W. Biederman }
74077130c0SEric W. Biederman 
755f256becSEric W. Biederman static inline void put_net(struct net *net)
765f256becSEric W. Biederman {
775f256becSEric W. Biederman 	if (atomic_dec_and_test(&net->count))
785f256becSEric W. Biederman 		__put_net(net);
795f256becSEric W. Biederman }
805f256becSEric W. Biederman 
815f256becSEric W. Biederman static inline struct net *hold_net(struct net *net)
825f256becSEric W. Biederman {
835f256becSEric W. Biederman 	atomic_inc(&net->use_count);
845f256becSEric W. Biederman 	return net;
855f256becSEric W. Biederman }
865f256becSEric W. Biederman 
875f256becSEric W. Biederman static inline void release_net(struct net *net)
885f256becSEric W. Biederman {
895f256becSEric W. Biederman 	atomic_dec(&net->use_count);
905f256becSEric W. Biederman }
91d4655795SPavel Emelyanov #else
92d4655795SPavel Emelyanov static inline struct net *get_net(struct net *net)
93d4655795SPavel Emelyanov {
94d4655795SPavel Emelyanov 	return net;
95d4655795SPavel Emelyanov }
96d4655795SPavel Emelyanov 
97d4655795SPavel Emelyanov static inline void put_net(struct net *net)
98d4655795SPavel Emelyanov {
99d4655795SPavel Emelyanov }
100d4655795SPavel Emelyanov 
101d4655795SPavel Emelyanov static inline struct net *hold_net(struct net *net)
102d4655795SPavel Emelyanov {
103d4655795SPavel Emelyanov 	return net;
104d4655795SPavel Emelyanov }
105d4655795SPavel Emelyanov 
106d4655795SPavel Emelyanov static inline void release_net(struct net *net)
107d4655795SPavel Emelyanov {
108d4655795SPavel Emelyanov }
109d4655795SPavel Emelyanov 
110d4655795SPavel Emelyanov static inline struct net *maybe_get_net(struct net *net)
111d4655795SPavel Emelyanov {
112d4655795SPavel Emelyanov 	return net;
113d4655795SPavel Emelyanov }
114d4655795SPavel Emelyanov #endif
1155f256becSEric W. Biederman 
1165f256becSEric W. Biederman #define for_each_net(VAR)				\
1175f256becSEric W. Biederman 	list_for_each_entry(VAR, &net_namespace_list, list)
1185f256becSEric W. Biederman 
1194665079cSPavel Emelyanov #ifdef CONFIG_NET_NS
1204665079cSPavel Emelyanov #define __net_init
1214665079cSPavel Emelyanov #define __net_exit
122022cbae6SDenis V. Lunev #define __net_initdata
1234665079cSPavel Emelyanov #else
1244665079cSPavel Emelyanov #define __net_init	__init
1254665079cSPavel Emelyanov #define __net_exit	__exit_refok
126022cbae6SDenis V. Lunev #define __net_initdata	__initdata
1274665079cSPavel Emelyanov #endif
1285f256becSEric W. Biederman 
1295f256becSEric W. Biederman struct pernet_operations {
1305f256becSEric W. Biederman 	struct list_head list;
1315f256becSEric W. Biederman 	int (*init)(struct net *net);
1325f256becSEric W. Biederman 	void (*exit)(struct net *net);
1335f256becSEric W. Biederman };
1345f256becSEric W. Biederman 
1355f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *);
1365f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *);
1375f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *);
1385f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *);
1395f256becSEric W. Biederman 
1405f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */
141