xref: /aosp_15_r20/external/ethtool/netlink/parser.h (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski  * parser.h - netlink command line parser
3*1b481fc3SMaciej Żenczykowski  *
4*1b481fc3SMaciej Żenczykowski  * Interface for command line parser used by netlink code.
5*1b481fc3SMaciej Żenczykowski  */
6*1b481fc3SMaciej Żenczykowski 
7*1b481fc3SMaciej Żenczykowski #ifndef ETHTOOL_NETLINK_PARSER_H__
8*1b481fc3SMaciej Żenczykowski #define ETHTOOL_NETLINK_PARSER_H__
9*1b481fc3SMaciej Żenczykowski 
10*1b481fc3SMaciej Żenczykowski #include <stddef.h>
11*1b481fc3SMaciej Żenczykowski 
12*1b481fc3SMaciej Żenczykowski #include "netlink.h"
13*1b481fc3SMaciej Żenczykowski 
14*1b481fc3SMaciej Żenczykowski /* Some commands need to generate multiple netlink messages or multiple nested
15*1b481fc3SMaciej Żenczykowski  * attributes from one set of command line parameters. Argument @group_style
16*1b481fc3SMaciej Żenczykowski  * of nl_parser() takes one of three values:
17*1b481fc3SMaciej Żenczykowski  *
18*1b481fc3SMaciej Żenczykowski  * PARSER_GROUP_NONE - no grouping, flat series of attributes (default)
19*1b481fc3SMaciej Żenczykowski  * PARSER_GROUP_NEST - one nest for each @group value (@group is nest type)
20*1b481fc3SMaciej Żenczykowski  * PARSER_GROUP_MSG  - one message for each @group value (@group is command)
21*1b481fc3SMaciej Żenczykowski  */
22*1b481fc3SMaciej Żenczykowski enum parser_group_style {
23*1b481fc3SMaciej Żenczykowski 	PARSER_GROUP_NONE = 0,
24*1b481fc3SMaciej Żenczykowski 	PARSER_GROUP_NEST,
25*1b481fc3SMaciej Żenczykowski 	PARSER_GROUP_MSG,
26*1b481fc3SMaciej Żenczykowski };
27*1b481fc3SMaciej Żenczykowski 
28*1b481fc3SMaciej Żenczykowski typedef int (*param_parser_cb_t)(struct nl_context *, uint16_t, const void *,
29*1b481fc3SMaciej Żenczykowski 				 struct nl_msg_buff *, void *);
30*1b481fc3SMaciej Żenczykowski 
31*1b481fc3SMaciej Żenczykowski struct param_parser {
32*1b481fc3SMaciej Żenczykowski 	/* command line parameter handled by this entry */
33*1b481fc3SMaciej Żenczykowski 	const char		*arg;
34*1b481fc3SMaciej Żenczykowski 	/* group id (see enum parser_group_style above) */
35*1b481fc3SMaciej Żenczykowski 	unsigned int		group;
36*1b481fc3SMaciej Żenczykowski 	/* netlink attribute type */
37*1b481fc3SMaciej Żenczykowski 	uint16_t		type;		/* netlink attribute type */
38*1b481fc3SMaciej Żenczykowski 	/* function called to parse parameter and its value */
39*1b481fc3SMaciej Żenczykowski 	param_parser_cb_t	handler;
40*1b481fc3SMaciej Żenczykowski 	/* pointer passed as @data argument of the handler */
41*1b481fc3SMaciej Żenczykowski 	const void		*handler_data;
42*1b481fc3SMaciej Żenczykowski 	/* minimum number of extra arguments after this parameter */
43*1b481fc3SMaciej Żenczykowski 	unsigned int		min_argc;
44*1b481fc3SMaciej Żenczykowski 	/* if @dest is passed to nl_parser(), offset to store value */
45*1b481fc3SMaciej Żenczykowski 	unsigned int		dest_offset;
46*1b481fc3SMaciej Żenczykowski 	/* parameter alternative group - only one parameter from a group
47*1b481fc3SMaciej Żenczykowski 	 * can be specified, 0 means no group
48*1b481fc3SMaciej Żenczykowski 	 */
49*1b481fc3SMaciej Żenczykowski 	unsigned int		alt_group;
50*1b481fc3SMaciej Żenczykowski };
51*1b481fc3SMaciej Żenczykowski 
52*1b481fc3SMaciej Żenczykowski /* data structures used for handler data */
53*1b481fc3SMaciej Żenczykowski 
54*1b481fc3SMaciej Żenczykowski /* used by nl_parse_lookup_u32() */
55*1b481fc3SMaciej Żenczykowski struct lookup_entry_u32 {
56*1b481fc3SMaciej Żenczykowski 	const char	*arg;
57*1b481fc3SMaciej Żenczykowski 	uint32_t	val;
58*1b481fc3SMaciej Żenczykowski };
59*1b481fc3SMaciej Żenczykowski 
60*1b481fc3SMaciej Żenczykowski /* used by nl_parse_lookup_u8() */
61*1b481fc3SMaciej Żenczykowski struct lookup_entry_u8 {
62*1b481fc3SMaciej Żenczykowski 	const char	*arg;
63*1b481fc3SMaciej Żenczykowski 	uint8_t		val;
64*1b481fc3SMaciej Żenczykowski };
65*1b481fc3SMaciej Żenczykowski 
66*1b481fc3SMaciej Żenczykowski /* used by nl_parse_byte_str() */
67*1b481fc3SMaciej Żenczykowski struct byte_str_parser_data {
68*1b481fc3SMaciej Żenczykowski 	unsigned int	min_len;
69*1b481fc3SMaciej Żenczykowski 	unsigned int	max_len;
70*1b481fc3SMaciej Żenczykowski 	char		delim;
71*1b481fc3SMaciej Żenczykowski };
72*1b481fc3SMaciej Żenczykowski 
73*1b481fc3SMaciej Żenczykowski /* used for value stored by nl_parse_byte_str() */
74*1b481fc3SMaciej Żenczykowski struct byte_str_value {
75*1b481fc3SMaciej Żenczykowski 	unsigned int	len;
76*1b481fc3SMaciej Żenczykowski 	u8		*data;
77*1b481fc3SMaciej Żenczykowski };
78*1b481fc3SMaciej Żenczykowski 
79*1b481fc3SMaciej Żenczykowski /* used by nl_parse_error() */
80*1b481fc3SMaciej Żenczykowski struct error_parser_data {
81*1b481fc3SMaciej Żenczykowski 	const char	*err_msg;
82*1b481fc3SMaciej Żenczykowski 	int		ret_val;
83*1b481fc3SMaciej Żenczykowski 	unsigned int	extra_args;
84*1b481fc3SMaciej Żenczykowski };
85*1b481fc3SMaciej Żenczykowski 
86*1b481fc3SMaciej Żenczykowski /* used by nl_parse_bitset() */
87*1b481fc3SMaciej Żenczykowski struct bitset_parser_data {
88*1b481fc3SMaciej Żenczykowski 	bool		force_hex;
89*1b481fc3SMaciej Żenczykowski 	bool		no_mask;
90*1b481fc3SMaciej Żenczykowski };
91*1b481fc3SMaciej Żenczykowski 
92*1b481fc3SMaciej Żenczykowski /* used by nl_parse_char_bitset() */
93*1b481fc3SMaciej Żenczykowski struct char_bitset_parser_data {
94*1b481fc3SMaciej Żenczykowski 	const char	*bit_chars;
95*1b481fc3SMaciej Żenczykowski 	unsigned int	nbits;
96*1b481fc3SMaciej Żenczykowski 	char		reset_char;
97*1b481fc3SMaciej Żenczykowski 	bool		no_mask;
98*1b481fc3SMaciej Żenczykowski };
99*1b481fc3SMaciej Żenczykowski 
100*1b481fc3SMaciej Żenczykowski int parse_u32(const char *arg, uint32_t *result);
101*1b481fc3SMaciej Żenczykowski 
102*1b481fc3SMaciej Żenczykowski /* parser handlers to use as param_parser::handler */
103*1b481fc3SMaciej Żenczykowski 
104*1b481fc3SMaciej Żenczykowski /* NLA_FLAG represented by on | off */
105*1b481fc3SMaciej Żenczykowski int nl_parse_flag(struct nl_context *nlctx, uint16_t type, const void *data,
106*1b481fc3SMaciej Żenczykowski 		  struct nl_msg_buff *msgbuff, void *dest);
107*1b481fc3SMaciej Żenczykowski /* NLA_NUL_STRING represented by a string argument */
108*1b481fc3SMaciej Żenczykowski int nl_parse_string(struct nl_context *nlctx, uint16_t type, const void *data,
109*1b481fc3SMaciej Żenczykowski 		    struct nl_msg_buff *msgbuff, void *dest);
110*1b481fc3SMaciej Żenczykowski /* NLA_U32 represented as numeric argument */
111*1b481fc3SMaciej Żenczykowski int nl_parse_direct_u32(struct nl_context *nlctx, uint16_t type,
112*1b481fc3SMaciej Żenczykowski 			const void *data, struct nl_msg_buff *msgbuff,
113*1b481fc3SMaciej Żenczykowski 			void *dest);
114*1b481fc3SMaciej Żenczykowski /* NLA_U8 represented as numeric argument */
115*1b481fc3SMaciej Żenczykowski int nl_parse_direct_u8(struct nl_context *nlctx, uint16_t type,
116*1b481fc3SMaciej Żenczykowski 		       const void *data, struct nl_msg_buff *msgbuff,
117*1b481fc3SMaciej Żenczykowski 		       void *dest);
118*1b481fc3SMaciej Żenczykowski /* NLA_U32 represented as float number of meters, converted to cm. */
119*1b481fc3SMaciej Żenczykowski int nl_parse_direct_m2cm(struct nl_context *nlctx, uint16_t type,
120*1b481fc3SMaciej Żenczykowski 			 const void *data, struct nl_msg_buff *msgbuff,
121*1b481fc3SMaciej Żenczykowski 			 void *dest);
122*1b481fc3SMaciej Żenczykowski /* NLA_U8 represented as on | off */
123*1b481fc3SMaciej Żenczykowski int nl_parse_u8bool(struct nl_context *nlctx, uint16_t type, const void *data,
124*1b481fc3SMaciej Żenczykowski 		    struct nl_msg_buff *msgbuff, void *dest);
125*1b481fc3SMaciej Żenczykowski /* NLA_U32 represented by a string argument (lookup table) */
126*1b481fc3SMaciej Żenczykowski int nl_parse_lookup_u32(struct nl_context *nlctx, uint16_t type,
127*1b481fc3SMaciej Żenczykowski 			const void *data, struct nl_msg_buff *msgbuff,
128*1b481fc3SMaciej Żenczykowski 			void *dest);
129*1b481fc3SMaciej Żenczykowski /* NLA_U8 represented by a string argument (lookup table) */
130*1b481fc3SMaciej Żenczykowski int nl_parse_lookup_u8(struct nl_context *nlctx, uint16_t type,
131*1b481fc3SMaciej Żenczykowski 		       const void *data, struct nl_msg_buff *msgbuff,
132*1b481fc3SMaciej Żenczykowski 		       void *dest);
133*1b481fc3SMaciej Żenczykowski /* always fail (for deprecated parameters) */
134*1b481fc3SMaciej Żenczykowski int nl_parse_error(struct nl_context *nlctx, uint16_t type, const void *data,
135*1b481fc3SMaciej Żenczykowski 		   struct nl_msg_buff *msgbuff, void *dest);
136*1b481fc3SMaciej Żenczykowski /* NLA_BINARY represented by %x:%x:...%x (e.g. a MAC address) */
137*1b481fc3SMaciej Żenczykowski int nl_parse_byte_str(struct nl_context *nlctx, uint16_t type,
138*1b481fc3SMaciej Żenczykowski 		      const void *data, struct nl_msg_buff *msgbuff,
139*1b481fc3SMaciej Żenczykowski 		      void *dest);
140*1b481fc3SMaciej Żenczykowski /* bitset represented by %x[/%x] or name on|off ... [--] */
141*1b481fc3SMaciej Żenczykowski int nl_parse_bitset(struct nl_context *nlctx, uint16_t type, const void *data,
142*1b481fc3SMaciej Żenczykowski 		    struct nl_msg_buff *msgbuff, void *dest);
143*1b481fc3SMaciej Żenczykowski /* bitset represented by %u[/%u] or string (characters for bits) */
144*1b481fc3SMaciej Żenczykowski int nl_parse_char_bitset(struct nl_context *nlctx, uint16_t type,
145*1b481fc3SMaciej Żenczykowski 			 const void *data, struct nl_msg_buff *msgbuff,
146*1b481fc3SMaciej Żenczykowski 			 void *dest);
147*1b481fc3SMaciej Żenczykowski 
148*1b481fc3SMaciej Żenczykowski /* main entry point called to parse the command line */
149*1b481fc3SMaciej Żenczykowski int nl_parser(struct nl_context *nlctx, const struct param_parser *params,
150*1b481fc3SMaciej Żenczykowski 	      void *dest, enum parser_group_style group_style,
151*1b481fc3SMaciej Żenczykowski 	      struct nl_msg_buff **msgbuffs);
152*1b481fc3SMaciej Żenczykowski 
153*1b481fc3SMaciej Żenczykowski #endif /* ETHTOOL_NETLINK_PARSER_H__ */
154