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