1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __NET_GENERIC_NETLINK_H 3 #define __NET_GENERIC_NETLINK_H 4 5 #include <linux/genetlink.h> 6 #include <net/netlink.h> 7 #include <net/net_namespace.h> 8 9 #define GENLMSG_DEFAULT_SIZE (NLMSG_DEFAULT_SIZE - GENL_HDRLEN) 10 11 /** 12 * struct genl_multicast_group - generic netlink multicast group 13 * @name: name of the multicast group, names are per-family 14 * @flags: GENL_* flags (%GENL_ADMIN_PERM or %GENL_UNS_ADMIN_PERM) 15 */ 16 struct genl_multicast_group { 17 char name[GENL_NAMSIZ]; 18 u8 flags; 19 }; 20 21 struct genl_split_ops; 22 struct genl_info; 23 24 /** 25 * struct genl_family - generic netlink family 26 * @hdrsize: length of user specific header in bytes 27 * @name: name of family 28 * @version: protocol version 29 * @maxattr: maximum number of attributes supported 30 * @policy: netlink policy 31 * @netnsok: set to true if the family can handle network 32 * namespaces and should be presented in all of them 33 * @parallel_ops: operations can be called in parallel and aren't 34 * synchronized by the core genetlink code 35 * @pre_doit: called before an operation's doit callback, it may 36 * do additional, common, filtering and return an error 37 * @post_doit: called after an operation's doit callback, it may 38 * undo operations done by pre_doit, for example release locks 39 * @module: pointer to the owning module (set to THIS_MODULE) 40 * @mcgrps: multicast groups used by this family 41 * @n_mcgrps: number of multicast groups 42 * @resv_start_op: first operation for which reserved fields of the header 43 * can be validated and policies are required (see below); 44 * new families should leave this field at zero 45 * @ops: the operations supported by this family 46 * @n_ops: number of operations supported by this family 47 * @small_ops: the small-struct operations supported by this family 48 * @n_small_ops: number of small-struct operations supported by this family 49 * @split_ops: the split do/dump form of operation definition 50 * @n_split_ops: number of entries in @split_ops, not that with split do/dump 51 * ops the number of entries is not the same as number of commands 52 * 53 * Attribute policies (the combination of @policy and @maxattr fields) 54 * can be attached at the family level or at the operation level. 55 * If both are present the per-operation policy takes precedence. 56 * For operations before @resv_start_op lack of policy means that the core 57 * will perform no attribute parsing or validation. For newer operations 58 * if policy is not provided core will reject all TLV attributes. 59 */ 60 struct genl_family { 61 unsigned int hdrsize; 62 char name[GENL_NAMSIZ]; 63 unsigned int version; 64 unsigned int maxattr; 65 u8 netnsok:1; 66 u8 parallel_ops:1; 67 u8 n_ops; 68 u8 n_small_ops; 69 u8 n_split_ops; 70 u8 n_mcgrps; 71 u8 resv_start_op; 72 const struct nla_policy *policy; 73 int (*pre_doit)(const struct genl_split_ops *ops, 74 struct sk_buff *skb, 75 struct genl_info *info); 76 void (*post_doit)(const struct genl_split_ops *ops, 77 struct sk_buff *skb, 78 struct genl_info *info); 79 const struct genl_ops * ops; 80 const struct genl_small_ops *small_ops; 81 const struct genl_split_ops *split_ops; 82 const struct genl_multicast_group *mcgrps; 83 struct module *module; 84 85 /* private: internal use only */ 86 /* protocol family identifier */ 87 int id; 88 /* starting number of multicast group IDs in this family */ 89 unsigned int mcgrp_offset; 90 }; 91 92 /** 93 * struct genl_info - receiving information 94 * @snd_seq: sending sequence number 95 * @snd_portid: netlink portid of sender 96 * @nlhdr: netlink message header 97 * @genlhdr: generic netlink message header 98 * @userhdr: user specific header 99 * @attrs: netlink attributes 100 * @_net: network namespace 101 * @user_ptr: user pointers 102 * @extack: extended ACK report struct 103 */ 104 struct genl_info { 105 u32 snd_seq; 106 u32 snd_portid; 107 struct nlmsghdr * nlhdr; 108 struct genlmsghdr * genlhdr; 109 void * userhdr; 110 struct nlattr ** attrs; 111 possible_net_t _net; 112 void * user_ptr[2]; 113 struct netlink_ext_ack *extack; 114 }; 115 116 static inline struct net *genl_info_net(struct genl_info *info) 117 { 118 return read_pnet(&info->_net); 119 } 120 121 static inline void genl_info_net_set(struct genl_info *info, struct net *net) 122 { 123 write_pnet(&info->_net, net); 124 } 125 126 #define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG((info)->extack, msg) 127 128 /* Report that a root attribute is missing */ 129 #define GENL_REQ_ATTR_CHECK(info, attr) ({ \ 130 struct genl_info *__info = (info); \ 131 \ 132 NL_REQ_ATTR_CHECK(__info->extack, NULL, __info->attrs, (attr)); \ 133 }) 134 135 enum genl_validate_flags { 136 GENL_DONT_VALIDATE_STRICT = BIT(0), 137 GENL_DONT_VALIDATE_DUMP = BIT(1), 138 GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2), 139 }; 140 141 /** 142 * struct genl_small_ops - generic netlink operations (small version) 143 * @cmd: command identifier 144 * @internal_flags: flags used by the family 145 * @flags: GENL_* flags (%GENL_ADMIN_PERM or %GENL_UNS_ADMIN_PERM) 146 * @validate: validation flags from enum genl_validate_flags 147 * @doit: standard command callback 148 * @dumpit: callback for dumpers 149 * 150 * This is a cut-down version of struct genl_ops for users who don't need 151 * most of the ancillary infra and want to save space. 152 */ 153 struct genl_small_ops { 154 int (*doit)(struct sk_buff *skb, struct genl_info *info); 155 int (*dumpit)(struct sk_buff *skb, struct netlink_callback *cb); 156 u8 cmd; 157 u8 internal_flags; 158 u8 flags; 159 u8 validate; 160 }; 161 162 /** 163 * struct genl_ops - generic netlink operations 164 * @cmd: command identifier 165 * @internal_flags: flags used by the family 166 * @flags: GENL_* flags (%GENL_ADMIN_PERM or %GENL_UNS_ADMIN_PERM) 167 * @maxattr: maximum number of attributes supported 168 * @policy: netlink policy (takes precedence over family policy) 169 * @validate: validation flags from enum genl_validate_flags 170 * @doit: standard command callback 171 * @start: start callback for dumps 172 * @dumpit: callback for dumpers 173 * @done: completion callback for dumps 174 */ 175 struct genl_ops { 176 int (*doit)(struct sk_buff *skb, 177 struct genl_info *info); 178 int (*start)(struct netlink_callback *cb); 179 int (*dumpit)(struct sk_buff *skb, 180 struct netlink_callback *cb); 181 int (*done)(struct netlink_callback *cb); 182 const struct nla_policy *policy; 183 unsigned int maxattr; 184 u8 cmd; 185 u8 internal_flags; 186 u8 flags; 187 u8 validate; 188 }; 189 190 /** 191 * struct genl_split_ops - generic netlink operations (do/dump split version) 192 * @cmd: command identifier 193 * @internal_flags: flags used by the family 194 * @flags: GENL_* flags (%GENL_ADMIN_PERM or %GENL_UNS_ADMIN_PERM) 195 * @validate: validation flags from enum genl_validate_flags 196 * @policy: netlink policy (takes precedence over family policy) 197 * @maxattr: maximum number of attributes supported 198 * 199 * Do callbacks: 200 * @pre_doit: called before an operation's @doit callback, it may 201 * do additional, common, filtering and return an error 202 * @doit: standard command callback 203 * @post_doit: called after an operation's @doit callback, it may 204 * undo operations done by pre_doit, for example release locks 205 * 206 * Dump callbacks: 207 * @start: start callback for dumps 208 * @dumpit: callback for dumpers 209 * @done: completion callback for dumps 210 * 211 * Do callbacks can be used if %GENL_CMD_CAP_DO is set in @flags. 212 * Dump callbacks can be used if %GENL_CMD_CAP_DUMP is set in @flags. 213 * Exactly one of those flags must be set. 214 */ 215 struct genl_split_ops { 216 union { 217 struct { 218 int (*pre_doit)(const struct genl_split_ops *ops, 219 struct sk_buff *skb, 220 struct genl_info *info); 221 int (*doit)(struct sk_buff *skb, 222 struct genl_info *info); 223 void (*post_doit)(const struct genl_split_ops *ops, 224 struct sk_buff *skb, 225 struct genl_info *info); 226 }; 227 struct { 228 int (*start)(struct netlink_callback *cb); 229 int (*dumpit)(struct sk_buff *skb, 230 struct netlink_callback *cb); 231 int (*done)(struct netlink_callback *cb); 232 }; 233 }; 234 const struct nla_policy *policy; 235 unsigned int maxattr; 236 u8 cmd; 237 u8 internal_flags; 238 u8 flags; 239 u8 validate; 240 }; 241 242 /** 243 * struct genl_dumpit_info - info that is available during dumpit op call 244 * @family: generic netlink family - for internal genl code usage 245 * @op: generic netlink ops - for internal genl code usage 246 * @attrs: netlink attributes 247 */ 248 struct genl_dumpit_info { 249 const struct genl_family *family; 250 struct genl_split_ops op; 251 struct nlattr **attrs; 252 }; 253 254 static inline const struct genl_dumpit_info * 255 genl_dumpit_info(struct netlink_callback *cb) 256 { 257 return cb->data; 258 } 259 260 int genl_register_family(struct genl_family *family); 261 int genl_unregister_family(const struct genl_family *family); 262 void genl_notify(const struct genl_family *family, struct sk_buff *skb, 263 struct genl_info *info, u32 group, gfp_t flags); 264 265 void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, 266 const struct genl_family *family, int flags, u8 cmd); 267 268 /** 269 * genlmsg_nlhdr - Obtain netlink header from user specified header 270 * @user_hdr: user header as returned from genlmsg_put() 271 * 272 * Returns pointer to netlink header. 273 */ 274 static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr) 275 { 276 return (struct nlmsghdr *)((char *)user_hdr - 277 GENL_HDRLEN - 278 NLMSG_HDRLEN); 279 } 280 281 /** 282 * genlmsg_parse_deprecated - parse attributes of a genetlink message 283 * @nlh: netlink message header 284 * @family: genetlink message family 285 * @tb: destination array with maxtype+1 elements 286 * @maxtype: maximum attribute type to be expected 287 * @policy: validation policy 288 * @extack: extended ACK report struct 289 */ 290 static inline int genlmsg_parse_deprecated(const struct nlmsghdr *nlh, 291 const struct genl_family *family, 292 struct nlattr *tb[], int maxtype, 293 const struct nla_policy *policy, 294 struct netlink_ext_ack *extack) 295 { 296 return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype, 297 policy, NL_VALIDATE_LIBERAL, extack); 298 } 299 300 /** 301 * genlmsg_parse - parse attributes of a genetlink message 302 * @nlh: netlink message header 303 * @family: genetlink message family 304 * @tb: destination array with maxtype+1 elements 305 * @maxtype: maximum attribute type to be expected 306 * @policy: validation policy 307 * @extack: extended ACK report struct 308 */ 309 static inline int genlmsg_parse(const struct nlmsghdr *nlh, 310 const struct genl_family *family, 311 struct nlattr *tb[], int maxtype, 312 const struct nla_policy *policy, 313 struct netlink_ext_ack *extack) 314 { 315 return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype, 316 policy, NL_VALIDATE_STRICT, extack); 317 } 318 319 /** 320 * genl_dump_check_consistent - check if sequence is consistent and advertise if not 321 * @cb: netlink callback structure that stores the sequence number 322 * @user_hdr: user header as returned from genlmsg_put() 323 * 324 * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it 325 * simpler to use with generic netlink. 326 */ 327 static inline void genl_dump_check_consistent(struct netlink_callback *cb, 328 void *user_hdr) 329 { 330 nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr)); 331 } 332 333 /** 334 * genlmsg_put_reply - Add generic netlink header to a reply message 335 * @skb: socket buffer holding the message 336 * @info: receiver info 337 * @family: generic netlink family 338 * @flags: netlink message flags 339 * @cmd: generic netlink command 340 * 341 * Returns pointer to user specific header 342 */ 343 static inline void *genlmsg_put_reply(struct sk_buff *skb, 344 struct genl_info *info, 345 const struct genl_family *family, 346 int flags, u8 cmd) 347 { 348 return genlmsg_put(skb, info->snd_portid, info->snd_seq, family, 349 flags, cmd); 350 } 351 352 /** 353 * genlmsg_end - Finalize a generic netlink message 354 * @skb: socket buffer the message is stored in 355 * @hdr: user specific header 356 */ 357 static inline void genlmsg_end(struct sk_buff *skb, void *hdr) 358 { 359 nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); 360 } 361 362 /** 363 * genlmsg_cancel - Cancel construction of a generic netlink message 364 * @skb: socket buffer the message is stored in 365 * @hdr: generic netlink message header 366 */ 367 static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr) 368 { 369 if (hdr) 370 nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); 371 } 372 373 /** 374 * genlmsg_multicast_netns - multicast a netlink message to a specific netns 375 * @family: the generic netlink family 376 * @net: the net namespace 377 * @skb: netlink message as socket buffer 378 * @portid: own netlink portid to avoid sending to yourself 379 * @group: offset of multicast group in groups array 380 * @flags: allocation flags 381 */ 382 static inline int genlmsg_multicast_netns(const struct genl_family *family, 383 struct net *net, struct sk_buff *skb, 384 u32 portid, unsigned int group, gfp_t flags) 385 { 386 if (WARN_ON_ONCE(group >= family->n_mcgrps)) 387 return -EINVAL; 388 group = family->mcgrp_offset + group; 389 return nlmsg_multicast(net->genl_sock, skb, portid, group, flags); 390 } 391 392 /** 393 * genlmsg_multicast - multicast a netlink message to the default netns 394 * @family: the generic netlink family 395 * @skb: netlink message as socket buffer 396 * @portid: own netlink portid to avoid sending to yourself 397 * @group: offset of multicast group in groups array 398 * @flags: allocation flags 399 */ 400 static inline int genlmsg_multicast(const struct genl_family *family, 401 struct sk_buff *skb, u32 portid, 402 unsigned int group, gfp_t flags) 403 { 404 return genlmsg_multicast_netns(family, &init_net, skb, 405 portid, group, flags); 406 } 407 408 /** 409 * genlmsg_multicast_allns - multicast a netlink message to all net namespaces 410 * @family: the generic netlink family 411 * @skb: netlink message as socket buffer 412 * @portid: own netlink portid to avoid sending to yourself 413 * @group: offset of multicast group in groups array 414 * @flags: allocation flags 415 * 416 * This function must hold the RTNL or rcu_read_lock(). 417 */ 418 int genlmsg_multicast_allns(const struct genl_family *family, 419 struct sk_buff *skb, u32 portid, 420 unsigned int group, gfp_t flags); 421 422 /** 423 * genlmsg_unicast - unicast a netlink message 424 * @net: network namespace to look up @portid in 425 * @skb: netlink message as socket buffer 426 * @portid: netlink portid of the destination socket 427 */ 428 static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 portid) 429 { 430 return nlmsg_unicast(net->genl_sock, skb, portid); 431 } 432 433 /** 434 * genlmsg_reply - reply to a request 435 * @skb: netlink message to be sent back 436 * @info: receiver information 437 */ 438 static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info) 439 { 440 return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid); 441 } 442 443 /** 444 * genlmsg_data - head of message payload 445 * @gnlh: genetlink message header 446 */ 447 static inline void *genlmsg_data(const struct genlmsghdr *gnlh) 448 { 449 return ((unsigned char *) gnlh + GENL_HDRLEN); 450 } 451 452 /** 453 * genlmsg_len - length of message payload 454 * @gnlh: genetlink message header 455 */ 456 static inline int genlmsg_len(const struct genlmsghdr *gnlh) 457 { 458 struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh - 459 NLMSG_HDRLEN); 460 return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN); 461 } 462 463 /** 464 * genlmsg_msg_size - length of genetlink message not including padding 465 * @payload: length of message payload 466 */ 467 static inline int genlmsg_msg_size(int payload) 468 { 469 return GENL_HDRLEN + payload; 470 } 471 472 /** 473 * genlmsg_total_size - length of genetlink message including padding 474 * @payload: length of message payload 475 */ 476 static inline int genlmsg_total_size(int payload) 477 { 478 return NLMSG_ALIGN(genlmsg_msg_size(payload)); 479 } 480 481 /** 482 * genlmsg_new - Allocate a new generic netlink message 483 * @payload: size of the message payload 484 * @flags: the type of memory to allocate. 485 */ 486 static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags) 487 { 488 return nlmsg_new(genlmsg_total_size(payload), flags); 489 } 490 491 /** 492 * genl_set_err - report error to genetlink broadcast listeners 493 * @family: the generic netlink family 494 * @net: the network namespace to report the error to 495 * @portid: the PORTID of a process that we want to skip (if any) 496 * @group: the broadcast group that will notice the error 497 * (this is the offset of the multicast group in the groups array) 498 * @code: error code, must be negative (as usual in kernelspace) 499 * 500 * This function returns the number of broadcast listeners that have set the 501 * NETLINK_RECV_NO_ENOBUFS socket option. 502 */ 503 static inline int genl_set_err(const struct genl_family *family, 504 struct net *net, u32 portid, 505 u32 group, int code) 506 { 507 if (WARN_ON_ONCE(group >= family->n_mcgrps)) 508 return -EINVAL; 509 group = family->mcgrp_offset + group; 510 return netlink_set_err(net->genl_sock, portid, group, code); 511 } 512 513 static inline int genl_has_listeners(const struct genl_family *family, 514 struct net *net, unsigned int group) 515 { 516 if (WARN_ON_ONCE(group >= family->n_mcgrps)) 517 return -EINVAL; 518 group = family->mcgrp_offset + group; 519 return netlink_has_listeners(net->genl_sock, group); 520 } 521 #endif /* __NET_GENERIC_NETLINK_H */ 522