1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __NET_GENERIC_NETLINK_H
3*4882a593Smuzhiyun #define __NET_GENERIC_NETLINK_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/genetlink.h>
6*4882a593Smuzhiyun #include <linux/android_kabi.h>
7*4882a593Smuzhiyun #include <net/netlink.h>
8*4882a593Smuzhiyun #include <net/net_namespace.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #define GENLMSG_DEFAULT_SIZE (NLMSG_DEFAULT_SIZE - GENL_HDRLEN)
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /**
13*4882a593Smuzhiyun * struct genl_multicast_group - generic netlink multicast group
14*4882a593Smuzhiyun * @name: name of the multicast group, names are per-family
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun struct genl_multicast_group {
17*4882a593Smuzhiyun char name[GENL_NAMSIZ];
18*4882a593Smuzhiyun };
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun struct genl_ops;
21*4882a593Smuzhiyun struct genl_info;
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun /**
24*4882a593Smuzhiyun * struct genl_family - generic netlink family
25*4882a593Smuzhiyun * @id: protocol family identifier (private)
26*4882a593Smuzhiyun * @hdrsize: length of user specific header in bytes
27*4882a593Smuzhiyun * @name: name of family
28*4882a593Smuzhiyun * @version: protocol version
29*4882a593Smuzhiyun * @maxattr: maximum number of attributes supported
30*4882a593Smuzhiyun * @policy: netlink policy
31*4882a593Smuzhiyun * @netnsok: set to true if the family can handle network
32*4882a593Smuzhiyun * namespaces and should be presented in all of them
33*4882a593Smuzhiyun * @parallel_ops: operations can be called in parallel and aren't
34*4882a593Smuzhiyun * synchronized by the core genetlink code
35*4882a593Smuzhiyun * @pre_doit: called before an operation's doit callback, it may
36*4882a593Smuzhiyun * do additional, common, filtering and return an error
37*4882a593Smuzhiyun * @post_doit: called after an operation's doit callback, it may
38*4882a593Smuzhiyun * undo operations done by pre_doit, for example release locks
39*4882a593Smuzhiyun * @mcgrps: multicast groups used by this family
40*4882a593Smuzhiyun * @n_mcgrps: number of multicast groups
41*4882a593Smuzhiyun * @mcgrp_offset: starting number of multicast group IDs in this family
42*4882a593Smuzhiyun * (private)
43*4882a593Smuzhiyun * @ops: the operations supported by this family
44*4882a593Smuzhiyun * @n_ops: number of operations supported by this family
45*4882a593Smuzhiyun * @small_ops: the small-struct operations supported by this family
46*4882a593Smuzhiyun * @n_small_ops: number of small-struct operations supported by this family
47*4882a593Smuzhiyun */
48*4882a593Smuzhiyun struct genl_family {
49*4882a593Smuzhiyun int id; /* private */
50*4882a593Smuzhiyun unsigned int hdrsize;
51*4882a593Smuzhiyun char name[GENL_NAMSIZ];
52*4882a593Smuzhiyun unsigned int version;
53*4882a593Smuzhiyun unsigned int maxattr;
54*4882a593Smuzhiyun unsigned int mcgrp_offset; /* private */
55*4882a593Smuzhiyun u8 netnsok:1;
56*4882a593Smuzhiyun u8 parallel_ops:1;
57*4882a593Smuzhiyun u8 n_ops;
58*4882a593Smuzhiyun u8 n_small_ops;
59*4882a593Smuzhiyun u8 n_mcgrps;
60*4882a593Smuzhiyun const struct nla_policy *policy;
61*4882a593Smuzhiyun int (*pre_doit)(const struct genl_ops *ops,
62*4882a593Smuzhiyun struct sk_buff *skb,
63*4882a593Smuzhiyun struct genl_info *info);
64*4882a593Smuzhiyun void (*post_doit)(const struct genl_ops *ops,
65*4882a593Smuzhiyun struct sk_buff *skb,
66*4882a593Smuzhiyun struct genl_info *info);
67*4882a593Smuzhiyun const struct genl_ops * ops;
68*4882a593Smuzhiyun const struct genl_small_ops *small_ops;
69*4882a593Smuzhiyun const struct genl_multicast_group *mcgrps;
70*4882a593Smuzhiyun struct module *module;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /**
76*4882a593Smuzhiyun * struct genl_info - receiving information
77*4882a593Smuzhiyun * @snd_seq: sending sequence number
78*4882a593Smuzhiyun * @snd_portid: netlink portid of sender
79*4882a593Smuzhiyun * @nlhdr: netlink message header
80*4882a593Smuzhiyun * @genlhdr: generic netlink message header
81*4882a593Smuzhiyun * @userhdr: user specific header
82*4882a593Smuzhiyun * @attrs: netlink attributes
83*4882a593Smuzhiyun * @_net: network namespace
84*4882a593Smuzhiyun * @user_ptr: user pointers
85*4882a593Smuzhiyun * @extack: extended ACK report struct
86*4882a593Smuzhiyun */
87*4882a593Smuzhiyun struct genl_info {
88*4882a593Smuzhiyun u32 snd_seq;
89*4882a593Smuzhiyun u32 snd_portid;
90*4882a593Smuzhiyun struct nlmsghdr * nlhdr;
91*4882a593Smuzhiyun struct genlmsghdr * genlhdr;
92*4882a593Smuzhiyun void * userhdr;
93*4882a593Smuzhiyun struct nlattr ** attrs;
94*4882a593Smuzhiyun possible_net_t _net;
95*4882a593Smuzhiyun void * user_ptr[2];
96*4882a593Smuzhiyun struct netlink_ext_ack *extack;
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun
genl_info_net(struct genl_info * info)99*4882a593Smuzhiyun static inline struct net *genl_info_net(struct genl_info *info)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun return read_pnet(&info->_net);
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
genl_info_net_set(struct genl_info * info,struct net * net)104*4882a593Smuzhiyun static inline void genl_info_net_set(struct genl_info *info, struct net *net)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun write_pnet(&info->_net, net);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun #define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG((info)->extack, msg)
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun enum genl_validate_flags {
112*4882a593Smuzhiyun GENL_DONT_VALIDATE_STRICT = BIT(0),
113*4882a593Smuzhiyun GENL_DONT_VALIDATE_DUMP = BIT(1),
114*4882a593Smuzhiyun GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2),
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun /**
118*4882a593Smuzhiyun * struct genl_small_ops - generic netlink operations (small version)
119*4882a593Smuzhiyun * @cmd: command identifier
120*4882a593Smuzhiyun * @internal_flags: flags used by the family
121*4882a593Smuzhiyun * @flags: flags
122*4882a593Smuzhiyun * @validate: validation flags from enum genl_validate_flags
123*4882a593Smuzhiyun * @doit: standard command callback
124*4882a593Smuzhiyun * @dumpit: callback for dumpers
125*4882a593Smuzhiyun *
126*4882a593Smuzhiyun * This is a cut-down version of struct genl_ops for users who don't need
127*4882a593Smuzhiyun * most of the ancillary infra and want to save space.
128*4882a593Smuzhiyun */
129*4882a593Smuzhiyun struct genl_small_ops {
130*4882a593Smuzhiyun int (*doit)(struct sk_buff *skb, struct genl_info *info);
131*4882a593Smuzhiyun int (*dumpit)(struct sk_buff *skb, struct netlink_callback *cb);
132*4882a593Smuzhiyun u8 cmd;
133*4882a593Smuzhiyun u8 internal_flags;
134*4882a593Smuzhiyun u8 flags;
135*4882a593Smuzhiyun u8 validate;
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun /**
139*4882a593Smuzhiyun * struct genl_ops - generic netlink operations
140*4882a593Smuzhiyun * @cmd: command identifier
141*4882a593Smuzhiyun * @internal_flags: flags used by the family
142*4882a593Smuzhiyun * @flags: flags
143*4882a593Smuzhiyun * @maxattr: maximum number of attributes supported
144*4882a593Smuzhiyun * @policy: netlink policy (takes precedence over family policy)
145*4882a593Smuzhiyun * @validate: validation flags from enum genl_validate_flags
146*4882a593Smuzhiyun * @doit: standard command callback
147*4882a593Smuzhiyun * @start: start callback for dumps
148*4882a593Smuzhiyun * @dumpit: callback for dumpers
149*4882a593Smuzhiyun * @done: completion callback for dumps
150*4882a593Smuzhiyun */
151*4882a593Smuzhiyun struct genl_ops {
152*4882a593Smuzhiyun int (*doit)(struct sk_buff *skb,
153*4882a593Smuzhiyun struct genl_info *info);
154*4882a593Smuzhiyun int (*start)(struct netlink_callback *cb);
155*4882a593Smuzhiyun int (*dumpit)(struct sk_buff *skb,
156*4882a593Smuzhiyun struct netlink_callback *cb);
157*4882a593Smuzhiyun int (*done)(struct netlink_callback *cb);
158*4882a593Smuzhiyun const struct nla_policy *policy;
159*4882a593Smuzhiyun unsigned int maxattr;
160*4882a593Smuzhiyun u8 cmd;
161*4882a593Smuzhiyun u8 internal_flags;
162*4882a593Smuzhiyun u8 flags;
163*4882a593Smuzhiyun u8 validate;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun /**
169*4882a593Smuzhiyun * struct genl_info - info that is available during dumpit op call
170*4882a593Smuzhiyun * @family: generic netlink family - for internal genl code usage
171*4882a593Smuzhiyun * @ops: generic netlink ops - for internal genl code usage
172*4882a593Smuzhiyun * @attrs: netlink attributes
173*4882a593Smuzhiyun */
174*4882a593Smuzhiyun struct genl_dumpit_info {
175*4882a593Smuzhiyun const struct genl_family *family;
176*4882a593Smuzhiyun struct genl_ops op;
177*4882a593Smuzhiyun struct nlattr **attrs;
178*4882a593Smuzhiyun };
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun static inline const struct genl_dumpit_info *
genl_dumpit_info(struct netlink_callback * cb)181*4882a593Smuzhiyun genl_dumpit_info(struct netlink_callback *cb)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun return cb->data;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun int genl_register_family(struct genl_family *family);
187*4882a593Smuzhiyun int genl_unregister_family(const struct genl_family *family);
188*4882a593Smuzhiyun void genl_notify(const struct genl_family *family, struct sk_buff *skb,
189*4882a593Smuzhiyun struct genl_info *info, u32 group, gfp_t flags);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
192*4882a593Smuzhiyun const struct genl_family *family, int flags, u8 cmd);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /**
195*4882a593Smuzhiyun * genlmsg_nlhdr - Obtain netlink header from user specified header
196*4882a593Smuzhiyun * @user_hdr: user header as returned from genlmsg_put()
197*4882a593Smuzhiyun *
198*4882a593Smuzhiyun * Returns pointer to netlink header.
199*4882a593Smuzhiyun */
genlmsg_nlhdr(void * user_hdr)200*4882a593Smuzhiyun static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun return (struct nlmsghdr *)((char *)user_hdr -
203*4882a593Smuzhiyun GENL_HDRLEN -
204*4882a593Smuzhiyun NLMSG_HDRLEN);
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun /**
208*4882a593Smuzhiyun * genlmsg_parse_deprecated - parse attributes of a genetlink message
209*4882a593Smuzhiyun * @nlh: netlink message header
210*4882a593Smuzhiyun * @family: genetlink message family
211*4882a593Smuzhiyun * @tb: destination array with maxtype+1 elements
212*4882a593Smuzhiyun * @maxtype: maximum attribute type to be expected
213*4882a593Smuzhiyun * @policy: validation policy
214*4882a593Smuzhiyun * @extack: extended ACK report struct
215*4882a593Smuzhiyun */
genlmsg_parse_deprecated(const struct nlmsghdr * nlh,const struct genl_family * family,struct nlattr * tb[],int maxtype,const struct nla_policy * policy,struct netlink_ext_ack * extack)216*4882a593Smuzhiyun static inline int genlmsg_parse_deprecated(const struct nlmsghdr *nlh,
217*4882a593Smuzhiyun const struct genl_family *family,
218*4882a593Smuzhiyun struct nlattr *tb[], int maxtype,
219*4882a593Smuzhiyun const struct nla_policy *policy,
220*4882a593Smuzhiyun struct netlink_ext_ack *extack)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
223*4882a593Smuzhiyun policy, NL_VALIDATE_LIBERAL, extack);
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun /**
227*4882a593Smuzhiyun * genlmsg_parse - parse attributes of a genetlink message
228*4882a593Smuzhiyun * @nlh: netlink message header
229*4882a593Smuzhiyun * @family: genetlink message family
230*4882a593Smuzhiyun * @tb: destination array with maxtype+1 elements
231*4882a593Smuzhiyun * @maxtype: maximum attribute type to be expected
232*4882a593Smuzhiyun * @policy: validation policy
233*4882a593Smuzhiyun * @extack: extended ACK report struct
234*4882a593Smuzhiyun */
genlmsg_parse(const struct nlmsghdr * nlh,const struct genl_family * family,struct nlattr * tb[],int maxtype,const struct nla_policy * policy,struct netlink_ext_ack * extack)235*4882a593Smuzhiyun static inline int genlmsg_parse(const struct nlmsghdr *nlh,
236*4882a593Smuzhiyun const struct genl_family *family,
237*4882a593Smuzhiyun struct nlattr *tb[], int maxtype,
238*4882a593Smuzhiyun const struct nla_policy *policy,
239*4882a593Smuzhiyun struct netlink_ext_ack *extack)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
242*4882a593Smuzhiyun policy, NL_VALIDATE_STRICT, extack);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun /**
246*4882a593Smuzhiyun * genl_dump_check_consistent - check if sequence is consistent and advertise if not
247*4882a593Smuzhiyun * @cb: netlink callback structure that stores the sequence number
248*4882a593Smuzhiyun * @user_hdr: user header as returned from genlmsg_put()
249*4882a593Smuzhiyun *
250*4882a593Smuzhiyun * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
251*4882a593Smuzhiyun * simpler to use with generic netlink.
252*4882a593Smuzhiyun */
genl_dump_check_consistent(struct netlink_callback * cb,void * user_hdr)253*4882a593Smuzhiyun static inline void genl_dump_check_consistent(struct netlink_callback *cb,
254*4882a593Smuzhiyun void *user_hdr)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr));
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun /**
260*4882a593Smuzhiyun * genlmsg_put_reply - Add generic netlink header to a reply message
261*4882a593Smuzhiyun * @skb: socket buffer holding the message
262*4882a593Smuzhiyun * @info: receiver info
263*4882a593Smuzhiyun * @family: generic netlink family
264*4882a593Smuzhiyun * @flags: netlink message flags
265*4882a593Smuzhiyun * @cmd: generic netlink command
266*4882a593Smuzhiyun *
267*4882a593Smuzhiyun * Returns pointer to user specific header
268*4882a593Smuzhiyun */
genlmsg_put_reply(struct sk_buff * skb,struct genl_info * info,const struct genl_family * family,int flags,u8 cmd)269*4882a593Smuzhiyun static inline void *genlmsg_put_reply(struct sk_buff *skb,
270*4882a593Smuzhiyun struct genl_info *info,
271*4882a593Smuzhiyun const struct genl_family *family,
272*4882a593Smuzhiyun int flags, u8 cmd)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun return genlmsg_put(skb, info->snd_portid, info->snd_seq, family,
275*4882a593Smuzhiyun flags, cmd);
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun /**
279*4882a593Smuzhiyun * genlmsg_end - Finalize a generic netlink message
280*4882a593Smuzhiyun * @skb: socket buffer the message is stored in
281*4882a593Smuzhiyun * @hdr: user specific header
282*4882a593Smuzhiyun */
genlmsg_end(struct sk_buff * skb,void * hdr)283*4882a593Smuzhiyun static inline void genlmsg_end(struct sk_buff *skb, void *hdr)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun /**
289*4882a593Smuzhiyun * genlmsg_cancel - Cancel construction of a generic netlink message
290*4882a593Smuzhiyun * @skb: socket buffer the message is stored in
291*4882a593Smuzhiyun * @hdr: generic netlink message header
292*4882a593Smuzhiyun */
genlmsg_cancel(struct sk_buff * skb,void * hdr)293*4882a593Smuzhiyun static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun if (hdr)
296*4882a593Smuzhiyun nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun /**
300*4882a593Smuzhiyun * genlmsg_multicast_netns - multicast a netlink message to a specific netns
301*4882a593Smuzhiyun * @family: the generic netlink family
302*4882a593Smuzhiyun * @net: the net namespace
303*4882a593Smuzhiyun * @skb: netlink message as socket buffer
304*4882a593Smuzhiyun * @portid: own netlink portid to avoid sending to yourself
305*4882a593Smuzhiyun * @group: offset of multicast group in groups array
306*4882a593Smuzhiyun * @flags: allocation flags
307*4882a593Smuzhiyun */
genlmsg_multicast_netns(const struct genl_family * family,struct net * net,struct sk_buff * skb,u32 portid,unsigned int group,gfp_t flags)308*4882a593Smuzhiyun static inline int genlmsg_multicast_netns(const struct genl_family *family,
309*4882a593Smuzhiyun struct net *net, struct sk_buff *skb,
310*4882a593Smuzhiyun u32 portid, unsigned int group, gfp_t flags)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun if (WARN_ON_ONCE(group >= family->n_mcgrps))
313*4882a593Smuzhiyun return -EINVAL;
314*4882a593Smuzhiyun group = family->mcgrp_offset + group;
315*4882a593Smuzhiyun return nlmsg_multicast(net->genl_sock, skb, portid, group, flags);
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun /**
319*4882a593Smuzhiyun * genlmsg_multicast - multicast a netlink message to the default netns
320*4882a593Smuzhiyun * @family: the generic netlink family
321*4882a593Smuzhiyun * @skb: netlink message as socket buffer
322*4882a593Smuzhiyun * @portid: own netlink portid to avoid sending to yourself
323*4882a593Smuzhiyun * @group: offset of multicast group in groups array
324*4882a593Smuzhiyun * @flags: allocation flags
325*4882a593Smuzhiyun */
genlmsg_multicast(const struct genl_family * family,struct sk_buff * skb,u32 portid,unsigned int group,gfp_t flags)326*4882a593Smuzhiyun static inline int genlmsg_multicast(const struct genl_family *family,
327*4882a593Smuzhiyun struct sk_buff *skb, u32 portid,
328*4882a593Smuzhiyun unsigned int group, gfp_t flags)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun return genlmsg_multicast_netns(family, &init_net, skb,
331*4882a593Smuzhiyun portid, group, flags);
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun /**
335*4882a593Smuzhiyun * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
336*4882a593Smuzhiyun * @family: the generic netlink family
337*4882a593Smuzhiyun * @skb: netlink message as socket buffer
338*4882a593Smuzhiyun * @portid: own netlink portid to avoid sending to yourself
339*4882a593Smuzhiyun * @group: offset of multicast group in groups array
340*4882a593Smuzhiyun * @flags: allocation flags
341*4882a593Smuzhiyun *
342*4882a593Smuzhiyun * This function must hold the RTNL or rcu_read_lock().
343*4882a593Smuzhiyun */
344*4882a593Smuzhiyun int genlmsg_multicast_allns(const struct genl_family *family,
345*4882a593Smuzhiyun struct sk_buff *skb, u32 portid,
346*4882a593Smuzhiyun unsigned int group, gfp_t flags);
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun /**
349*4882a593Smuzhiyun * genlmsg_unicast - unicast a netlink message
350*4882a593Smuzhiyun * @skb: netlink message as socket buffer
351*4882a593Smuzhiyun * @portid: netlink portid of the destination socket
352*4882a593Smuzhiyun */
genlmsg_unicast(struct net * net,struct sk_buff * skb,u32 portid)353*4882a593Smuzhiyun static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 portid)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun return nlmsg_unicast(net->genl_sock, skb, portid);
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun /**
359*4882a593Smuzhiyun * genlmsg_reply - reply to a request
360*4882a593Smuzhiyun * @skb: netlink message to be sent back
361*4882a593Smuzhiyun * @info: receiver information
362*4882a593Smuzhiyun */
genlmsg_reply(struct sk_buff * skb,struct genl_info * info)363*4882a593Smuzhiyun static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid);
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun /**
369*4882a593Smuzhiyun * gennlmsg_data - head of message payload
370*4882a593Smuzhiyun * @gnlh: genetlink message header
371*4882a593Smuzhiyun */
genlmsg_data(const struct genlmsghdr * gnlh)372*4882a593Smuzhiyun static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun return ((unsigned char *) gnlh + GENL_HDRLEN);
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun /**
378*4882a593Smuzhiyun * genlmsg_len - length of message payload
379*4882a593Smuzhiyun * @gnlh: genetlink message header
380*4882a593Smuzhiyun */
genlmsg_len(const struct genlmsghdr * gnlh)381*4882a593Smuzhiyun static inline int genlmsg_len(const struct genlmsghdr *gnlh)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
384*4882a593Smuzhiyun NLMSG_HDRLEN);
385*4882a593Smuzhiyun return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun /**
389*4882a593Smuzhiyun * genlmsg_msg_size - length of genetlink message not including padding
390*4882a593Smuzhiyun * @payload: length of message payload
391*4882a593Smuzhiyun */
genlmsg_msg_size(int payload)392*4882a593Smuzhiyun static inline int genlmsg_msg_size(int payload)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun return GENL_HDRLEN + payload;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /**
398*4882a593Smuzhiyun * genlmsg_total_size - length of genetlink message including padding
399*4882a593Smuzhiyun * @payload: length of message payload
400*4882a593Smuzhiyun */
genlmsg_total_size(int payload)401*4882a593Smuzhiyun static inline int genlmsg_total_size(int payload)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun return NLMSG_ALIGN(genlmsg_msg_size(payload));
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun /**
407*4882a593Smuzhiyun * genlmsg_new - Allocate a new generic netlink message
408*4882a593Smuzhiyun * @payload: size of the message payload
409*4882a593Smuzhiyun * @flags: the type of memory to allocate.
410*4882a593Smuzhiyun */
genlmsg_new(size_t payload,gfp_t flags)411*4882a593Smuzhiyun static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun return nlmsg_new(genlmsg_total_size(payload), flags);
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun /**
417*4882a593Smuzhiyun * genl_set_err - report error to genetlink broadcast listeners
418*4882a593Smuzhiyun * @family: the generic netlink family
419*4882a593Smuzhiyun * @net: the network namespace to report the error to
420*4882a593Smuzhiyun * @portid: the PORTID of a process that we want to skip (if any)
421*4882a593Smuzhiyun * @group: the broadcast group that will notice the error
422*4882a593Smuzhiyun * (this is the offset of the multicast group in the groups array)
423*4882a593Smuzhiyun * @code: error code, must be negative (as usual in kernelspace)
424*4882a593Smuzhiyun *
425*4882a593Smuzhiyun * This function returns the number of broadcast listeners that have set the
426*4882a593Smuzhiyun * NETLINK_RECV_NO_ENOBUFS socket option.
427*4882a593Smuzhiyun */
genl_set_err(const struct genl_family * family,struct net * net,u32 portid,u32 group,int code)428*4882a593Smuzhiyun static inline int genl_set_err(const struct genl_family *family,
429*4882a593Smuzhiyun struct net *net, u32 portid,
430*4882a593Smuzhiyun u32 group, int code)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun if (WARN_ON_ONCE(group >= family->n_mcgrps))
433*4882a593Smuzhiyun return -EINVAL;
434*4882a593Smuzhiyun group = family->mcgrp_offset + group;
435*4882a593Smuzhiyun return netlink_set_err(net->genl_sock, portid, group, code);
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
genl_has_listeners(const struct genl_family * family,struct net * net,unsigned int group)438*4882a593Smuzhiyun static inline int genl_has_listeners(const struct genl_family *family,
439*4882a593Smuzhiyun struct net *net, unsigned int group)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun if (WARN_ON_ONCE(group >= family->n_mcgrps))
442*4882a593Smuzhiyun return -EINVAL;
443*4882a593Smuzhiyun group = family->mcgrp_offset + group;
444*4882a593Smuzhiyun return netlink_has_listeners(net->genl_sock, group);
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun #endif /* __NET_GENERIC_NETLINK_H */
447