root/include/net/genetlink.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. genl_info_net
  2. genl_info_net_set
  3. genl_err_attr
  4. genlmsg_nlhdr
  5. genlmsg_parse_deprecated
  6. genlmsg_parse
  7. genl_dump_check_consistent
  8. genlmsg_put_reply
  9. genlmsg_end
  10. genlmsg_cancel
  11. genlmsg_multicast_netns
  12. genlmsg_multicast
  13. genlmsg_unicast
  14. genlmsg_reply
  15. genlmsg_data
  16. genlmsg_len
  17. genlmsg_msg_size
  18. genlmsg_total_size
  19. genlmsg_new
  20. genl_set_err
  21. genl_has_listeners

   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  */
  15 struct genl_multicast_group {
  16         char                    name[GENL_NAMSIZ];
  17 };
  18 
  19 struct genl_ops;
  20 struct genl_info;
  21 
  22 /**
  23  * struct genl_family - generic netlink family
  24  * @id: protocol family identifier (private)
  25  * @hdrsize: length of user specific header in bytes
  26  * @name: name of family
  27  * @version: protocol version
  28  * @maxattr: maximum number of attributes supported
  29  * @policy: netlink policy
  30  * @netnsok: set to true if the family can handle network
  31  *      namespaces and should be presented in all of them
  32  * @parallel_ops: operations can be called in parallel and aren't
  33  *      synchronized by the core genetlink code
  34  * @pre_doit: called before an operation's doit callback, it may
  35  *      do additional, common, filtering and return an error
  36  * @post_doit: called after an operation's doit callback, it may
  37  *      undo operations done by pre_doit, for example release locks
  38  * @mcast_bind: a socket bound to the given multicast group (which
  39  *      is given as the offset into the groups array)
  40  * @mcast_unbind: a socket was unbound from the given multicast group.
  41  *      Note that unbind() will not be called symmetrically if the
  42  *      generic netlink family is removed while there are still open
  43  *      sockets.
  44  * @attrbuf: buffer to store parsed attributes (private)
  45  * @mcgrps: multicast groups used by this family
  46  * @n_mcgrps: number of multicast groups
  47  * @mcgrp_offset: starting number of multicast group IDs in this family
  48  *      (private)
  49  * @ops: the operations supported by this family
  50  * @n_ops: number of operations supported by this family
  51  */
  52 struct genl_family {
  53         int                     id;             /* private */
  54         unsigned int            hdrsize;
  55         char                    name[GENL_NAMSIZ];
  56         unsigned int            version;
  57         unsigned int            maxattr;
  58         bool                    netnsok;
  59         bool                    parallel_ops;
  60         const struct nla_policy *policy;
  61         int                     (*pre_doit)(const struct genl_ops *ops,
  62                                             struct sk_buff *skb,
  63                                             struct genl_info *info);
  64         void                    (*post_doit)(const struct genl_ops *ops,
  65                                              struct sk_buff *skb,
  66                                              struct genl_info *info);
  67         int                     (*mcast_bind)(struct net *net, int group);
  68         void                    (*mcast_unbind)(struct net *net, int group);
  69         struct nlattr **        attrbuf;        /* private */
  70         const struct genl_ops * ops;
  71         const struct genl_multicast_group *mcgrps;
  72         unsigned int            n_ops;
  73         unsigned int            n_mcgrps;
  74         unsigned int            mcgrp_offset;   /* private */
  75         struct module           *module;
  76 };
  77 
  78 struct nlattr **genl_family_attrbuf(const struct genl_family *family);
  79 
  80 /**
  81  * struct genl_info - receiving information
  82  * @snd_seq: sending sequence number
  83  * @snd_portid: netlink portid of sender
  84  * @nlhdr: netlink message header
  85  * @genlhdr: generic netlink message header
  86  * @userhdr: user specific header
  87  * @attrs: netlink attributes
  88  * @_net: network namespace
  89  * @user_ptr: user pointers
  90  * @extack: extended ACK report struct
  91  */
  92 struct genl_info {
  93         u32                     snd_seq;
  94         u32                     snd_portid;
  95         struct nlmsghdr *       nlhdr;
  96         struct genlmsghdr *     genlhdr;
  97         void *                  userhdr;
  98         struct nlattr **        attrs;
  99         possible_net_t          _net;
 100         void *                  user_ptr[2];
 101         struct netlink_ext_ack *extack;
 102 };
 103 
 104 static inline struct net *genl_info_net(struct genl_info *info)
 105 {
 106         return read_pnet(&info->_net);
 107 }
 108 
 109 static inline void genl_info_net_set(struct genl_info *info, struct net *net)
 110 {
 111         write_pnet(&info->_net, net);
 112 }
 113 
 114 #define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG((info)->extack, msg)
 115 
 116 static inline int genl_err_attr(struct genl_info *info, int err,
 117                                 const struct nlattr *attr)
 118 {
 119         info->extack->bad_attr = attr;
 120 
 121         return err;
 122 }
 123 
 124 enum genl_validate_flags {
 125         GENL_DONT_VALIDATE_STRICT               = BIT(0),
 126         GENL_DONT_VALIDATE_DUMP                 = BIT(1),
 127         GENL_DONT_VALIDATE_DUMP_STRICT          = BIT(2),
 128 };
 129 
 130 /**
 131  * struct genl_ops - generic netlink operations
 132  * @cmd: command identifier
 133  * @internal_flags: flags used by the family
 134  * @flags: flags
 135  * @doit: standard command callback
 136  * @start: start callback for dumps
 137  * @dumpit: callback for dumpers
 138  * @done: completion callback for dumps
 139  */
 140 struct genl_ops {
 141         int                    (*doit)(struct sk_buff *skb,
 142                                        struct genl_info *info);
 143         int                    (*start)(struct netlink_callback *cb);
 144         int                    (*dumpit)(struct sk_buff *skb,
 145                                          struct netlink_callback *cb);
 146         int                    (*done)(struct netlink_callback *cb);
 147         u8                      cmd;
 148         u8                      internal_flags;
 149         u8                      flags;
 150         u8                      validate;
 151 };
 152 
 153 int genl_register_family(struct genl_family *family);
 154 int genl_unregister_family(const struct genl_family *family);
 155 void genl_notify(const struct genl_family *family, struct sk_buff *skb,
 156                  struct genl_info *info, u32 group, gfp_t flags);
 157 
 158 void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
 159                   const struct genl_family *family, int flags, u8 cmd);
 160 
 161 /**
 162  * genlmsg_nlhdr - Obtain netlink header from user specified header
 163  * @user_hdr: user header as returned from genlmsg_put()
 164  *
 165  * Returns pointer to netlink header.
 166  */
 167 static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr)
 168 {
 169         return (struct nlmsghdr *)((char *)user_hdr -
 170                                    GENL_HDRLEN -
 171                                    NLMSG_HDRLEN);
 172 }
 173 
 174 /**
 175  * genlmsg_parse_deprecated - parse attributes of a genetlink message
 176  * @nlh: netlink message header
 177  * @family: genetlink message family
 178  * @tb: destination array with maxtype+1 elements
 179  * @maxtype: maximum attribute type to be expected
 180  * @policy: validation policy
 181  * @extack: extended ACK report struct
 182  */
 183 static inline int genlmsg_parse_deprecated(const struct nlmsghdr *nlh,
 184                                            const struct genl_family *family,
 185                                            struct nlattr *tb[], int maxtype,
 186                                            const struct nla_policy *policy,
 187                                            struct netlink_ext_ack *extack)
 188 {
 189         return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
 190                              policy, NL_VALIDATE_LIBERAL, extack);
 191 }
 192 
 193 /**
 194  * genlmsg_parse - parse attributes of a genetlink message
 195  * @nlh: netlink message header
 196  * @family: genetlink message family
 197  * @tb: destination array with maxtype+1 elements
 198  * @maxtype: maximum attribute type to be expected
 199  * @policy: validation policy
 200  * @extack: extended ACK report struct
 201  */
 202 static inline int genlmsg_parse(const struct nlmsghdr *nlh,
 203                                 const struct genl_family *family,
 204                                 struct nlattr *tb[], int maxtype,
 205                                 const struct nla_policy *policy,
 206                                 struct netlink_ext_ack *extack)
 207 {
 208         return __nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
 209                              policy, NL_VALIDATE_STRICT, extack);
 210 }
 211 
 212 /**
 213  * genl_dump_check_consistent - check if sequence is consistent and advertise if not
 214  * @cb: netlink callback structure that stores the sequence number
 215  * @user_hdr: user header as returned from genlmsg_put()
 216  *
 217  * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
 218  * simpler to use with generic netlink.
 219  */
 220 static inline void genl_dump_check_consistent(struct netlink_callback *cb,
 221                                               void *user_hdr)
 222 {
 223         nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr));
 224 }
 225 
 226 /**
 227  * genlmsg_put_reply - Add generic netlink header to a reply message
 228  * @skb: socket buffer holding the message
 229  * @info: receiver info
 230  * @family: generic netlink family
 231  * @flags: netlink message flags
 232  * @cmd: generic netlink command
 233  *
 234  * Returns pointer to user specific header
 235  */
 236 static inline void *genlmsg_put_reply(struct sk_buff *skb,
 237                                       struct genl_info *info,
 238                                       const struct genl_family *family,
 239                                       int flags, u8 cmd)
 240 {
 241         return genlmsg_put(skb, info->snd_portid, info->snd_seq, family,
 242                            flags, cmd);
 243 }
 244 
 245 /**
 246  * genlmsg_end - Finalize a generic netlink message
 247  * @skb: socket buffer the message is stored in
 248  * @hdr: user specific header
 249  */
 250 static inline void genlmsg_end(struct sk_buff *skb, void *hdr)
 251 {
 252         nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
 253 }
 254 
 255 /**
 256  * genlmsg_cancel - Cancel construction of a generic netlink message
 257  * @skb: socket buffer the message is stored in
 258  * @hdr: generic netlink message header
 259  */
 260 static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
 261 {
 262         if (hdr)
 263                 nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
 264 }
 265 
 266 /**
 267  * genlmsg_multicast_netns - multicast a netlink message to a specific netns
 268  * @family: the generic netlink family
 269  * @net: the net namespace
 270  * @skb: netlink message as socket buffer
 271  * @portid: own netlink portid to avoid sending to yourself
 272  * @group: offset of multicast group in groups array
 273  * @flags: allocation flags
 274  */
 275 static inline int genlmsg_multicast_netns(const struct genl_family *family,
 276                                           struct net *net, struct sk_buff *skb,
 277                                           u32 portid, unsigned int group, gfp_t flags)
 278 {
 279         if (WARN_ON_ONCE(group >= family->n_mcgrps))
 280                 return -EINVAL;
 281         group = family->mcgrp_offset + group;
 282         return nlmsg_multicast(net->genl_sock, skb, portid, group, flags);
 283 }
 284 
 285 /**
 286  * genlmsg_multicast - multicast a netlink message to the default netns
 287  * @family: the generic netlink family
 288  * @skb: netlink message as socket buffer
 289  * @portid: own netlink portid to avoid sending to yourself
 290  * @group: offset of multicast group in groups array
 291  * @flags: allocation flags
 292  */
 293 static inline int genlmsg_multicast(const struct genl_family *family,
 294                                     struct sk_buff *skb, u32 portid,
 295                                     unsigned int group, gfp_t flags)
 296 {
 297         return genlmsg_multicast_netns(family, &init_net, skb,
 298                                        portid, group, flags);
 299 }
 300 
 301 /**
 302  * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
 303  * @family: the generic netlink family
 304  * @skb: netlink message as socket buffer
 305  * @portid: own netlink portid to avoid sending to yourself
 306  * @group: offset of multicast group in groups array
 307  * @flags: allocation flags
 308  *
 309  * This function must hold the RTNL or rcu_read_lock().
 310  */
 311 int genlmsg_multicast_allns(const struct genl_family *family,
 312                             struct sk_buff *skb, u32 portid,
 313                             unsigned int group, gfp_t flags);
 314 
 315 /**
 316  * genlmsg_unicast - unicast a netlink message
 317  * @skb: netlink message as socket buffer
 318  * @portid: netlink portid of the destination socket
 319  */
 320 static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 portid)
 321 {
 322         return nlmsg_unicast(net->genl_sock, skb, portid);
 323 }
 324 
 325 /**
 326  * genlmsg_reply - reply to a request
 327  * @skb: netlink message to be sent back
 328  * @info: receiver information
 329  */
 330 static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
 331 {
 332         return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid);
 333 }
 334 
 335 /**
 336  * gennlmsg_data - head of message payload
 337  * @gnlh: genetlink message header
 338  */
 339 static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
 340 {
 341         return ((unsigned char *) gnlh + GENL_HDRLEN);
 342 }
 343 
 344 /**
 345  * genlmsg_len - length of message payload
 346  * @gnlh: genetlink message header
 347  */
 348 static inline int genlmsg_len(const struct genlmsghdr *gnlh)
 349 {
 350         struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
 351                                                         NLMSG_HDRLEN);
 352         return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
 353 }
 354 
 355 /**
 356  * genlmsg_msg_size - length of genetlink message not including padding
 357  * @payload: length of message payload
 358  */
 359 static inline int genlmsg_msg_size(int payload)
 360 {
 361         return GENL_HDRLEN + payload;
 362 }
 363 
 364 /**
 365  * genlmsg_total_size - length of genetlink message including padding
 366  * @payload: length of message payload
 367  */
 368 static inline int genlmsg_total_size(int payload)
 369 {
 370         return NLMSG_ALIGN(genlmsg_msg_size(payload));
 371 }
 372 
 373 /**
 374  * genlmsg_new - Allocate a new generic netlink message
 375  * @payload: size of the message payload
 376  * @flags: the type of memory to allocate.
 377  */
 378 static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
 379 {
 380         return nlmsg_new(genlmsg_total_size(payload), flags);
 381 }
 382 
 383 /**
 384  * genl_set_err - report error to genetlink broadcast listeners
 385  * @family: the generic netlink family
 386  * @net: the network namespace to report the error to
 387  * @portid: the PORTID of a process that we want to skip (if any)
 388  * @group: the broadcast group that will notice the error
 389  *      (this is the offset of the multicast group in the groups array)
 390  * @code: error code, must be negative (as usual in kernelspace)
 391  *
 392  * This function returns the number of broadcast listeners that have set the
 393  * NETLINK_RECV_NO_ENOBUFS socket option.
 394  */
 395 static inline int genl_set_err(const struct genl_family *family,
 396                                struct net *net, u32 portid,
 397                                u32 group, int code)
 398 {
 399         if (WARN_ON_ONCE(group >= family->n_mcgrps))
 400                 return -EINVAL;
 401         group = family->mcgrp_offset + group;
 402         return netlink_set_err(net->genl_sock, portid, group, code);
 403 }
 404 
 405 static inline int genl_has_listeners(const struct genl_family *family,
 406                                      struct net *net, unsigned int group)
 407 {
 408         if (WARN_ON_ONCE(group >= family->n_mcgrps))
 409                 return -EINVAL;
 410         group = family->mcgrp_offset + group;
 411         return netlink_has_listeners(net->genl_sock, group);
 412 }
 413 #endif  /* __NET_GENERIC_NETLINK_H */

/* [<][>][^][v][top][bottom][index][help] */