xref: /OK3568_Linux_fs/kernel/include/net/genetlink.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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