]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
dec827d1 PE |
2 | /* |
3 | * generic net pointers | |
4 | */ | |
5 | ||
6 | #ifndef __NET_GENERIC_H__ | |
7 | #define __NET_GENERIC_H__ | |
8 | ||
187f1882 | 9 | #include <linux/bug.h> |
dec827d1 PE |
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: | |
65c0cfaf EB |
17 | * 1. set pernet_operations->id. After register_pernet_device you |
18 | * will have the id of your private pointer. | |
05fceb4a JP |
19 | * 2. set pernet_operations->size to have the code allocate and free |
20 | * a private structure pointed to from struct net. | |
dec827d1 PE |
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 { | |
6af2d5ff AD |
29 | union { |
30 | struct { | |
31 | unsigned int len; | |
32 | struct rcu_head rcu; | |
33 | } s; | |
34 | ||
35 | void *ptr[0]; | |
36 | }; | |
dec827d1 PE |
37 | }; |
38 | ||
c7d03a00 | 39 | static inline void *net_generic(const struct net *net, unsigned int id) |
dec827d1 PE |
40 | { |
41 | struct net_generic *ng; | |
42 | void *ptr; | |
43 | ||
44 | rcu_read_lock(); | |
45 | ng = rcu_dereference(net->gen); | |
6af2d5ff | 46 | ptr = ng->ptr[id]; |
dec827d1 PE |
47 | rcu_read_unlock(); |
48 | ||
49 | return ptr; | |
50 | } | |
dec827d1 | 51 | #endif |