xref: /aosp_15_r20/external/libnl/include/netlink/genl/mngt.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2003-2012 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_GENL_MNGT_H_
7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_GENL_MNGT_H_
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/list.h>
12*4dc78e53SAndroid Build Coastguard Worker 
13*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
14*4dc78e53SAndroid Build Coastguard Worker extern "C" {
15*4dc78e53SAndroid Build Coastguard Worker #endif
16*4dc78e53SAndroid Build Coastguard Worker 
17*4dc78e53SAndroid Build Coastguard Worker struct nl_cache_ops;
18*4dc78e53SAndroid Build Coastguard Worker 
19*4dc78e53SAndroid Build Coastguard Worker /**
20*4dc78e53SAndroid Build Coastguard Worker  * @ingroup genl_mngt
21*4dc78e53SAndroid Build Coastguard Worker  * @struct genl_info netlink/genl/mngt.h
22*4dc78e53SAndroid Build Coastguard Worker  *
23*4dc78e53SAndroid Build Coastguard Worker  * Informative structure passed on to message parser callbacks
24*4dc78e53SAndroid Build Coastguard Worker  *
25*4dc78e53SAndroid Build Coastguard Worker  * This structure is passed on to all message parser callbacks and contains
26*4dc78e53SAndroid Build Coastguard Worker  * information about the sender of the message as well as pointers to all
27*4dc78e53SAndroid Build Coastguard Worker  * relevant sections of the parsed message.
28*4dc78e53SAndroid Build Coastguard Worker  *
29*4dc78e53SAndroid Build Coastguard Worker  * @see genl_cmd::c_msg_parser
30*4dc78e53SAndroid Build Coastguard Worker  */
31*4dc78e53SAndroid Build Coastguard Worker struct genl_info
32*4dc78e53SAndroid Build Coastguard Worker {
33*4dc78e53SAndroid Build Coastguard Worker 	/** Socket address of sender */
34*4dc78e53SAndroid Build Coastguard Worker 	struct sockaddr_nl *    who;
35*4dc78e53SAndroid Build Coastguard Worker 
36*4dc78e53SAndroid Build Coastguard Worker 	/** Pointer to Netlink message header */
37*4dc78e53SAndroid Build Coastguard Worker 	struct nlmsghdr *       nlh;
38*4dc78e53SAndroid Build Coastguard Worker 
39*4dc78e53SAndroid Build Coastguard Worker 	/** Pointer to Generic Netlink message header */
40*4dc78e53SAndroid Build Coastguard Worker 	struct genlmsghdr *     genlhdr;
41*4dc78e53SAndroid Build Coastguard Worker 
42*4dc78e53SAndroid Build Coastguard Worker 	/** Pointer to user header */
43*4dc78e53SAndroid Build Coastguard Worker 	void *                  userhdr;
44*4dc78e53SAndroid Build Coastguard Worker 
45*4dc78e53SAndroid Build Coastguard Worker 	/** Pointer to array of parsed attributes */
46*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr **        attrs;
47*4dc78e53SAndroid Build Coastguard Worker };
48*4dc78e53SAndroid Build Coastguard Worker 
49*4dc78e53SAndroid Build Coastguard Worker /**
50*4dc78e53SAndroid Build Coastguard Worker  * @ingroup genl_mngt
51*4dc78e53SAndroid Build Coastguard Worker  * @struct genl_cmd netlink/genl/mngt.h
52*4dc78e53SAndroid Build Coastguard Worker  *
53*4dc78e53SAndroid Build Coastguard Worker  * Definition of a Generic Netlink command.
54*4dc78e53SAndroid Build Coastguard Worker  *
55*4dc78e53SAndroid Build Coastguard Worker  * This structure is used to define the list of available commands on the
56*4dc78e53SAndroid Build Coastguard Worker  * receiving side.
57*4dc78e53SAndroid Build Coastguard Worker  *
58*4dc78e53SAndroid Build Coastguard Worker  * @par Example:
59*4dc78e53SAndroid Build Coastguard Worker  * @code
60*4dc78e53SAndroid Build Coastguard Worker  * static struct genl_cmd foo_cmds[] = {
61*4dc78e53SAndroid Build Coastguard Worker  * 	{
62*4dc78e53SAndroid Build Coastguard Worker  * 		.c_id		= FOO_CMD_NEW,
63*4dc78e53SAndroid Build Coastguard Worker  * 		.c_name		= "NEWFOO" ,
64*4dc78e53SAndroid Build Coastguard Worker  * 		.c_maxattr	= FOO_ATTR_MAX,
65*4dc78e53SAndroid Build Coastguard Worker  * 		.c_attr_policy	= foo_policy,
66*4dc78e53SAndroid Build Coastguard Worker  * 		.c_msg_parser	= foo_msg_parser,
67*4dc78e53SAndroid Build Coastguard Worker  * 	},
68*4dc78e53SAndroid Build Coastguard Worker  * 	{
69*4dc78e53SAndroid Build Coastguard Worker  * 		.c_id		= FOO_CMD_DEL,
70*4dc78e53SAndroid Build Coastguard Worker  * 		.c_name		= "DELFOO" ,
71*4dc78e53SAndroid Build Coastguard Worker  * 	},
72*4dc78e53SAndroid Build Coastguard Worker  * };
73*4dc78e53SAndroid Build Coastguard Worker  *
74*4dc78e53SAndroid Build Coastguard Worker  * static struct genl_ops my_genl_ops = {
75*4dc78e53SAndroid Build Coastguard Worker  * 	[...]
76*4dc78e53SAndroid Build Coastguard Worker  * 	.o_cmds			= foo_cmds,
77*4dc78e53SAndroid Build Coastguard Worker  * 	.o_ncmds		= ARRAY_SIZE(foo_cmds),
78*4dc78e53SAndroid Build Coastguard Worker  * };
79*4dc78e53SAndroid Build Coastguard Worker  * @endcode
80*4dc78e53SAndroid Build Coastguard Worker  */
81*4dc78e53SAndroid Build Coastguard Worker struct genl_cmd
82*4dc78e53SAndroid Build Coastguard Worker {
83*4dc78e53SAndroid Build Coastguard Worker 	/** Numeric command identifier (required) */
84*4dc78e53SAndroid Build Coastguard Worker 	int			c_id;
85*4dc78e53SAndroid Build Coastguard Worker 
86*4dc78e53SAndroid Build Coastguard Worker 	/** Human readable name  (required) */
87*4dc78e53SAndroid Build Coastguard Worker 	char *			c_name;
88*4dc78e53SAndroid Build Coastguard Worker 
89*4dc78e53SAndroid Build Coastguard Worker 	/** Maximum attribute identifier that the command is prepared to handle. */
90*4dc78e53SAndroid Build Coastguard Worker 	int			c_maxattr;
91*4dc78e53SAndroid Build Coastguard Worker 
92*4dc78e53SAndroid Build Coastguard Worker 	/** Called whenever a message for this command is received */
93*4dc78e53SAndroid Build Coastguard Worker 	int		      (*c_msg_parser)(struct nl_cache_ops *,
94*4dc78e53SAndroid Build Coastguard Worker 					      struct genl_cmd *,
95*4dc78e53SAndroid Build Coastguard Worker 					      struct genl_info *, void *);
96*4dc78e53SAndroid Build Coastguard Worker 
97*4dc78e53SAndroid Build Coastguard Worker 	/** Attribute validation policy, enforced before the callback is called */
98*4dc78e53SAndroid Build Coastguard Worker 	struct nla_policy *	c_attr_policy;
99*4dc78e53SAndroid Build Coastguard Worker };
100*4dc78e53SAndroid Build Coastguard Worker 
101*4dc78e53SAndroid Build Coastguard Worker /**
102*4dc78e53SAndroid Build Coastguard Worker  * @ingroup genl_mngt
103*4dc78e53SAndroid Build Coastguard Worker  * @struct genl_ops netlink/genl/mngt.h
104*4dc78e53SAndroid Build Coastguard Worker  *
105*4dc78e53SAndroid Build Coastguard Worker  * Definition of a Generic Netlink family
106*4dc78e53SAndroid Build Coastguard Worker  *
107*4dc78e53SAndroid Build Coastguard Worker  * @par Example:
108*4dc78e53SAndroid Build Coastguard Worker  * @code
109*4dc78e53SAndroid Build Coastguard Worker  * static struct genl_cmd foo_cmds[] = {
110*4dc78e53SAndroid Build Coastguard Worker  * 	[...]
111*4dc78e53SAndroid Build Coastguard Worker  * };
112*4dc78e53SAndroid Build Coastguard Worker  *
113*4dc78e53SAndroid Build Coastguard Worker  * static struct genl_ops my_genl_ops = {
114*4dc78e53SAndroid Build Coastguard Worker  * 	.o_name			= "foo",
115*4dc78e53SAndroid Build Coastguard Worker  * 	.o_hdrsize		= sizeof(struct my_hdr),
116*4dc78e53SAndroid Build Coastguard Worker  * 	.o_cmds			= foo_cmds,
117*4dc78e53SAndroid Build Coastguard Worker  * 	.o_ncmds		= ARRAY_SIZE(foo_cmds),
118*4dc78e53SAndroid Build Coastguard Worker  * };
119*4dc78e53SAndroid Build Coastguard Worker  *
120*4dc78e53SAndroid Build Coastguard Worker  * if ((err = genl_register_family(&my_genl_ops)) < 0)
121*4dc78e53SAndroid Build Coastguard Worker  * 	// ERROR
122*4dc78e53SAndroid Build Coastguard Worker  * @endcode
123*4dc78e53SAndroid Build Coastguard Worker  *
124*4dc78e53SAndroid Build Coastguard Worker  * @see genl_cmd
125*4dc78e53SAndroid Build Coastguard Worker  */
126*4dc78e53SAndroid Build Coastguard Worker struct genl_ops
127*4dc78e53SAndroid Build Coastguard Worker {
128*4dc78e53SAndroid Build Coastguard Worker 	/** Length of user header */
129*4dc78e53SAndroid Build Coastguard Worker 	unsigned int		o_hdrsize;
130*4dc78e53SAndroid Build Coastguard Worker 
131*4dc78e53SAndroid Build Coastguard Worker 	/** Numeric identifier, automatically filled in by genl_ops_resolve() */
132*4dc78e53SAndroid Build Coastguard Worker 	int			o_id;
133*4dc78e53SAndroid Build Coastguard Worker 
134*4dc78e53SAndroid Build Coastguard Worker 	/** Human readable name, used by genl_ops_resolve() to resolve numeric id */
135*4dc78e53SAndroid Build Coastguard Worker 	char *			o_name;
136*4dc78e53SAndroid Build Coastguard Worker 
137*4dc78e53SAndroid Build Coastguard Worker 	/**
138*4dc78e53SAndroid Build Coastguard Worker 	 * If registered via genl_register(), will point to the related
139*4dc78e53SAndroid Build Coastguard Worker 	 * cache operations.
140*4dc78e53SAndroid Build Coastguard Worker 	 */
141*4dc78e53SAndroid Build Coastguard Worker 	struct nl_cache_ops *	o_cache_ops;
142*4dc78e53SAndroid Build Coastguard Worker 
143*4dc78e53SAndroid Build Coastguard Worker 	/** Optional array defining the available Generic Netlink commands */
144*4dc78e53SAndroid Build Coastguard Worker 	struct genl_cmd	*	o_cmds;
145*4dc78e53SAndroid Build Coastguard Worker 
146*4dc78e53SAndroid Build Coastguard Worker 	/** Number of elements in \c o_cmds array */
147*4dc78e53SAndroid Build Coastguard Worker 	int			o_ncmds;
148*4dc78e53SAndroid Build Coastguard Worker 
149*4dc78e53SAndroid Build Coastguard Worker 	/**
150*4dc78e53SAndroid Build Coastguard Worker 	 * @private
151*4dc78e53SAndroid Build Coastguard Worker 	 * Used internally to link together all registered operations.
152*4dc78e53SAndroid Build Coastguard Worker 	 */
153*4dc78e53SAndroid Build Coastguard Worker 	struct nl_list_head	o_list;
154*4dc78e53SAndroid Build Coastguard Worker };
155*4dc78e53SAndroid Build Coastguard Worker 
156*4dc78e53SAndroid Build Coastguard Worker extern int		genl_register_family(struct genl_ops *);
157*4dc78e53SAndroid Build Coastguard Worker extern int		genl_unregister_family(struct genl_ops *);
158*4dc78e53SAndroid Build Coastguard Worker extern int		genl_handle_msg(struct nl_msg *, void *);
159*4dc78e53SAndroid Build Coastguard Worker 
160*4dc78e53SAndroid Build Coastguard Worker extern int		genl_register(struct nl_cache_ops *);
161*4dc78e53SAndroid Build Coastguard Worker extern void		genl_unregister(struct nl_cache_ops *);
162*4dc78e53SAndroid Build Coastguard Worker 
163*4dc78e53SAndroid Build Coastguard Worker extern int		genl_ops_resolve(struct nl_sock *, struct genl_ops *);
164*4dc78e53SAndroid Build Coastguard Worker extern int		genl_mngt_resolve(struct nl_sock *);
165*4dc78e53SAndroid Build Coastguard Worker 
166*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
167*4dc78e53SAndroid Build Coastguard Worker }
168*4dc78e53SAndroid Build Coastguard Worker #endif
169*4dc78e53SAndroid Build Coastguard Worker 
170*4dc78e53SAndroid Build Coastguard Worker #endif
171