xref: /openbmc/linux/include/net/net_namespace.h (revision 9dd776b6)
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;
125f256becSEric W. Biederman struct net {
135f256becSEric W. Biederman 	atomic_t		count;		/* To decided when the network
145f256becSEric W. Biederman 						 *  namespace should be freed.
155f256becSEric W. Biederman 						 */
165f256becSEric W. Biederman 	atomic_t		use_count;	/* To track references we
175f256becSEric W. Biederman 						 * destroy on demand
185f256becSEric W. Biederman 						 */
195f256becSEric W. Biederman 	struct list_head	list;		/* list of network namespaces */
205f256becSEric W. Biederman 	struct work_struct	work;		/* work struct for freeing */
21457c4cbcSEric W. Biederman 
22457c4cbcSEric W. Biederman 	struct proc_dir_entry 	*proc_net;
23457c4cbcSEric W. Biederman 	struct proc_dir_entry 	*proc_net_stat;
24457c4cbcSEric W. Biederman 	struct proc_dir_entry 	*proc_net_root;
25881d966bSEric W. Biederman 
26881d966bSEric W. Biederman 	struct list_head 	dev_base_head;
27881d966bSEric W. Biederman 	struct hlist_head 	*dev_name_head;
28881d966bSEric W. Biederman 	struct hlist_head	*dev_index_head;
295f256becSEric W. Biederman };
305f256becSEric W. Biederman 
314fabcd71SDaniel Lezcano #ifdef CONFIG_NET
324fabcd71SDaniel Lezcano /* Init's network namespace */
335f256becSEric W. Biederman extern struct net init_net;
344fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns) .net_ns = &init_net,
354fabcd71SDaniel Lezcano #else
364fabcd71SDaniel Lezcano #define INIT_NET_NS(net_ns)
374fabcd71SDaniel Lezcano #endif
384fabcd71SDaniel Lezcano 
395f256becSEric W. Biederman extern struct list_head net_namespace_list;
405f256becSEric W. Biederman 
419dd776b6SEric W. Biederman #ifdef CONFIG_NET
429dd776b6SEric W. Biederman extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns);
439dd776b6SEric W. Biederman #else
449dd776b6SEric W. Biederman static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns)
459dd776b6SEric W. Biederman {
469dd776b6SEric W. Biederman 	/* There is nothing to copy so this is a noop */
479dd776b6SEric W. Biederman 	return net_ns;
489dd776b6SEric W. Biederman }
499dd776b6SEric W. Biederman #endif
509dd776b6SEric W. Biederman 
515f256becSEric W. Biederman extern void __put_net(struct net *net);
525f256becSEric W. Biederman 
535f256becSEric W. Biederman static inline struct net *get_net(struct net *net)
545f256becSEric W. Biederman {
559dd776b6SEric W. Biederman #ifdef CONFIG_NET
565f256becSEric W. Biederman 	atomic_inc(&net->count);
579dd776b6SEric W. Biederman #endif
585f256becSEric W. Biederman 	return net;
595f256becSEric W. Biederman }
605f256becSEric W. Biederman 
61077130c0SEric W. Biederman static inline struct net *maybe_get_net(struct net *net)
62077130c0SEric W. Biederman {
63077130c0SEric W. Biederman 	/* Used when we know struct net exists but we
64077130c0SEric W. Biederman 	 * aren't guaranteed a previous reference count
65077130c0SEric W. Biederman 	 * exists.  If the reference count is zero this
66077130c0SEric W. Biederman 	 * function fails and returns NULL.
67077130c0SEric W. Biederman 	 */
68077130c0SEric W. Biederman 	if (!atomic_inc_not_zero(&net->count))
69077130c0SEric W. Biederman 		net = NULL;
70077130c0SEric W. Biederman 	return net;
71077130c0SEric W. Biederman }
72077130c0SEric W. Biederman 
735f256becSEric W. Biederman static inline void put_net(struct net *net)
745f256becSEric W. Biederman {
759dd776b6SEric W. Biederman #ifdef CONFIG_NET
765f256becSEric W. Biederman 	if (atomic_dec_and_test(&net->count))
775f256becSEric W. Biederman 		__put_net(net);
789dd776b6SEric W. Biederman #endif
795f256becSEric W. Biederman }
805f256becSEric W. Biederman 
815f256becSEric W. Biederman static inline struct net *hold_net(struct net *net)
825f256becSEric W. Biederman {
839dd776b6SEric W. Biederman #ifdef CONFIG_NET
845f256becSEric W. Biederman 	atomic_inc(&net->use_count);
859dd776b6SEric W. Biederman #endif
865f256becSEric W. Biederman 	return net;
875f256becSEric W. Biederman }
885f256becSEric W. Biederman 
895f256becSEric W. Biederman static inline void release_net(struct net *net)
905f256becSEric W. Biederman {
919dd776b6SEric W. Biederman #ifdef CONFIG_NET
925f256becSEric W. Biederman 	atomic_dec(&net->use_count);
939dd776b6SEric W. Biederman #endif
945f256becSEric W. Biederman }
955f256becSEric W. Biederman 
965f256becSEric W. Biederman extern void net_lock(void);
975f256becSEric W. Biederman extern void net_unlock(void);
985f256becSEric W. Biederman 
995f256becSEric W. Biederman #define for_each_net(VAR)				\
1005f256becSEric W. Biederman 	list_for_each_entry(VAR, &net_namespace_list, list)
1015f256becSEric W. Biederman 
1025f256becSEric W. Biederman 
1035f256becSEric W. Biederman struct pernet_operations {
1045f256becSEric W. Biederman 	struct list_head list;
1055f256becSEric W. Biederman 	int (*init)(struct net *net);
1065f256becSEric W. Biederman 	void (*exit)(struct net *net);
1075f256becSEric W. Biederman };
1085f256becSEric W. Biederman 
1095f256becSEric W. Biederman extern int register_pernet_subsys(struct pernet_operations *);
1105f256becSEric W. Biederman extern void unregister_pernet_subsys(struct pernet_operations *);
1115f256becSEric W. Biederman extern int register_pernet_device(struct pernet_operations *);
1125f256becSEric W. Biederman extern void unregister_pernet_device(struct pernet_operations *);
1135f256becSEric W. Biederman 
1145f256becSEric W. Biederman #endif /* __NET_NET_NAMESPACE_H */
115