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