Branch data Line data Source code
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 : : #define GENLMSG_DEFAULT_SIZE (NLMSG_DEFAULT_SIZE - GENL_HDRLEN)
9 : :
10 : : /**
11 : : * struct genl_multicast_group - generic netlink multicast group
12 : : * @name: name of the multicast group, names are per-family
13 : : */
14 : : struct genl_multicast_group {
15 : : char name[GENL_NAMSIZ];
16 : : };
17 : :
18 : : struct genl_ops;
19 : : struct genl_info;
20 : :
21 : : /**
22 : : * struct genl_family - generic netlink family
23 : : * @id: protocol family idenfitier
24 : : * @hdrsize: length of user specific header in bytes
25 : : * @name: name of family
26 : : * @version: protocol version
27 : : * @maxattr: maximum number of attributes supported
28 : : * @netnsok: set to true if the family can handle network
29 : : * namespaces and should be presented in all of them
30 : : * @pre_doit: called before an operation's doit callback, it may
31 : : * do additional, common, filtering and return an error
32 : : * @post_doit: called after an operation's doit callback, it may
33 : : * undo operations done by pre_doit, for example release locks
34 : : * @attrbuf: buffer to store parsed attributes
35 : : * @family_list: family list
36 : : * @mcgrps: multicast groups used by this family (private)
37 : : * @n_mcgrps: number of multicast groups (private)
38 : : * @mcgrp_offset: starting number of multicast group IDs in this family
39 : : * @ops: the operations supported by this family (private)
40 : : * @n_ops: number of operations supported by this family (private)
41 : : */
42 : : struct genl_family {
43 : : unsigned int id;
44 : : unsigned int hdrsize;
45 : : char name[GENL_NAMSIZ];
46 : : unsigned int version;
47 : : unsigned int maxattr;
48 : : bool netnsok;
49 : : bool parallel_ops;
50 : : int (*pre_doit)(const struct genl_ops *ops,
51 : : struct sk_buff *skb,
52 : : struct genl_info *info);
53 : : void (*post_doit)(const struct genl_ops *ops,
54 : : struct sk_buff *skb,
55 : : struct genl_info *info);
56 : : struct nlattr ** attrbuf; /* private */
57 : : const struct genl_ops * ops; /* private */
58 : : const struct genl_multicast_group *mcgrps; /* private */
59 : : unsigned int n_ops; /* private */
60 : : unsigned int n_mcgrps; /* private */
61 : : unsigned int mcgrp_offset; /* private */
62 : : struct list_head family_list; /* private */
63 : : struct module *module;
64 : : };
65 : :
66 : : /**
67 : : * struct genl_info - receiving information
68 : : * @snd_seq: sending sequence number
69 : : * @snd_portid: netlink portid of sender
70 : : * @nlhdr: netlink message header
71 : : * @genlhdr: generic netlink message header
72 : : * @userhdr: user specific header
73 : : * @attrs: netlink attributes
74 : : * @_net: network namespace
75 : : * @user_ptr: user pointers
76 : : * @dst_sk: destination socket
77 : : */
78 : : struct genl_info {
79 : : u32 snd_seq;
80 : : u32 snd_portid;
81 : : struct nlmsghdr * nlhdr;
82 : : struct genlmsghdr * genlhdr;
83 : : void * userhdr;
84 : : struct nlattr ** attrs;
85 : : #ifdef CONFIG_NET_NS
86 : : struct net * _net;
87 : : #endif
88 : : void * user_ptr[2];
89 : : struct sock * dst_sk;
90 : : };
91 : :
92 : : static inline struct net *genl_info_net(struct genl_info *info)
93 : : {
94 : : return read_pnet(&info->_net);
95 : : }
96 : :
97 : : static inline void genl_info_net_set(struct genl_info *info, struct net *net)
98 : : {
99 : : write_pnet(&info->_net, net);
100 : : }
101 : :
102 : : /**
103 : : * struct genl_ops - generic netlink operations
104 : : * @cmd: command identifier
105 : : * @internal_flags: flags used by the family
106 : : * @flags: flags
107 : : * @policy: attribute validation policy
108 : : * @doit: standard command callback
109 : : * @dumpit: callback for dumpers
110 : : * @done: completion callback for dumps
111 : : * @ops_list: operations list
112 : : */
113 : : struct genl_ops {
114 : : const struct nla_policy *policy;
115 : : int (*doit)(struct sk_buff *skb,
116 : : struct genl_info *info);
117 : : int (*dumpit)(struct sk_buff *skb,
118 : : struct netlink_callback *cb);
119 : : int (*done)(struct netlink_callback *cb);
120 : : u8 cmd;
121 : : u8 internal_flags;
122 : : u8 flags;
123 : : };
124 : :
125 : : int __genl_register_family(struct genl_family *family);
126 : :
127 : : static inline int genl_register_family(struct genl_family *family)
128 : : {
129 : : family->module = THIS_MODULE;
130 : : return __genl_register_family(family);
131 : : }
132 : :
133 : : /**
134 : : * genl_register_family_with_ops - register a generic netlink family with ops
135 : : * @family: generic netlink family
136 : : * @ops: operations to be registered
137 : : * @n_ops: number of elements to register
138 : : *
139 : : * Registers the specified family and operations from the specified table.
140 : : * Only one family may be registered with the same family name or identifier.
141 : : *
142 : : * The family id may equal GENL_ID_GENERATE causing an unique id to
143 : : * be automatically generated and assigned.
144 : : *
145 : : * Either a doit or dumpit callback must be specified for every registered
146 : : * operation or the function will fail. Only one operation structure per
147 : : * command identifier may be registered.
148 : : *
149 : : * See include/net/genetlink.h for more documenation on the operations
150 : : * structure.
151 : : *
152 : : * Return 0 on success or a negative error code.
153 : : */
154 : : static inline int
155 : : _genl_register_family_with_ops_grps(struct genl_family *family,
156 : : const struct genl_ops *ops, size_t n_ops,
157 : : const struct genl_multicast_group *mcgrps,
158 : : size_t n_mcgrps)
159 : : {
160 : 0 : family->module = THIS_MODULE;
161 : 0 : family->ops = ops;
162 : 0 : family->n_ops = n_ops;
163 : 0 : family->mcgrps = mcgrps;
164 : 0 : family->n_mcgrps = n_mcgrps;
165 : 0 : return __genl_register_family(family);
166 : : }
167 : :
168 : : #define genl_register_family_with_ops(family, ops) \
169 : : _genl_register_family_with_ops_grps((family), \
170 : : (ops), ARRAY_SIZE(ops), \
171 : : NULL, 0)
172 : : #define genl_register_family_with_ops_groups(family, ops, grps) \
173 : : _genl_register_family_with_ops_grps((family), \
174 : : (ops), ARRAY_SIZE(ops), \
175 : : (grps), ARRAY_SIZE(grps))
176 : :
177 : : int genl_unregister_family(struct genl_family *family);
178 : : void genl_notify(struct genl_family *family,
179 : : struct sk_buff *skb, struct net *net, u32 portid,
180 : : u32 group, struct nlmsghdr *nlh, gfp_t flags);
181 : :
182 : : struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info,
183 : : gfp_t flags);
184 : : void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
185 : : struct genl_family *family, int flags, u8 cmd);
186 : :
187 : : /**
188 : : * genlmsg_nlhdr - Obtain netlink header from user specified header
189 : : * @user_hdr: user header as returned from genlmsg_put()
190 : : * @family: generic netlink family
191 : : *
192 : : * Returns pointer to netlink header.
193 : : */
194 : : static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr,
195 : : struct genl_family *family)
196 : : {
197 : : return (struct nlmsghdr *)((char *)user_hdr -
198 : : family->hdrsize -
199 : : GENL_HDRLEN -
200 : : NLMSG_HDRLEN);
201 : : }
202 : :
203 : : /**
204 : : * genl_dump_check_consistent - check if sequence is consistent and advertise if not
205 : : * @cb: netlink callback structure that stores the sequence number
206 : : * @user_hdr: user header as returned from genlmsg_put()
207 : : * @family: generic netlink family
208 : : *
209 : : * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
210 : : * simpler to use with generic netlink.
211 : : */
212 : : static inline void genl_dump_check_consistent(struct netlink_callback *cb,
213 : : void *user_hdr,
214 : : struct genl_family *family)
215 : : {
216 : : nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family));
217 : : }
218 : :
219 : : /**
220 : : * genlmsg_put_reply - Add generic netlink header to a reply message
221 : : * @skb: socket buffer holding the message
222 : : * @info: receiver info
223 : : * @family: generic netlink family
224 : : * @flags: netlink message flags
225 : : * @cmd: generic netlink command
226 : : *
227 : : * Returns pointer to user specific header
228 : : */
229 : : static inline void *genlmsg_put_reply(struct sk_buff *skb,
230 : : struct genl_info *info,
231 : : struct genl_family *family,
232 : : int flags, u8 cmd)
233 : : {
234 : 0 : return genlmsg_put(skb, info->snd_portid, info->snd_seq, family,
235 : : flags, cmd);
236 : : }
237 : :
238 : : /**
239 : : * genlmsg_end - Finalize a generic netlink message
240 : : * @skb: socket buffer the message is stored in
241 : : * @hdr: user specific header
242 : : */
243 : : static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
244 : : {
245 : 0 : return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
246 : : }
247 : :
248 : : /**
249 : : * genlmsg_cancel - Cancel construction of a generic netlink message
250 : : * @skb: socket buffer the message is stored in
251 : : * @hdr: generic netlink message header
252 : : */
253 : : static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
254 : : {
255 [ # # ][ # # ]: 0 : if (hdr)
256 : 0 : nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
257 : : }
258 : :
259 : : /**
260 : : * genlmsg_multicast_netns - multicast a netlink message to a specific netns
261 : : * @family: the generic netlink family
262 : : * @net: the net namespace
263 : : * @skb: netlink message as socket buffer
264 : : * @portid: own netlink portid to avoid sending to yourself
265 : : * @group: offset of multicast group in groups array
266 : : * @flags: allocation flags
267 : : */
268 : : static inline int genlmsg_multicast_netns(struct genl_family *family,
269 : : struct net *net, struct sk_buff *skb,
270 : : u32 portid, unsigned int group, gfp_t flags)
271 : : {
272 [ # # ][ # # ]: 0 : if (WARN_ON_ONCE(group >= family->n_mcgrps))
[ # # ][ # # ]
273 : : return -EINVAL;
274 : 0 : group = family->mcgrp_offset + group;
275 : 0 : return nlmsg_multicast(net->genl_sock, skb, portid, group, flags);
276 : : }
277 : :
278 : : /**
279 : : * genlmsg_multicast - multicast a netlink message to the default netns
280 : : * @family: the generic netlink family
281 : : * @skb: netlink message as socket buffer
282 : : * @portid: own netlink portid to avoid sending to yourself
283 : : * @group: offset of multicast group in groups array
284 : : * @flags: allocation flags
285 : : */
286 : : static inline int genlmsg_multicast(struct genl_family *family,
287 : : struct sk_buff *skb, u32 portid,
288 : : unsigned int group, gfp_t flags)
289 : : {
290 : : return genlmsg_multicast_netns(family, &init_net, skb,
291 : : portid, group, flags);
292 : : }
293 : :
294 : : /**
295 : : * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
296 : : * @family: the generic netlink family
297 : : * @skb: netlink message as socket buffer
298 : : * @portid: own netlink portid to avoid sending to yourself
299 : : * @group: offset of multicast group in groups array
300 : : * @flags: allocation flags
301 : : *
302 : : * This function must hold the RTNL or rcu_read_lock().
303 : : */
304 : : int genlmsg_multicast_allns(struct genl_family *family,
305 : : struct sk_buff *skb, u32 portid,
306 : : unsigned int group, gfp_t flags);
307 : :
308 : : /**
309 : : * genlmsg_unicast - unicast a netlink message
310 : : * @skb: netlink message as socket buffer
311 : : * @portid: netlink portid of the destination socket
312 : : */
313 : : static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 portid)
314 : : {
315 : : return nlmsg_unicast(net->genl_sock, skb, portid);
316 : : }
317 : :
318 : : /**
319 : : * genlmsg_reply - reply to a request
320 : : * @skb: netlink message to be sent back
321 : : * @info: receiver information
322 : : */
323 : : static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
324 : : {
325 : 0 : return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid);
326 : : }
327 : :
328 : : /**
329 : : * gennlmsg_data - head of message payload
330 : : * @gnlh: genetlink message header
331 : : */
332 : : static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
333 : : {
334 : : return ((unsigned char *) gnlh + GENL_HDRLEN);
335 : : }
336 : :
337 : : /**
338 : : * genlmsg_len - length of message payload
339 : : * @gnlh: genetlink message header
340 : : */
341 : : static inline int genlmsg_len(const struct genlmsghdr *gnlh)
342 : : {
343 : : struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
344 : : NLMSG_HDRLEN);
345 : : return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
346 : : }
347 : :
348 : : /**
349 : : * genlmsg_msg_size - length of genetlink message not including padding
350 : : * @payload: length of message payload
351 : : */
352 : : static inline int genlmsg_msg_size(int payload)
353 : : {
354 : : return GENL_HDRLEN + payload;
355 : : }
356 : :
357 : : /**
358 : : * genlmsg_total_size - length of genetlink message including padding
359 : : * @payload: length of message payload
360 : : */
361 : : static inline int genlmsg_total_size(int payload)
362 : : {
363 : 0 : return NLMSG_ALIGN(genlmsg_msg_size(payload));
364 : : }
365 : :
366 : : /**
367 : : * genlmsg_new - Allocate a new generic netlink message
368 : : * @payload: size of the message payload
369 : : * @flags: the type of memory to allocate.
370 : : */
371 : : static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
372 : : {
373 : : return nlmsg_new(genlmsg_total_size(payload), flags);
374 : : }
375 : :
376 : : /**
377 : : * genl_set_err - report error to genetlink broadcast listeners
378 : : * @family: the generic netlink family
379 : : * @net: the network namespace to report the error to
380 : : * @portid: the PORTID of a process that we want to skip (if any)
381 : : * @group: the broadcast group that will notice the error
382 : : * (this is the offset of the multicast group in the groups array)
383 : : * @code: error code, must be negative (as usual in kernelspace)
384 : : *
385 : : * This function returns the number of broadcast listeners that have set the
386 : : * NETLINK_RECV_NO_ENOBUFS socket option.
387 : : */
388 : : static inline int genl_set_err(struct genl_family *family, struct net *net,
389 : : u32 portid, u32 group, int code)
390 : : {
391 : : if (WARN_ON_ONCE(group >= family->n_mcgrps))
392 : : return -EINVAL;
393 : : group = family->mcgrp_offset + group;
394 : : return netlink_set_err(net->genl_sock, portid, group, code);
395 : : }
396 : :
397 : : #endif /* __NET_GENERIC_NETLINK_H */
|