]>
Commit | Line | Data |
---|---|---|
dec827d1 PE |
1 | /* |
2 | * generic net pointers | |
3 | */ | |
4 | ||
5 | #ifndef __NET_GENERIC_H__ | |
6 | #define __NET_GENERIC_H__ | |
7 | ||
8 | #include <linux/rcupdate.h> | |
9 | ||
10 | /* | |
11 | * Generic net pointers are to be used by modules to put some private | |
12 | * stuff on the struct net without explicit struct net modification | |
13 | * | |
14 | * The rules are simple: | |
65c0cfaf EB |
15 | * 1. set pernet_operations->id. After register_pernet_device you |
16 | * will have the id of your private pointer. | |
17 | * 2. Either set pernet_operations->size (to have the code allocate and | |
18 | * free a private structure pointed to from struct net ) or | |
19 | * call net_assign_generic() to put the private data on the struct | |
dec827d1 PE |
20 | * net (most preferably this should be done in the ->init callback |
21 | * of the ops registered); | |
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 | unsigned int len; | |
31 | struct rcu_head rcu; | |
32 | ||
33 | void *ptr[0]; | |
34 | }; | |
35 | ||
36 | static inline void *net_generic(struct net *net, int id) | |
37 | { | |
38 | struct net_generic *ng; | |
39 | void *ptr; | |
40 | ||
41 | rcu_read_lock(); | |
42 | ng = rcu_dereference(net->gen); | |
43 | BUG_ON(id == 0 || id > ng->len); | |
44 | ptr = ng->ptr[id - 1]; | |
45 | rcu_read_unlock(); | |
46 | ||
47 | return ptr; | |
48 | } | |
49 | ||
50 | extern int net_assign_generic(struct net *net, int id, void *data); | |
51 | #endif |