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 net_generic(const struct net * net,unsigned int id)40static 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