Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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