Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/net/genetlink.h
10817 views
1
#ifndef __NET_GENERIC_NETLINK_H
2
#define __NET_GENERIC_NETLINK_H
3
4
#include <linux/genetlink.h>
5
#include <net/netlink.h>
6
#include <net/net_namespace.h>
7
8
/**
9
* struct genl_multicast_group - generic netlink multicast group
10
* @name: name of the multicast group, names are per-family
11
* @id: multicast group ID, assigned by the core, to use with
12
* genlmsg_multicast().
13
* @list: list entry for linking
14
* @family: pointer to family, need not be set before registering
15
*/
16
struct genl_multicast_group {
17
struct genl_family *family; /* private */
18
struct list_head list; /* private */
19
char name[GENL_NAMSIZ];
20
u32 id;
21
};
22
23
struct genl_ops;
24
struct genl_info;
25
26
/**
27
* struct genl_family - generic netlink family
28
* @id: protocol family idenfitier
29
* @hdrsize: length of user specific header in bytes
30
* @name: name of family
31
* @version: protocol version
32
* @maxattr: maximum number of attributes supported
33
* @netnsok: set to true if the family can handle network
34
* namespaces and should be presented in all of them
35
* @pre_doit: called before an operation's doit callback, it may
36
* do additional, common, filtering and return an error
37
* @post_doit: called after an operation's doit callback, it may
38
* undo operations done by pre_doit, for example release locks
39
* @attrbuf: buffer to store parsed attributes
40
* @ops_list: list of all assigned operations
41
* @family_list: family list
42
* @mcast_groups: multicast groups list
43
*/
44
struct genl_family {
45
unsigned int id;
46
unsigned int hdrsize;
47
char name[GENL_NAMSIZ];
48
unsigned int version;
49
unsigned int maxattr;
50
bool netnsok;
51
int (*pre_doit)(struct genl_ops *ops,
52
struct sk_buff *skb,
53
struct genl_info *info);
54
void (*post_doit)(struct genl_ops *ops,
55
struct sk_buff *skb,
56
struct genl_info *info);
57
struct nlattr ** attrbuf; /* private */
58
struct list_head ops_list; /* private */
59
struct list_head family_list; /* private */
60
struct list_head mcast_groups; /* private */
61
};
62
63
/**
64
* struct genl_info - receiving information
65
* @snd_seq: sending sequence number
66
* @snd_pid: netlink pid of sender
67
* @nlhdr: netlink message header
68
* @genlhdr: generic netlink message header
69
* @userhdr: user specific header
70
* @attrs: netlink attributes
71
* @_net: network namespace
72
* @user_ptr: user pointers
73
*/
74
struct genl_info {
75
u32 snd_seq;
76
u32 snd_pid;
77
struct nlmsghdr * nlhdr;
78
struct genlmsghdr * genlhdr;
79
void * userhdr;
80
struct nlattr ** attrs;
81
#ifdef CONFIG_NET_NS
82
struct net * _net;
83
#endif
84
void * user_ptr[2];
85
};
86
87
static inline struct net *genl_info_net(struct genl_info *info)
88
{
89
return read_pnet(&info->_net);
90
}
91
92
static inline void genl_info_net_set(struct genl_info *info, struct net *net)
93
{
94
write_pnet(&info->_net, net);
95
}
96
97
/**
98
* struct genl_ops - generic netlink operations
99
* @cmd: command identifier
100
* @internal_flags: flags used by the family
101
* @flags: flags
102
* @policy: attribute validation policy
103
* @doit: standard command callback
104
* @dumpit: callback for dumpers
105
* @done: completion callback for dumps
106
* @ops_list: operations list
107
*/
108
struct genl_ops {
109
u8 cmd;
110
u8 internal_flags;
111
unsigned int flags;
112
const struct nla_policy *policy;
113
int (*doit)(struct sk_buff *skb,
114
struct genl_info *info);
115
int (*dumpit)(struct sk_buff *skb,
116
struct netlink_callback *cb);
117
int (*done)(struct netlink_callback *cb);
118
struct list_head ops_list;
119
};
120
121
extern int genl_register_family(struct genl_family *family);
122
extern int genl_register_family_with_ops(struct genl_family *family,
123
struct genl_ops *ops, size_t n_ops);
124
extern int genl_unregister_family(struct genl_family *family);
125
extern int genl_register_ops(struct genl_family *, struct genl_ops *ops);
126
extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops);
127
extern int genl_register_mc_group(struct genl_family *family,
128
struct genl_multicast_group *grp);
129
extern void genl_unregister_mc_group(struct genl_family *family,
130
struct genl_multicast_group *grp);
131
132
/**
133
* genlmsg_put - Add generic netlink header to netlink message
134
* @skb: socket buffer holding the message
135
* @pid: netlink pid the message is addressed to
136
* @seq: sequence number (usually the one of the sender)
137
* @family: generic netlink family
138
* @flags netlink message flags
139
* @cmd: generic netlink command
140
*
141
* Returns pointer to user specific header
142
*/
143
static inline void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
144
struct genl_family *family, int flags, u8 cmd)
145
{
146
struct nlmsghdr *nlh;
147
struct genlmsghdr *hdr;
148
149
nlh = nlmsg_put(skb, pid, seq, family->id, GENL_HDRLEN +
150
family->hdrsize, flags);
151
if (nlh == NULL)
152
return NULL;
153
154
hdr = nlmsg_data(nlh);
155
hdr->cmd = cmd;
156
hdr->version = family->version;
157
hdr->reserved = 0;
158
159
return (char *) hdr + GENL_HDRLEN;
160
}
161
162
/**
163
* genlmsg_put_reply - Add generic netlink header to a reply message
164
* @skb: socket buffer holding the message
165
* @info: receiver info
166
* @family: generic netlink family
167
* @flags: netlink message flags
168
* @cmd: generic netlink command
169
*
170
* Returns pointer to user specific header
171
*/
172
static inline void *genlmsg_put_reply(struct sk_buff *skb,
173
struct genl_info *info,
174
struct genl_family *family,
175
int flags, u8 cmd)
176
{
177
return genlmsg_put(skb, info->snd_pid, info->snd_seq, family,
178
flags, cmd);
179
}
180
181
/**
182
* genlmsg_end - Finalize a generic netlink message
183
* @skb: socket buffer the message is stored in
184
* @hdr: user specific header
185
*/
186
static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
187
{
188
return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
189
}
190
191
/**
192
* genlmsg_cancel - Cancel construction of a generic netlink message
193
* @skb: socket buffer the message is stored in
194
* @hdr: generic netlink message header
195
*/
196
static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
197
{
198
if (hdr)
199
nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
200
}
201
202
/**
203
* genlmsg_multicast_netns - multicast a netlink message to a specific netns
204
* @net: the net namespace
205
* @skb: netlink message as socket buffer
206
* @pid: own netlink pid to avoid sending to yourself
207
* @group: multicast group id
208
* @flags: allocation flags
209
*/
210
static inline int genlmsg_multicast_netns(struct net *net, struct sk_buff *skb,
211
u32 pid, unsigned int group, gfp_t flags)
212
{
213
return nlmsg_multicast(net->genl_sock, skb, pid, group, flags);
214
}
215
216
/**
217
* genlmsg_multicast - multicast a netlink message to the default netns
218
* @skb: netlink message as socket buffer
219
* @pid: own netlink pid to avoid sending to yourself
220
* @group: multicast group id
221
* @flags: allocation flags
222
*/
223
static inline int genlmsg_multicast(struct sk_buff *skb, u32 pid,
224
unsigned int group, gfp_t flags)
225
{
226
return genlmsg_multicast_netns(&init_net, skb, pid, group, flags);
227
}
228
229
/**
230
* genlmsg_multicast_allns - multicast a netlink message to all net namespaces
231
* @skb: netlink message as socket buffer
232
* @pid: own netlink pid to avoid sending to yourself
233
* @group: multicast group id
234
* @flags: allocation flags
235
*
236
* This function must hold the RTNL or rcu_read_lock().
237
*/
238
int genlmsg_multicast_allns(struct sk_buff *skb, u32 pid,
239
unsigned int group, gfp_t flags);
240
241
/**
242
* genlmsg_unicast - unicast a netlink message
243
* @skb: netlink message as socket buffer
244
* @pid: netlink pid of the destination socket
245
*/
246
static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 pid)
247
{
248
return nlmsg_unicast(net->genl_sock, skb, pid);
249
}
250
251
/**
252
* genlmsg_reply - reply to a request
253
* @skb: netlink message to be sent back
254
* @info: receiver information
255
*/
256
static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
257
{
258
return genlmsg_unicast(genl_info_net(info), skb, info->snd_pid);
259
}
260
261
/**
262
* gennlmsg_data - head of message payload
263
* @gnlh: genetlink message header
264
*/
265
static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
266
{
267
return ((unsigned char *) gnlh + GENL_HDRLEN);
268
}
269
270
/**
271
* genlmsg_len - length of message payload
272
* @gnlh: genetlink message header
273
*/
274
static inline int genlmsg_len(const struct genlmsghdr *gnlh)
275
{
276
struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
277
NLMSG_HDRLEN);
278
return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
279
}
280
281
/**
282
* genlmsg_msg_size - length of genetlink message not including padding
283
* @payload: length of message payload
284
*/
285
static inline int genlmsg_msg_size(int payload)
286
{
287
return GENL_HDRLEN + payload;
288
}
289
290
/**
291
* genlmsg_total_size - length of genetlink message including padding
292
* @payload: length of message payload
293
*/
294
static inline int genlmsg_total_size(int payload)
295
{
296
return NLMSG_ALIGN(genlmsg_msg_size(payload));
297
}
298
299
/**
300
* genlmsg_new - Allocate a new generic netlink message
301
* @payload: size of the message payload
302
* @flags: the type of memory to allocate.
303
*/
304
static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
305
{
306
return nlmsg_new(genlmsg_total_size(payload), flags);
307
}
308
309
310
#endif /* __NET_GENERIC_NETLINK_H */
311
312