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