]>
git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - include/net/genetlink.h
1 #ifndef __NET_GENERIC_NETLINK_H
2 #define __NET_GENERIC_NETLINK_H
4 #include <linux/genetlink.h>
5 #include <net/netlink.h>
6 #include <net/net_namespace.h>
8 #define GENLMSG_DEFAULT_SIZE (NLMSG_DEFAULT_SIZE - GENL_HDRLEN)
11 * struct genl_multicast_group - generic netlink multicast group
12 * @name: name of the multicast group, names are per-family
13 * @id: multicast group ID, assigned by the core, to use with
14 * genlmsg_multicast().
15 * @list: list entry for linking
17 struct genl_multicast_group
{
18 struct list_head list
; /* private */
19 char name
[GENL_NAMSIZ
];
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 * @family_list: family list
41 * @mcast_groups: multicast groups list
42 * @ops: the operations supported by this family (private)
43 * @n_ops: number of operations supported by this family (private)
48 char name
[GENL_NAMSIZ
];
53 int (*pre_doit
)(const struct genl_ops
*ops
,
55 struct genl_info
*info
);
56 void (*post_doit
)(const struct genl_ops
*ops
,
58 struct genl_info
*info
);
59 struct nlattr
** attrbuf
; /* private */
60 const struct genl_ops
* ops
; /* private */
61 unsigned int n_ops
; /* private */
62 struct list_head family_list
; /* private */
63 struct list_head mcast_groups
; /* private */
64 struct module
*module
;
68 * struct genl_info - receiving information
69 * @snd_seq: sending sequence number
70 * @snd_portid: netlink portid of sender
71 * @nlhdr: netlink message header
72 * @genlhdr: generic netlink message header
73 * @userhdr: user specific header
74 * @attrs: netlink attributes
75 * @_net: network namespace
76 * @user_ptr: user pointers
81 struct nlmsghdr
* nlhdr
;
82 struct genlmsghdr
* genlhdr
;
84 struct nlattr
** attrs
;
91 static inline struct net
*genl_info_net(struct genl_info
*info
)
93 return read_pnet(&info
->_net
);
96 static inline void genl_info_net_set(struct genl_info
*info
, struct net
*net
)
98 write_pnet(&info
->_net
, net
);
102 * struct genl_ops - generic netlink operations
103 * @cmd: command identifier
104 * @internal_flags: flags used by the family
106 * @policy: attribute validation policy
107 * @doit: standard command callback
108 * @dumpit: callback for dumpers
109 * @done: completion callback for dumps
110 * @ops_list: operations list
113 const struct nla_policy
*policy
;
114 int (*doit
)(struct sk_buff
*skb
,
115 struct genl_info
*info
);
116 int (*dumpit
)(struct sk_buff
*skb
,
117 struct netlink_callback
*cb
);
118 int (*done
)(struct netlink_callback
*cb
);
124 int __genl_register_family(struct genl_family
*family
);
126 static inline int genl_register_family(struct genl_family
*family
)
128 family
->module
= THIS_MODULE
;
129 return __genl_register_family(family
);
133 * genl_register_family_with_ops - register a generic netlink family with ops
134 * @family: generic netlink family
135 * @ops: operations to be registered
136 * @n_ops: number of elements to register
138 * Registers the specified family and operations from the specified table.
139 * Only one family may be registered with the same family name or identifier.
141 * The family id may equal GENL_ID_GENERATE causing an unique id to
142 * be automatically generated and assigned.
144 * Either a doit or dumpit callback must be specified for every registered
145 * operation or the function will fail. Only one operation structure per
146 * command identifier may be registered.
148 * See include/net/genetlink.h for more documenation on the operations
151 * Return 0 on success or a negative error code.
153 static inline int _genl_register_family_with_ops(struct genl_family
*family
,
154 const struct genl_ops
*ops
,
157 family
->module
= THIS_MODULE
;
159 family
->n_ops
= n_ops
;
160 return __genl_register_family(family
);
163 #define genl_register_family_with_ops(family, ops) \
164 _genl_register_family_with_ops((family), (ops), ARRAY_SIZE(ops))
166 int genl_unregister_family(struct genl_family
*family
);
167 int genl_register_mc_group(struct genl_family
*family
,
168 struct genl_multicast_group
*grp
);
169 void genl_notify(struct sk_buff
*skb
, struct net
*net
, u32 portid
,
170 u32 group
, struct nlmsghdr
*nlh
, gfp_t flags
);
172 void *genlmsg_put(struct sk_buff
*skb
, u32 portid
, u32 seq
,
173 struct genl_family
*family
, int flags
, u8 cmd
);
176 * genlmsg_nlhdr - Obtain netlink header from user specified header
177 * @user_hdr: user header as returned from genlmsg_put()
178 * @family: generic netlink family
180 * Returns pointer to netlink header.
182 static inline struct nlmsghdr
*genlmsg_nlhdr(void *user_hdr
,
183 struct genl_family
*family
)
185 return (struct nlmsghdr
*)((char *)user_hdr
-
192 * genl_dump_check_consistent - check if sequence is consistent and advertise if not
193 * @cb: netlink callback structure that stores the sequence number
194 * @user_hdr: user header as returned from genlmsg_put()
195 * @family: generic netlink family
197 * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
198 * simpler to use with generic netlink.
200 static inline void genl_dump_check_consistent(struct netlink_callback
*cb
,
202 struct genl_family
*family
)
204 nl_dump_check_consistent(cb
, genlmsg_nlhdr(user_hdr
, family
));
208 * genlmsg_put_reply - Add generic netlink header to a reply message
209 * @skb: socket buffer holding the message
210 * @info: receiver info
211 * @family: generic netlink family
212 * @flags: netlink message flags
213 * @cmd: generic netlink command
215 * Returns pointer to user specific header
217 static inline void *genlmsg_put_reply(struct sk_buff
*skb
,
218 struct genl_info
*info
,
219 struct genl_family
*family
,
222 return genlmsg_put(skb
, info
->snd_portid
, info
->snd_seq
, family
,
227 * genlmsg_end - Finalize a generic netlink message
228 * @skb: socket buffer the message is stored in
229 * @hdr: user specific header
231 static inline int genlmsg_end(struct sk_buff
*skb
, void *hdr
)
233 return nlmsg_end(skb
, hdr
- GENL_HDRLEN
- NLMSG_HDRLEN
);
237 * genlmsg_cancel - Cancel construction of a generic netlink message
238 * @skb: socket buffer the message is stored in
239 * @hdr: generic netlink message header
241 static inline void genlmsg_cancel(struct sk_buff
*skb
, void *hdr
)
244 nlmsg_cancel(skb
, hdr
- GENL_HDRLEN
- NLMSG_HDRLEN
);
248 * genlmsg_multicast_netns - multicast a netlink message to a specific netns
249 * @net: the net namespace
250 * @skb: netlink message as socket buffer
251 * @portid: own netlink portid to avoid sending to yourself
252 * @group: multicast group id
253 * @flags: allocation flags
255 static inline int genlmsg_multicast_netns(struct net
*net
, struct sk_buff
*skb
,
256 u32 portid
, unsigned int group
, gfp_t flags
)
258 return nlmsg_multicast(net
->genl_sock
, skb
, portid
, group
, flags
);
262 * genlmsg_multicast - multicast a netlink message to the default netns
263 * @skb: netlink message as socket buffer
264 * @portid: own netlink portid to avoid sending to yourself
265 * @group: multicast group id
266 * @flags: allocation flags
268 static inline int genlmsg_multicast(struct sk_buff
*skb
, u32 portid
,
269 unsigned int group
, gfp_t flags
)
271 return genlmsg_multicast_netns(&init_net
, skb
, portid
, group
, flags
);
275 * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
276 * @skb: netlink message as socket buffer
277 * @portid: own netlink portid to avoid sending to yourself
278 * @group: multicast group id
279 * @flags: allocation flags
281 * This function must hold the RTNL or rcu_read_lock().
283 int genlmsg_multicast_allns(struct sk_buff
*skb
, u32 portid
,
284 unsigned int group
, gfp_t flags
);
287 * genlmsg_unicast - unicast a netlink message
288 * @skb: netlink message as socket buffer
289 * @portid: netlink portid of the destination socket
291 static inline int genlmsg_unicast(struct net
*net
, struct sk_buff
*skb
, u32 portid
)
293 return nlmsg_unicast(net
->genl_sock
, skb
, portid
);
297 * genlmsg_reply - reply to a request
298 * @skb: netlink message to be sent back
299 * @info: receiver information
301 static inline int genlmsg_reply(struct sk_buff
*skb
, struct genl_info
*info
)
303 return genlmsg_unicast(genl_info_net(info
), skb
, info
->snd_portid
);
307 * gennlmsg_data - head of message payload
308 * @gnlh: genetlink message header
310 static inline void *genlmsg_data(const struct genlmsghdr
*gnlh
)
312 return ((unsigned char *) gnlh
+ GENL_HDRLEN
);
316 * genlmsg_len - length of message payload
317 * @gnlh: genetlink message header
319 static inline int genlmsg_len(const struct genlmsghdr
*gnlh
)
321 struct nlmsghdr
*nlh
= (struct nlmsghdr
*)((unsigned char *)gnlh
-
323 return (nlh
->nlmsg_len
- GENL_HDRLEN
- NLMSG_HDRLEN
);
327 * genlmsg_msg_size - length of genetlink message not including padding
328 * @payload: length of message payload
330 static inline int genlmsg_msg_size(int payload
)
332 return GENL_HDRLEN
+ payload
;
336 * genlmsg_total_size - length of genetlink message including padding
337 * @payload: length of message payload
339 static inline int genlmsg_total_size(int payload
)
341 return NLMSG_ALIGN(genlmsg_msg_size(payload
));
345 * genlmsg_new - Allocate a new generic netlink message
346 * @payload: size of the message payload
347 * @flags: the type of memory to allocate.
349 static inline struct sk_buff
*genlmsg_new(size_t payload
, gfp_t flags
)
351 return nlmsg_new(genlmsg_total_size(payload
), flags
);
355 #endif /* __NET_GENERIC_NETLINK_H */