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 <asm/atomic.h>
   8#include <linux/workqueue.h>
   9#include <linux/list.h>
  10
  11struct proc_dir_entry;
  12struct net_device;
  13struct net {
  14        atomic_t                count;          /* To decided when the network
  15                                                 *  namespace should be freed.
  16                                                 */
  17        atomic_t                use_count;      /* To track references we
  18                                                 * destroy on demand
  19                                                 */
  20        struct list_head        list;           /* list of network namespaces */
  21        struct work_struct      work;           /* work struct for freeing */
  22
  23        struct proc_dir_entry   *proc_net;
  24        struct proc_dir_entry   *proc_net_stat;
  25        struct proc_dir_entry   *proc_net_root;
  26
  27        struct net_device       *loopback_dev;          /* The loopback */
  28
  29        struct list_head        dev_base_head;
  30        struct hlist_head       *dev_name_head;
  31        struct hlist_head       *dev_index_head;
  32};
  33
  34#ifdef CONFIG_NET
  35/* Init's network namespace */
  36extern struct net init_net;
  37#define INIT_NET_NS(net_ns) .net_ns = &init_net,
  38#else
  39#define INIT_NET_NS(net_ns)
  40#endif
  41
  42extern struct list_head net_namespace_list;
  43
  44#ifdef CONFIG_NET
  45extern struct net *copy_net_ns(unsigned long flags, struct net *net_ns);
  46#else
  47static inline struct net *copy_net_ns(unsigned long flags, struct net *net_ns)
  48{
  49        /* There is nothing to copy so this is a noop */
  50        return net_ns;
  51}
  52#endif
  53
  54#ifdef CONFIG_NET_NS
  55extern void __put_net(struct net *net);
  56
  57static inline struct net *get_net(struct net *net)
  58{
  59        atomic_inc(&net->count);
  60        return net;
  61}
  62
  63static inline struct net *maybe_get_net(struct net *net)
  64{
  65        /* Used when we know struct net exists but we
  66         * aren't guaranteed a previous reference count
  67         * exists.  If the reference count is zero this
  68         * function fails and returns NULL.
  69         */
  70        if (!atomic_inc_not_zero(&net->count))
  71                net = NULL;
  72        return net;
  73}
  74
  75static inline void put_net(struct net *net)
  76{
  77        if (atomic_dec_and_test(&net->count))
  78                __put_net(net);
  79}
  80
  81static inline struct net *hold_net(struct net *net)
  82{
  83        atomic_inc(&net->use_count);
  84        return net;
  85}
  86
  87static inline void release_net(struct net *net)
  88{
  89        atomic_dec(&net->use_count);
  90}
  91#else
  92static inline struct net *get_net(struct net *net)
  93{
  94        return net;
  95}
  96
  97static inline void put_net(struct net *net)
  98{
  99}
 100
 101static inline struct net *hold_net(struct net *net)
 102{
 103        return net;
 104}
 105
 106static inline void release_net(struct net *net)
 107{
 108}
 109
 110static inline struct net *maybe_get_net(struct net *net)
 111{
 112        return net;
 113}
 114#endif
 115
 116#define for_each_net(VAR)                               \
 117        list_for_each_entry(VAR, &net_namespace_list, list)
 118
 119#ifdef CONFIG_NET_NS
 120#define __net_init
 121#define __net_exit
 122#define __net_initdata
 123#else
 124#define __net_init      __init
 125#define __net_exit      __exit_refok
 126#define __net_initdata  __initdata
 127#endif
 128
 129struct pernet_operations {
 130        struct list_head list;
 131        int (*init)(struct net *net);
 132        void (*exit)(struct net *net);
 133};
 134
 135extern int register_pernet_subsys(struct pernet_operations *);
 136extern void unregister_pernet_subsys(struct pernet_operations *);
 137extern int register_pernet_device(struct pernet_operations *);
 138extern void unregister_pernet_device(struct pernet_operations *);
 139
 140#endif /* __NET_NET_NAMESPACE_H */
 141