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 29struct 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 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