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