linux/include/net/netns/generic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * generic net pointers
   4 */
   5
   6#ifndef __NET_GENERIC_H__
   7#define __NET_GENERIC_H__
   8
   9#include <linux/bug.h>
  10#include <linux/rcupdate.h>
  11
  12/*
  13 * Generic net pointers are to be used by modules to put some private
  14 * stuff on the struct net without explicit struct net modification
  15 *
  16 * The rules are simple:
  17 * 1. set pernet_operations->id.  After register_pernet_device you
  18 *    will have the id of your private pointer.
  19 * 2. set pernet_operations->size to have the code allocate and free
  20 *    a private structure pointed to from struct net.
  21 * 3. do not change this pointer while the net is alive;
  22 * 4. do not try to have any private reference on the net_generic object.
  23 *
  24 * After accomplishing all of the above, the private pointer can be
  25 * accessed with the net_generic() call.
  26 */
  27
  28struct net_generic {
  29        union {
  30                struct {
  31                        unsigned int len;
  32                        struct rcu_head rcu;
  33                } s;
  34
  35                void *ptr[0];
  36        };
  37};
  38
  39static inline void *net_generic(const struct net *net, unsigned int id)
  40{
  41        struct net_generic *ng;
  42        void *ptr;
  43
  44        rcu_read_lock();
  45        ng = rcu_dereference(net->gen);
  46        ptr = ng->ptr[id];
  47        rcu_read_unlock();
  48
  49        return ptr;
  50}
  51#endif
  52