[IPV4]: When possible test for IFF_LOOPBACK and not dev == loopback_dev
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / net / net_namespace.h
CommitLineData
5f256bec
EB
1/*
2 * Operations on the network namespace
3 */
4#ifndef __NET_NET_NAMESPACE_H
5#define __NET_NET_NAMESPACE_H
6
7#include <asm/atomic.h>
8#include <linux/workqueue.h>
9#include <linux/list.h>
10
457c4cbc 11struct proc_dir_entry;
5f256bec
EB
12struct net {
13 atomic_t count; /* To decided when the network
14 * namespace should be freed.
15 */
16 atomic_t use_count; /* To track references we
17 * destroy on demand
18 */
19 struct list_head list; /* list of network namespaces */
20 struct work_struct work; /* work struct for freeing */
457c4cbc
EB
21
22 struct proc_dir_entry *proc_net;
23 struct proc_dir_entry *proc_net_stat;
24 struct proc_dir_entry *proc_net_root;
881d966b
EB
25
26 struct list_head dev_base_head;
27 struct hlist_head *dev_name_head;
28 struct hlist_head *dev_index_head;
5f256bec
EB
29};
30
4fabcd71
DL
31#ifdef CONFIG_NET
32/* Init's network namespace */
5f256bec 33extern struct net init_net;
4fabcd71
DL
34#define INIT_NET_NS(net_ns) .net_ns = &init_net,
35#else
36#define INIT_NET_NS(net_ns)
37#endif
38
5f256bec
EB
39extern struct list_head net_namespace_list;
40
9dd776b6
EB
41#ifdef CONFIG_NET
42extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns);
43#else
44static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns)
45{
46 /* There is nothing to copy so this is a noop */
47 return net_ns;
48}
49#endif
50
5f256bec
EB
51extern void __put_net(struct net *net);
52
53static inline struct net *get_net(struct net *net)
54{
9dd776b6 55#ifdef CONFIG_NET
5f256bec 56 atomic_inc(&net->count);
9dd776b6 57#endif
5f256bec
EB
58 return net;
59}
60
077130c0
EB
61static inline struct net *maybe_get_net(struct net *net)
62{
63 /* Used when we know struct net exists but we
64 * aren't guaranteed a previous reference count
65 * exists. If the reference count is zero this
66 * function fails and returns NULL.
67 */
68 if (!atomic_inc_not_zero(&net->count))
69 net = NULL;
70 return net;
71}
72
5f256bec
EB
73static inline void put_net(struct net *net)
74{
9dd776b6 75#ifdef CONFIG_NET
5f256bec
EB
76 if (atomic_dec_and_test(&net->count))
77 __put_net(net);
9dd776b6 78#endif
5f256bec
EB
79}
80
81static inline struct net *hold_net(struct net *net)
82{
9dd776b6 83#ifdef CONFIG_NET
5f256bec 84 atomic_inc(&net->use_count);
9dd776b6 85#endif
5f256bec
EB
86 return net;
87}
88
89static inline void release_net(struct net *net)
90{
9dd776b6 91#ifdef CONFIG_NET
5f256bec 92 atomic_dec(&net->use_count);
9dd776b6 93#endif
5f256bec
EB
94}
95
96extern void net_lock(void);
97extern void net_unlock(void);
98
99#define for_each_net(VAR) \
100 list_for_each_entry(VAR, &net_namespace_list, list)
101
102
103struct pernet_operations {
104 struct list_head list;
105 int (*init)(struct net *net);
106 void (*exit)(struct net *net);
107};
108
109extern int register_pernet_subsys(struct pernet_operations *);
110extern void unregister_pernet_subsys(struct pernet_operations *);
111extern int register_pernet_device(struct pernet_operations *);
112extern void unregister_pernet_device(struct pernet_operations *);
113
114#endif /* __NET_NET_NAMESPACE_H */