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