linux/include/net/net_namespace.h
<<
>>
Prefs
   1/*
   2 * Operations on the network namespace
   3 */
   4#ifndef __NET_NET_NAMESPACE_H
   5#define __NET_NET_NAMESPACE_H
   6
   7#include <linux/atomic.h>
   8#include <linux/workqueue.h>
   9#include <linux/list.h>
  10#include <linux/sysctl.h>
  11
  12#include <net/netns/core.h>
  13#include <net/netns/mib.h>
  14#include <net/netns/unix.h>
  15#include <net/netns/packet.h>
  16#include <net/netns/ipv4.h>
  17#include <net/netns/ipv6.h>
  18#include <net/netns/sctp.h>
  19#include <net/netns/dccp.h>
  20#include <net/netns/netfilter.h>
  21#include <net/netns/x_tables.h>
  22#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
  23#include <net/netns/conntrack.h>
  24#endif
  25#include <net/netns/xfrm.h>
  26
  27struct user_namespace;
  28struct proc_dir_entry;
  29struct net_device;
  30struct sock;
  31struct ctl_table_header;
  32struct net_generic;
  33struct sock;
  34struct netns_ipvs;
  35
  36
  37#define NETDEV_HASHBITS    8
  38#define NETDEV_HASHENTRIES (1 << NETDEV_HASHBITS)
  39
  40struct net {
  41        atomic_t                passive;        /* To decided when the network
  42                                                 * namespace should be freed.
  43                                                 */
  44        atomic_t                count;          /* To decided when the network
  45                                                 *  namespace should be shut down.
  46                                                 */
  47#ifdef NETNS_REFCNT_DEBUG
  48        atomic_t                use_count;      /* To track references we
  49                                                 * destroy on demand
  50                                                 */
  51#endif
  52        spinlock_t              rules_mod_lock;
  53
  54        struct list_head        list;           /* list of network namespaces */
  55        struct list_head        cleanup_list;   /* namespaces on death row */
  56        struct list_head        exit_list;      /* Use only net_mutex */
  57
  58        struct user_namespace   *user_ns;       /* Owning user namespace */
  59
  60        unsigned int            proc_inum;
  61
  62        struct proc_dir_entry   *proc_net;
  63        struct proc_dir_entry   *proc_net_stat;
  64
  65#ifdef CONFIG_SYSCTL
  66        struct ctl_table_set    sysctls;
  67#endif
  68
  69        struct sock             *rtnl;                  /* rtnetlink socket */
  70        struct sock             *genl_sock;
  71
  72        struct list_head        dev_base_head;
  73        struct hlist_head       *dev_name_head;
  74        struct hlist_head       *dev_index_head;
  75        unsigned int            dev_base_seq;   /* protected by rtnl_mutex */
  76        int                     ifindex;
  77
  78        /* core fib_rules */
  79        struct list_head        rules_ops;
  80
  81
  82        struct net_device       *loopback_dev;          /* The loopback */
  83        struct netns_core       core;
  84        struct netns_mib        mib;
  85        struct netns_packet     packet;
  86        struct netns_unix       unx;
  87        struct netns_ipv4       ipv4;
  88#if IS_ENABLED(CONFIG_IPV6)
  89        struct netns_ipv6       ipv6;
  90#endif
  91#if defined(CONFIG_IP_SCTP) || defined(CONFIG_IP_SCTP_MODULE)
  92        struct netns_sctp       sctp;
  93#endif
  94#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)
  95        struct netns_dccp       dccp;
  96#endif
  97#ifdef CONFIG_NETFILTER
  98        struct netns_nf         nf;
  99        struct netns_xt         xt;
 100#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
 101        struct netns_ct         ct;
 102#endif
 103#if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)
 104        struct netns_nf_frag    nf_frag;
 105#endif
 106        struct sock             *nfnl;
 107        struct sock             *nfnl_stash;
 108#endif
 109#ifdef CONFIG_WEXT_CORE
 110        struct sk_buff_head     wext_nlevents;
 111#endif
 112        struct net_generic __rcu        *gen;
 113
 114        /* Note : following structs are cache line aligned */
 115#ifdef CONFIG_XFRM
 116        struct netns_xfrm       xfrm;
 117#endif
 118#if IS_ENABLED(CONFIG_IP_VS)
 119        struct netns_ipvs       *ipvs;
 120#endif
 121        struct sock             *diag_nlsk;
 122        atomic_t                rt_genid;
 123        atomic_t                fnhe_genid;
 124};
 125
 126/*
 127 * ifindex generation is per-net namespace, and loopback is
 128 * always the 1st device in ns (see net_dev_init), thus any
 129 * loopback device should get ifindex 1
 130 */
 131
 132#define LOOPBACK_IFINDEX        1
 133
 134#include <linux/seq_file_net.h>
 135
 136/* Init's network namespace */
 137extern struct net init_net;
 138
 139#ifdef CONFIG_NET_NS
 140extern struct net *copy_net_ns(unsigned long flags,
 141        struct user_namespace *user_ns, struct net *old_net);
 142
 143#else /* CONFIG_NET_NS */
 144#include <linux/sched.h>
 145#include <linux/nsproxy.h>
 146static inline struct net *copy_net_ns(unsigned long flags,
 147        struct user_namespace *user_ns, struct net *old_net)
 148{
 149        if (flags & CLONE_NEWNET)
 150                return ERR_PTR(-EINVAL);
 151        return old_net;
 152}
 153#endif /* CONFIG_NET_NS */
 154
 155
 156extern struct list_head net_namespace_list;
 157
 158extern struct net *get_net_ns_by_pid(pid_t pid);
 159extern struct net *get_net_ns_by_fd(int pid);
 160
 161#ifdef CONFIG_NET_NS
 162extern void __put_net(struct net *net);
 163
 164static inline struct net *get_net(struct net *net)
 165{
 166        atomic_inc(&net->count);
 167        return net;
 168}
 169
 170static inline struct net *maybe_get_net(struct net *net)
 171{
 172        /* Used when we know struct net exists but we
 173         * aren't guaranteed a previous reference count
 174         * exists.  If the reference count is zero this
 175         * function fails and returns NULL.
 176         */
 177        if (!atomic_inc_not_zero(&net->count))
 178                net = NULL;
 179        return net;
 180}
 181
 182static inline void put_net(struct net *net)
 183{
 184        if (atomic_dec_and_test(&net->count))
 185                __put_net(net);
 186}
 187
 188static inline
 189int net_eq(const struct net *net1, const struct net *net2)
 190{
 191        return net1 == net2;
 192}
 193
 194extern void net_drop_ns(void *);
 195
 196#else
 197
 198static inline struct net *get_net(struct net *net)
 199{
 200        return net;
 201}
 202
 203static inline void put_net(struct net *net)
 204{
 205}
 206
 207static inline struct net *maybe_get_net(struct net *net)
 208{
 209        return net;
 210}
 211
 212static inline
 213int net_eq(const struct net *net1, const struct net *net2)
 214{
 215        return 1;
 216}
 217
 218#define net_drop_ns NULL
 219#endif
 220
 221
 222#ifdef NETNS_REFCNT_DEBUG
 223static inline struct net *hold_net(struct net *net)
 224{
 225        if (net)
 226                atomic_inc(&net->use_count);
 227        return net;
 228}
 229
 230static inline void release_net(struct net *net)
 231{
 232        if (net)
 233                atomic_dec(&net->use_count);
 234}
 235#else
 236static inline struct net *hold_net(struct net *net)
 237{
 238        return net;
 239}
 240
 241static inline void release_net(struct net *net)
 242{
 243}
 244#endif
 245
 246#ifdef CONFIG_NET_NS
 247
 248static inline void write_pnet(struct net **pnet, struct net *net)
 249{
 250        *pnet = net;
 251}
 252
 253static inline struct net *read_pnet(struct net * const *pnet)
 254{
 255        return *pnet;
 256}
 257
 258#else
 259
 260#define write_pnet(pnet, net)   do { (void)(net);} while (0)
 261#define read_pnet(pnet)         (&init_net)
 262
 263#endif
 264
 265#define for_each_net(VAR)                               \
 266        list_for_each_entry(VAR, &net_namespace_list, list)
 267
 268#define for_each_net_rcu(VAR)                           \
 269        list_for_each_entry_rcu(VAR, &net_namespace_list, list)
 270
 271#ifdef CONFIG_NET_NS
 272#define __net_init
 273#define __net_exit
 274#define __net_initdata
 275#define __net_initconst
 276#else
 277#define __net_init      __init
 278#define __net_exit      __exit_refok
 279#define __net_initdata  __initdata
 280#define __net_initconst __initconst
 281#endif
 282
 283struct pernet_operations {
 284        struct list_head list;
 285        int (*init)(struct net *net);
 286        void (*exit)(struct net *net);
 287        void (*exit_batch)(struct list_head *net_exit_list);
 288        int *id;
 289        size_t size;
 290};
 291
 292/*
 293 * Use these carefully.  If you implement a network device and it
 294 * needs per network namespace operations use device pernet operations,
 295 * otherwise use pernet subsys operations.
 296 *
 297 * Network interfaces need to be removed from a dying netns _before_
 298 * subsys notifiers can be called, as most of the network code cleanup
 299 * (which is done from subsys notifiers) runs with the assumption that
 300 * dev_remove_pack has been called so no new packets will arrive during
 301 * and after the cleanup functions have been called.  dev_remove_pack
 302 * is not per namespace so instead the guarantee of no more packets
 303 * arriving in a network namespace is provided by ensuring that all
 304 * network devices and all sockets have left the network namespace
 305 * before the cleanup methods are called.
 306 *
 307 * For the longest time the ipv4 icmp code was registered as a pernet
 308 * device which caused kernel oops, and panics during network
 309 * namespace cleanup.   So please don't get this wrong.
 310 */
 311extern int register_pernet_subsys(struct pernet_operations *);
 312extern void unregister_pernet_subsys(struct pernet_operations *);
 313extern int register_pernet_device(struct pernet_operations *);
 314extern void unregister_pernet_device(struct pernet_operations *);
 315
 316struct ctl_table;
 317struct ctl_table_header;
 318
 319#ifdef CONFIG_SYSCTL
 320extern int net_sysctl_init(void);
 321extern struct ctl_table_header *register_net_sysctl(struct net *net,
 322        const char *path, struct ctl_table *table);
 323extern void unregister_net_sysctl_table(struct ctl_table_header *header);
 324#else
 325static inline int net_sysctl_init(void) { return 0; }
 326static inline struct ctl_table_header *register_net_sysctl(struct net *net,
 327        const char *path, struct ctl_table *table)
 328{
 329        return NULL;
 330}
 331static inline void unregister_net_sysctl_table(struct ctl_table_header *header)
 332{
 333}
 334#endif
 335
 336static inline int rt_genid(struct net *net)
 337{
 338        return atomic_read(&net->rt_genid);
 339}
 340
 341static inline void rt_genid_bump(struct net *net)
 342{
 343        atomic_inc(&net->rt_genid);
 344}
 345
 346static inline int fnhe_genid(struct net *net)
 347{
 348        return atomic_read(&net->fnhe_genid);
 349}
 350
 351static inline void fnhe_genid_bump(struct net *net)
 352{
 353        atomic_inc(&net->fnhe_genid);
 354}
 355
 356#endif /* __NET_NET_NAMESPACE_H */
 357