linux/include/net/netlink.h
<<
>>
Prefs
   1#ifndef __NET_NETLINK_H
   2#define __NET_NETLINK_H
   3
   4#include <linux/types.h>
   5#include <linux/netlink.h>
   6#include <linux/jiffies.h>
   7
   8/* ========================================================================
   9 *         Netlink Messages and Attributes Interface (As Seen On TV)
  10 * ------------------------------------------------------------------------
  11 *                          Messages Interface
  12 * ------------------------------------------------------------------------
  13 *
  14 * Message Format:
  15 *    <--- nlmsg_total_size(payload)  --->
  16 *    <-- nlmsg_msg_size(payload) ->
  17 *   +----------+- - -+-------------+- - -+-------- - -
  18 *   | nlmsghdr | Pad |   Payload   | Pad | nlmsghdr
  19 *   +----------+- - -+-------------+- - -+-------- - -
  20 *   nlmsg_data(nlh)---^                   ^
  21 *   nlmsg_next(nlh)-----------------------+
  22 *
  23 * Payload Format:
  24 *    <---------------------- nlmsg_len(nlh) --------------------->
  25 *    <------ hdrlen ------>       <- nlmsg_attrlen(nlh, hdrlen) ->
  26 *   +----------------------+- - -+--------------------------------+
  27 *   |     Family Header    | Pad |           Attributes           |
  28 *   +----------------------+- - -+--------------------------------+
  29 *   nlmsg_attrdata(nlh, hdrlen)---^
  30 *
  31 * Data Structures:
  32 *   struct nlmsghdr                    netlink message header
  33 *
  34 * Message Construction:
  35 *   nlmsg_new()                        create a new netlink message
  36 *   nlmsg_put()                        add a netlink message to an skb
  37 *   nlmsg_put_answer()                 callback based nlmsg_put()
  38 *   nlmsg_end()                        finalize netlink message
  39 *   nlmsg_get_pos()                    return current position in message
  40 *   nlmsg_trim()                       trim part of message
  41 *   nlmsg_cancel()                     cancel message construction
  42 *   nlmsg_free()                       free a netlink message
  43 *
  44 * Message Sending:
  45 *   nlmsg_multicast()                  multicast message to several groups
  46 *   nlmsg_unicast()                    unicast a message to a single socket
  47 *   nlmsg_notify()                     send notification message
  48 *
  49 * Message Length Calculations:
  50 *   nlmsg_msg_size(payload)            length of message w/o padding
  51 *   nlmsg_total_size(payload)          length of message w/ padding
  52 *   nlmsg_padlen(payload)              length of padding at tail
  53 *
  54 * Message Payload Access:
  55 *   nlmsg_data(nlh)                    head of message payload
  56 *   nlmsg_len(nlh)                     length of message payload
  57 *   nlmsg_attrdata(nlh, hdrlen)        head of attributes data
  58 *   nlmsg_attrlen(nlh, hdrlen)         length of attributes data
  59 *
  60 * Message Parsing:
  61 *   nlmsg_ok(nlh, remaining)           does nlh fit into remaining bytes?
  62 *   nlmsg_next(nlh, remaining)         get next netlink message
  63 *   nlmsg_parse()                      parse attributes of a message
  64 *   nlmsg_find_attr()                  find an attribute in a message
  65 *   nlmsg_for_each_msg()               loop over all messages
  66 *   nlmsg_validate()                   validate netlink message incl. attrs
  67 *   nlmsg_for_each_attr()              loop over all attributes
  68 *
  69 * Misc:
  70 *   nlmsg_report()                     report back to application?
  71 *
  72 * ------------------------------------------------------------------------
  73 *                          Attributes Interface
  74 * ------------------------------------------------------------------------
  75 *
  76 * Attribute Format:
  77 *    <------- nla_total_size(payload) ------->
  78 *    <---- nla_attr_size(payload) ----->
  79 *   +----------+- - -+- - - - - - - - - +- - -+-------- - -
  80 *   |  Header  | Pad |     Payload      | Pad |  Header
  81 *   +----------+- - -+- - - - - - - - - +- - -+-------- - -
  82 *                     <- nla_len(nla) ->      ^
  83 *   nla_data(nla)----^                        |
  84 *   nla_next(nla)-----------------------------'
  85 *
  86 * Data Structures:
  87 *   struct nlattr                      netlink attribute header
  88 *
  89 * Attribute Construction:
  90 *   nla_reserve(skb, type, len)        reserve room for an attribute
  91 *   nla_reserve_nohdr(skb, len)        reserve room for an attribute w/o hdr
  92 *   nla_put(skb, type, len, data)      add attribute to skb
  93 *   nla_put_nohdr(skb, len, data)      add attribute w/o hdr
  94 *   nla_append(skb, len, data)         append data to skb
  95 *
  96 * Attribute Construction for Basic Types:
  97 *   nla_put_u8(skb, type, value)       add u8 attribute to skb
  98 *   nla_put_u16(skb, type, value)      add u16 attribute to skb
  99 *   nla_put_u32(skb, type, value)      add u32 attribute to skb
 100 *   nla_put_u64(skb, type, value)      add u64 attribute to skb
 101 *   nla_put_string(skb, type, str)     add string attribute to skb
 102 *   nla_put_flag(skb, type)            add flag attribute to skb
 103 *   nla_put_msecs(skb, type, jiffies)  add msecs attribute to skb
 104 *
 105 * Exceptions Based Attribute Construction:
 106 *   NLA_PUT(skb, type, len, data)      add attribute to skb
 107 *   NLA_PUT_U8(skb, type, value)       add u8 attribute to skb
 108 *   NLA_PUT_U16(skb, type, value)      add u16 attribute to skb
 109 *   NLA_PUT_U32(skb, type, value)      add u32 attribute to skb
 110 *   NLA_PUT_U64(skb, type, value)      add u64 attribute to skb
 111 *   NLA_PUT_STRING(skb, type, str)     add string attribute to skb
 112 *   NLA_PUT_FLAG(skb, type)            add flag attribute to skb
 113 *   NLA_PUT_MSECS(skb, type, jiffies)  add msecs attribute to skb
 114 *
 115 *   The meaning of these functions is equal to their lower case
 116 *   variants but they jump to the label nla_put_failure in case
 117 *   of a failure.
 118 *
 119 * Nested Attributes Construction:
 120 *   nla_nest_start(skb, type)          start a nested attribute
 121 *   nla_nest_end(skb, nla)             finalize a nested attribute
 122 *   nla_nest_cancel(skb, nla)          cancel nested attribute construction
 123 *
 124 * Attribute Length Calculations:
 125 *   nla_attr_size(payload)             length of attribute w/o padding
 126 *   nla_total_size(payload)            length of attribute w/ padding
 127 *   nla_padlen(payload)                length of padding
 128 *
 129 * Attribute Payload Access:
 130 *   nla_data(nla)                      head of attribute payload
 131 *   nla_len(nla)                       length of attribute payload
 132 *
 133 * Attribute Payload Access for Basic Types:
 134 *   nla_get_u8(nla)                    get payload for a u8 attribute
 135 *   nla_get_u16(nla)                   get payload for a u16 attribute
 136 *   nla_get_u32(nla)                   get payload for a u32 attribute
 137 *   nla_get_u64(nla)                   get payload for a u64 attribute
 138 *   nla_get_flag(nla)                  return 1 if flag is true
 139 *   nla_get_msecs(nla)                 get payload for a msecs attribute
 140 *
 141 * Attribute Misc:
 142 *   nla_memcpy(dest, nla, count)       copy attribute into memory
 143 *   nla_memcmp(nla, data, size)        compare attribute with memory area
 144 *   nla_strlcpy(dst, nla, size)        copy attribute to a sized string
 145 *   nla_strcmp(nla, str)               compare attribute with string
 146 *
 147 * Attribute Parsing:
 148 *   nla_ok(nla, remaining)             does nla fit into remaining bytes?
 149 *   nla_next(nla, remaining)           get next netlink attribute
 150 *   nla_validate()                     validate a stream of attributes
 151 *   nla_validate_nested()              validate a stream of nested attributes
 152 *   nla_find()                         find attribute in stream of attributes
 153 *   nla_find_nested()                  find attribute in nested attributes
 154 *   nla_parse()                        parse and validate stream of attrs
 155 *   nla_parse_nested()                 parse nested attribuets
 156 *   nla_for_each_attr()                loop over all attributes
 157 *   nla_for_each_nested()              loop over the nested attributes
 158 *=========================================================================
 159 */
 160
 161 /**
 162  * Standard attribute types to specify validation policy
 163  */
 164enum {
 165        NLA_UNSPEC,
 166        NLA_U8,
 167        NLA_U16,
 168        NLA_U32,
 169        NLA_U64,
 170        NLA_STRING,
 171        NLA_FLAG,
 172        NLA_MSECS,
 173        NLA_NESTED,
 174        NLA_NESTED_COMPAT,
 175        NLA_NUL_STRING,
 176        NLA_BINARY,
 177        __NLA_TYPE_MAX,
 178};
 179
 180#define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1)
 181
 182/**
 183 * struct nla_policy - attribute validation policy
 184 * @type: Type of attribute or NLA_UNSPEC
 185 * @len: Type specific length of payload
 186 *
 187 * Policies are defined as arrays of this struct, the array must be
 188 * accessible by attribute type up to the highest identifier to be expected.
 189 *
 190 * Meaning of `len' field:
 191 *    NLA_STRING           Maximum length of string
 192 *    NLA_NUL_STRING       Maximum length of string (excluding NUL)
 193 *    NLA_FLAG             Unused
 194 *    NLA_BINARY           Maximum length of attribute payload
 195 *    NLA_NESTED           Don't use `len' field -- length verification is
 196 *                         done by checking len of nested header (or empty)
 197 *    NLA_NESTED_COMPAT    Minimum length of structure payload
 198 *    NLA_U8, NLA_U16,
 199 *    NLA_U32, NLA_U64,
 200 *    NLA_MSECS            Leaving the length field zero will verify the
 201 *                         given type fits, using it verifies minimum length
 202 *                         just like "All other"
 203 *    All other            Minimum length of attribute payload
 204 *
 205 * Example:
 206 * static const struct nla_policy my_policy[ATTR_MAX+1] = {
 207 *      [ATTR_FOO] = { .type = NLA_U16 },
 208 *      [ATTR_BAR] = { .type = NLA_STRING, .len = BARSIZ },
 209 *      [ATTR_BAZ] = { .len = sizeof(struct mystruct) },
 210 * };
 211 */
 212struct nla_policy {
 213        u16             type;
 214        u16             len;
 215};
 216
 217/**
 218 * struct nl_info - netlink source information
 219 * @nlh: Netlink message header of original request
 220 * @pid: Netlink PID of requesting application
 221 */
 222struct nl_info {
 223        struct nlmsghdr         *nlh;
 224        struct net              *nl_net;
 225        u32                     pid;
 226};
 227
 228extern int              netlink_rcv_skb(struct sk_buff *skb,
 229                                        int (*cb)(struct sk_buff *,
 230                                                  struct nlmsghdr *));
 231extern int              nlmsg_notify(struct sock *sk, struct sk_buff *skb,
 232                                     u32 pid, unsigned int group, int report,
 233                                     gfp_t flags);
 234
 235extern int              nla_validate(const struct nlattr *head,
 236                                     int len, int maxtype,
 237                                     const struct nla_policy *policy);
 238extern int              nla_parse(struct nlattr **tb, int maxtype,
 239                                  const struct nlattr *head, int len,
 240                                  const struct nla_policy *policy);
 241extern int              nla_policy_len(const struct nla_policy *, int);
 242extern struct nlattr *  nla_find(const struct nlattr *head,
 243                                 int len, int attrtype);
 244extern size_t           nla_strlcpy(char *dst, const struct nlattr *nla,
 245                                    size_t dstsize);
 246extern int              nla_memcpy(void *dest, const struct nlattr *src, int count);
 247extern int              nla_memcmp(const struct nlattr *nla, const void *data,
 248                                   size_t size);
 249extern int              nla_strcmp(const struct nlattr *nla, const char *str);
 250extern struct nlattr *  __nla_reserve(struct sk_buff *skb, int attrtype,
 251                                      int attrlen);
 252extern void *           __nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 253extern struct nlattr *  nla_reserve(struct sk_buff *skb, int attrtype,
 254                                    int attrlen);
 255extern void *           nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 256extern void             __nla_put(struct sk_buff *skb, int attrtype,
 257                                  int attrlen, const void *data);
 258extern void             __nla_put_nohdr(struct sk_buff *skb, int attrlen,
 259                                        const void *data);
 260extern int              nla_put(struct sk_buff *skb, int attrtype,
 261                                int attrlen, const void *data);
 262extern int              nla_put_nohdr(struct sk_buff *skb, int attrlen,
 263                                      const void *data);
 264extern int              nla_append(struct sk_buff *skb, int attrlen,
 265                                   const void *data);
 266
 267/**************************************************************************
 268 * Netlink Messages
 269 **************************************************************************/
 270
 271/**
 272 * nlmsg_msg_size - length of netlink message not including padding
 273 * @payload: length of message payload
 274 */
 275static inline int nlmsg_msg_size(int payload)
 276{
 277        return NLMSG_HDRLEN + payload;
 278}
 279
 280/**
 281 * nlmsg_total_size - length of netlink message including padding
 282 * @payload: length of message payload
 283 */
 284static inline int nlmsg_total_size(int payload)
 285{
 286        return NLMSG_ALIGN(nlmsg_msg_size(payload));
 287}
 288
 289/**
 290 * nlmsg_padlen - length of padding at the message's tail
 291 * @payload: length of message payload
 292 */
 293static inline int nlmsg_padlen(int payload)
 294{
 295        return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
 296}
 297
 298/**
 299 * nlmsg_data - head of message payload
 300 * @nlh: netlink message header
 301 */
 302static inline void *nlmsg_data(const struct nlmsghdr *nlh)
 303{
 304        return (unsigned char *) nlh + NLMSG_HDRLEN;
 305}
 306
 307/**
 308 * nlmsg_len - length of message payload
 309 * @nlh: netlink message header
 310 */
 311static inline int nlmsg_len(const struct nlmsghdr *nlh)
 312{
 313        return nlh->nlmsg_len - NLMSG_HDRLEN;
 314}
 315
 316/**
 317 * nlmsg_attrdata - head of attributes data
 318 * @nlh: netlink message header
 319 * @hdrlen: length of family specific header
 320 */
 321static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh,
 322                                            int hdrlen)
 323{
 324        unsigned char *data = nlmsg_data(nlh);
 325        return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
 326}
 327
 328/**
 329 * nlmsg_attrlen - length of attributes data
 330 * @nlh: netlink message header
 331 * @hdrlen: length of family specific header
 332 */
 333static inline int nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen)
 334{
 335        return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
 336}
 337
 338/**
 339 * nlmsg_ok - check if the netlink message fits into the remaining bytes
 340 * @nlh: netlink message header
 341 * @remaining: number of bytes remaining in message stream
 342 */
 343static inline int nlmsg_ok(const struct nlmsghdr *nlh, int remaining)
 344{
 345        return (remaining >= (int) sizeof(struct nlmsghdr) &&
 346                nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
 347                nlh->nlmsg_len <= remaining);
 348}
 349
 350/**
 351 * nlmsg_next - next netlink message in message stream
 352 * @nlh: netlink message header
 353 * @remaining: number of bytes remaining in message stream
 354 *
 355 * Returns the next netlink message in the message stream and
 356 * decrements remaining by the size of the current message.
 357 */
 358static inline struct nlmsghdr *
 359nlmsg_next(const struct nlmsghdr *nlh, int *remaining)
 360{
 361        int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
 362
 363        *remaining -= totlen;
 364
 365        return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
 366}
 367
 368/**
 369 * nlmsg_parse - parse attributes of a netlink message
 370 * @nlh: netlink message header
 371 * @hdrlen: length of family specific header
 372 * @tb: destination array with maxtype+1 elements
 373 * @maxtype: maximum attribute type to be expected
 374 * @policy: validation policy
 375 *
 376 * See nla_parse()
 377 */
 378static inline int nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
 379                              struct nlattr *tb[], int maxtype,
 380                              const struct nla_policy *policy)
 381{
 382        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 383                return -EINVAL;
 384
 385        return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
 386                         nlmsg_attrlen(nlh, hdrlen), policy);
 387}
 388
 389/**
 390 * nlmsg_find_attr - find a specific attribute in a netlink message
 391 * @nlh: netlink message header
 392 * @hdrlen: length of familiy specific header
 393 * @attrtype: type of attribute to look for
 394 *
 395 * Returns the first attribute which matches the specified type.
 396 */
 397static inline struct nlattr *nlmsg_find_attr(const struct nlmsghdr *nlh,
 398                                             int hdrlen, int attrtype)
 399{
 400        return nla_find(nlmsg_attrdata(nlh, hdrlen),
 401                        nlmsg_attrlen(nlh, hdrlen), attrtype);
 402}
 403
 404/**
 405 * nlmsg_validate - validate a netlink message including attributes
 406 * @nlh: netlinket message header
 407 * @hdrlen: length of familiy specific header
 408 * @maxtype: maximum attribute type to be expected
 409 * @policy: validation policy
 410 */
 411static inline int nlmsg_validate(const struct nlmsghdr *nlh,
 412                                 int hdrlen, int maxtype,
 413                                 const struct nla_policy *policy)
 414{
 415        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 416                return -EINVAL;
 417
 418        return nla_validate(nlmsg_attrdata(nlh, hdrlen),
 419                            nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
 420}
 421
 422/**
 423 * nlmsg_report - need to report back to application?
 424 * @nlh: netlink message header
 425 *
 426 * Returns 1 if a report back to the application is requested.
 427 */
 428static inline int nlmsg_report(const struct nlmsghdr *nlh)
 429{
 430        return !!(nlh->nlmsg_flags & NLM_F_ECHO);
 431}
 432
 433/**
 434 * nlmsg_for_each_attr - iterate over a stream of attributes
 435 * @pos: loop counter, set to current attribute
 436 * @nlh: netlink message header
 437 * @hdrlen: length of familiy specific header
 438 * @rem: initialized to len, holds bytes currently remaining in stream
 439 */
 440#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
 441        nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
 442                          nlmsg_attrlen(nlh, hdrlen), rem)
 443
 444#if 0
 445/* FIXME: Enable once all users have been converted */
 446
 447/**
 448 * __nlmsg_put - Add a new netlink message to an skb
 449 * @skb: socket buffer to store message in
 450 * @pid: netlink process id
 451 * @seq: sequence number of message
 452 * @type: message type
 453 * @payload: length of message payload
 454 * @flags: message flags
 455 *
 456 * The caller is responsible to ensure that the skb provides enough
 457 * tailroom for both the netlink header and payload.
 458 */
 459static inline struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid,
 460                                           u32 seq, int type, int payload,
 461                                           int flags)
 462{
 463        struct nlmsghdr *nlh;
 464
 465        nlh = (struct nlmsghdr *) skb_put(skb, nlmsg_total_size(payload));
 466        nlh->nlmsg_type = type;
 467        nlh->nlmsg_len = nlmsg_msg_size(payload);
 468        nlh->nlmsg_flags = flags;
 469        nlh->nlmsg_pid = pid;
 470        nlh->nlmsg_seq = seq;
 471
 472        memset((unsigned char *) nlmsg_data(nlh) + payload, 0,
 473               nlmsg_padlen(payload));
 474
 475        return nlh;
 476}
 477#endif
 478
 479/**
 480 * nlmsg_put - Add a new netlink message to an skb
 481 * @skb: socket buffer to store message in
 482 * @pid: netlink process id
 483 * @seq: sequence number of message
 484 * @type: message type
 485 * @payload: length of message payload
 486 * @flags: message flags
 487 *
 488 * Returns NULL if the tailroom of the skb is insufficient to store
 489 * the message header and payload.
 490 */
 491static inline struct nlmsghdr *nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
 492                                         int type, int payload, int flags)
 493{
 494        if (unlikely(skb_tailroom(skb) < nlmsg_total_size(payload)))
 495                return NULL;
 496
 497        return __nlmsg_put(skb, pid, seq, type, payload, flags);
 498}
 499
 500/**
 501 * nlmsg_put_answer - Add a new callback based netlink message to an skb
 502 * @skb: socket buffer to store message in
 503 * @cb: netlink callback
 504 * @type: message type
 505 * @payload: length of message payload
 506 * @flags: message flags
 507 *
 508 * Returns NULL if the tailroom of the skb is insufficient to store
 509 * the message header and payload.
 510 */
 511static inline struct nlmsghdr *nlmsg_put_answer(struct sk_buff *skb,
 512                                                struct netlink_callback *cb,
 513                                                int type, int payload,
 514                                                int flags)
 515{
 516        return nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq,
 517                         type, payload, flags);
 518}
 519
 520/**
 521 * nlmsg_new - Allocate a new netlink message
 522 * @payload: size of the message payload
 523 * @flags: the type of memory to allocate.
 524 *
 525 * Use NLMSG_DEFAULT_SIZE if the size of the payload isn't known
 526 * and a good default is needed.
 527 */
 528static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags)
 529{
 530        return alloc_skb(nlmsg_total_size(payload), flags);
 531}
 532
 533/**
 534 * nlmsg_end - Finalize a netlink message
 535 * @skb: socket buffer the message is stored in
 536 * @nlh: netlink message header
 537 *
 538 * Corrects the netlink message header to include the appeneded
 539 * attributes. Only necessary if attributes have been added to
 540 * the message.
 541 *
 542 * Returns the total data length of the skb.
 543 */
 544static inline int nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh)
 545{
 546        nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh;
 547
 548        return skb->len;
 549}
 550
 551/**
 552 * nlmsg_get_pos - return current position in netlink message
 553 * @skb: socket buffer the message is stored in
 554 *
 555 * Returns a pointer to the current tail of the message.
 556 */
 557static inline void *nlmsg_get_pos(struct sk_buff *skb)
 558{
 559        return skb_tail_pointer(skb);
 560}
 561
 562/**
 563 * nlmsg_trim - Trim message to a mark
 564 * @skb: socket buffer the message is stored in
 565 * @mark: mark to trim to
 566 *
 567 * Trims the message to the provided mark.
 568 */
 569static inline void nlmsg_trim(struct sk_buff *skb, const void *mark)
 570{
 571        if (mark)
 572                skb_trim(skb, (unsigned char *) mark - skb->data);
 573}
 574
 575/**
 576 * nlmsg_cancel - Cancel construction of a netlink message
 577 * @skb: socket buffer the message is stored in
 578 * @nlh: netlink message header
 579 *
 580 * Removes the complete netlink message including all
 581 * attributes from the socket buffer again.
 582 */
 583static inline void nlmsg_cancel(struct sk_buff *skb, struct nlmsghdr *nlh)
 584{
 585        nlmsg_trim(skb, nlh);
 586}
 587
 588/**
 589 * nlmsg_free - free a netlink message
 590 * @skb: socket buffer of netlink message
 591 */
 592static inline void nlmsg_free(struct sk_buff *skb)
 593{
 594        kfree_skb(skb);
 595}
 596
 597/**
 598 * nlmsg_multicast - multicast a netlink message
 599 * @sk: netlink socket to spread messages to
 600 * @skb: netlink message as socket buffer
 601 * @pid: own netlink pid to avoid sending to yourself
 602 * @group: multicast group id
 603 * @flags: allocation flags
 604 */
 605static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb,
 606                                  u32 pid, unsigned int group, gfp_t flags)
 607{
 608        int err;
 609
 610        NETLINK_CB(skb).dst_group = group;
 611
 612        err = netlink_broadcast(sk, skb, pid, group, flags);
 613        if (err > 0)
 614                err = 0;
 615
 616        return err;
 617}
 618
 619/**
 620 * nlmsg_unicast - unicast a netlink message
 621 * @sk: netlink socket to spread message to
 622 * @skb: netlink message as socket buffer
 623 * @pid: netlink pid of the destination socket
 624 */
 625static inline int nlmsg_unicast(struct sock *sk, struct sk_buff *skb, u32 pid)
 626{
 627        int err;
 628
 629        err = netlink_unicast(sk, skb, pid, MSG_DONTWAIT);
 630        if (err > 0)
 631                err = 0;
 632
 633        return err;
 634}
 635
 636/**
 637 * nlmsg_for_each_msg - iterate over a stream of messages
 638 * @pos: loop counter, set to current message
 639 * @head: head of message stream
 640 * @len: length of message stream
 641 * @rem: initialized to len, holds bytes currently remaining in stream
 642 */
 643#define nlmsg_for_each_msg(pos, head, len, rem) \
 644        for (pos = head, rem = len; \
 645             nlmsg_ok(pos, rem); \
 646             pos = nlmsg_next(pos, &(rem)))
 647
 648/**
 649 * nl_dump_check_consistent - check if sequence is consistent and advertise if not
 650 * @cb: netlink callback structure that stores the sequence number
 651 * @nlh: netlink message header to write the flag to
 652 *
 653 * This function checks if the sequence (generation) number changed during dump
 654 * and if it did, advertises it in the netlink message header.
 655 *
 656 * The correct way to use it is to set cb->seq to the generation counter when
 657 * all locks for dumping have been acquired, and then call this function for
 658 * each message that is generated.
 659 *
 660 * Note that due to initialisation concerns, 0 is an invalid sequence number
 661 * and must not be used by code that uses this functionality.
 662 */
 663static inline void
 664nl_dump_check_consistent(struct netlink_callback *cb,
 665                         struct nlmsghdr *nlh)
 666{
 667        if (cb->prev_seq && cb->seq != cb->prev_seq)
 668                nlh->nlmsg_flags |= NLM_F_DUMP_INTR;
 669        cb->prev_seq = cb->seq;
 670}
 671
 672/**************************************************************************
 673 * Netlink Attributes
 674 **************************************************************************/
 675
 676/**
 677 * nla_attr_size - length of attribute not including padding
 678 * @payload: length of payload
 679 */
 680static inline int nla_attr_size(int payload)
 681{
 682        return NLA_HDRLEN + payload;
 683}
 684
 685/**
 686 * nla_total_size - total length of attribute including padding
 687 * @payload: length of payload
 688 */
 689static inline int nla_total_size(int payload)
 690{
 691        return NLA_ALIGN(nla_attr_size(payload));
 692}
 693
 694/**
 695 * nla_padlen - length of padding at the tail of attribute
 696 * @payload: length of payload
 697 */
 698static inline int nla_padlen(int payload)
 699{
 700        return nla_total_size(payload) - nla_attr_size(payload);
 701}
 702
 703/**
 704 * nla_type - attribute type
 705 * @nla: netlink attribute
 706 */
 707static inline int nla_type(const struct nlattr *nla)
 708{
 709        return nla->nla_type & NLA_TYPE_MASK;
 710}
 711
 712/**
 713 * nla_data - head of payload
 714 * @nla: netlink attribute
 715 */
 716static inline void *nla_data(const struct nlattr *nla)
 717{
 718        return (char *) nla + NLA_HDRLEN;
 719}
 720
 721/**
 722 * nla_len - length of payload
 723 * @nla: netlink attribute
 724 */
 725static inline int nla_len(const struct nlattr *nla)
 726{
 727        return nla->nla_len - NLA_HDRLEN;
 728}
 729
 730/**
 731 * nla_ok - check if the netlink attribute fits into the remaining bytes
 732 * @nla: netlink attribute
 733 * @remaining: number of bytes remaining in attribute stream
 734 */
 735static inline int nla_ok(const struct nlattr *nla, int remaining)
 736{
 737        return remaining >= (int) sizeof(*nla) &&
 738               nla->nla_len >= sizeof(*nla) &&
 739               nla->nla_len <= remaining;
 740}
 741
 742/**
 743 * nla_next - next netlink attribute in attribute stream
 744 * @nla: netlink attribute
 745 * @remaining: number of bytes remaining in attribute stream
 746 *
 747 * Returns the next netlink attribute in the attribute stream and
 748 * decrements remaining by the size of the current attribute.
 749 */
 750static inline struct nlattr *nla_next(const struct nlattr *nla, int *remaining)
 751{
 752        int totlen = NLA_ALIGN(nla->nla_len);
 753
 754        *remaining -= totlen;
 755        return (struct nlattr *) ((char *) nla + totlen);
 756}
 757
 758/**
 759 * nla_find_nested - find attribute in a set of nested attributes
 760 * @nla: attribute containing the nested attributes
 761 * @attrtype: type of attribute to look for
 762 *
 763 * Returns the first attribute which matches the specified type.
 764 */
 765static inline struct nlattr *
 766nla_find_nested(const struct nlattr *nla, int attrtype)
 767{
 768        return nla_find(nla_data(nla), nla_len(nla), attrtype);
 769}
 770
 771/**
 772 * nla_parse_nested - parse nested attributes
 773 * @tb: destination array with maxtype+1 elements
 774 * @maxtype: maximum attribute type to be expected
 775 * @nla: attribute containing the nested attributes
 776 * @policy: validation policy
 777 *
 778 * See nla_parse()
 779 */
 780static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
 781                                   const struct nlattr *nla,
 782                                   const struct nla_policy *policy)
 783{
 784        return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy);
 785}
 786
 787/**
 788 * nla_put_u8 - Add a u8 netlink attribute to a socket buffer
 789 * @skb: socket buffer to add attribute to
 790 * @attrtype: attribute type
 791 * @value: numeric value
 792 */
 793static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
 794{
 795        return nla_put(skb, attrtype, sizeof(u8), &value);
 796}
 797
 798/**
 799 * nla_put_u16 - Add a u16 netlink attribute to a socket buffer
 800 * @skb: socket buffer to add attribute to
 801 * @attrtype: attribute type
 802 * @value: numeric value
 803 */
 804static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
 805{
 806        return nla_put(skb, attrtype, sizeof(u16), &value);
 807}
 808
 809/**
 810 * nla_put_u32 - Add a u32 netlink attribute to a socket buffer
 811 * @skb: socket buffer to add attribute to
 812 * @attrtype: attribute type
 813 * @value: numeric value
 814 */
 815static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
 816{
 817        return nla_put(skb, attrtype, sizeof(u32), &value);
 818}
 819
 820/**
 821 * nla_put_64 - Add a u64 netlink attribute to a socket buffer
 822 * @skb: socket buffer to add attribute to
 823 * @attrtype: attribute type
 824 * @value: numeric value
 825 */
 826static inline int nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
 827{
 828        return nla_put(skb, attrtype, sizeof(u64), &value);
 829}
 830
 831/**
 832 * nla_put_string - Add a string netlink attribute to a socket buffer
 833 * @skb: socket buffer to add attribute to
 834 * @attrtype: attribute type
 835 * @str: NUL terminated string
 836 */
 837static inline int nla_put_string(struct sk_buff *skb, int attrtype,
 838                                 const char *str)
 839{
 840        return nla_put(skb, attrtype, strlen(str) + 1, str);
 841}
 842
 843/**
 844 * nla_put_flag - Add a flag netlink attribute to a socket buffer
 845 * @skb: socket buffer to add attribute to
 846 * @attrtype: attribute type
 847 */
 848static inline int nla_put_flag(struct sk_buff *skb, int attrtype)
 849{
 850        return nla_put(skb, attrtype, 0, NULL);
 851}
 852
 853/**
 854 * nla_put_msecs - Add a msecs netlink attribute to a socket buffer
 855 * @skb: socket buffer to add attribute to
 856 * @attrtype: attribute type
 857 * @jiffies: number of msecs in jiffies
 858 */
 859static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
 860                                unsigned long jiffies)
 861{
 862        u64 tmp = jiffies_to_msecs(jiffies);
 863        return nla_put(skb, attrtype, sizeof(u64), &tmp);
 864}
 865
 866#define NLA_PUT(skb, attrtype, attrlen, data) \
 867        do { \
 868                if (unlikely(nla_put(skb, attrtype, attrlen, data) < 0)) \
 869                        goto nla_put_failure; \
 870        } while(0)
 871
 872#define NLA_PUT_TYPE(skb, type, attrtype, value) \
 873        do { \
 874                type __tmp = value; \
 875                NLA_PUT(skb, attrtype, sizeof(type), &__tmp); \
 876        } while(0)
 877
 878#define NLA_PUT_U8(skb, attrtype, value) \
 879        NLA_PUT_TYPE(skb, u8, attrtype, value)
 880
 881#define NLA_PUT_U16(skb, attrtype, value) \
 882        NLA_PUT_TYPE(skb, u16, attrtype, value)
 883
 884#define NLA_PUT_LE16(skb, attrtype, value) \
 885        NLA_PUT_TYPE(skb, __le16, attrtype, value)
 886
 887#define NLA_PUT_BE16(skb, attrtype, value) \
 888        NLA_PUT_TYPE(skb, __be16, attrtype, value)
 889
 890#define NLA_PUT_NET16(skb, attrtype, value) \
 891        NLA_PUT_BE16(skb, attrtype | NLA_F_NET_BYTEORDER, value)
 892
 893#define NLA_PUT_U32(skb, attrtype, value) \
 894        NLA_PUT_TYPE(skb, u32, attrtype, value)
 895
 896#define NLA_PUT_BE32(skb, attrtype, value) \
 897        NLA_PUT_TYPE(skb, __be32, attrtype, value)
 898
 899#define NLA_PUT_NET32(skb, attrtype, value) \
 900        NLA_PUT_BE32(skb, attrtype | NLA_F_NET_BYTEORDER, value)
 901
 902#define NLA_PUT_U64(skb, attrtype, value) \
 903        NLA_PUT_TYPE(skb, u64, attrtype, value)
 904
 905#define NLA_PUT_BE64(skb, attrtype, value) \
 906        NLA_PUT_TYPE(skb, __be64, attrtype, value)
 907
 908#define NLA_PUT_NET64(skb, attrtype, value) \
 909        NLA_PUT_BE64(skb, attrtype | NLA_F_NET_BYTEORDER, value)
 910
 911#define NLA_PUT_STRING(skb, attrtype, value) \
 912        NLA_PUT(skb, attrtype, strlen(value) + 1, value)
 913
 914#define NLA_PUT_FLAG(skb, attrtype) \
 915        NLA_PUT(skb, attrtype, 0, NULL)
 916
 917#define NLA_PUT_MSECS(skb, attrtype, jiffies) \
 918        NLA_PUT_U64(skb, attrtype, jiffies_to_msecs(jiffies))
 919
 920/**
 921 * nla_get_u32 - return payload of u32 attribute
 922 * @nla: u32 netlink attribute
 923 */
 924static inline u32 nla_get_u32(const struct nlattr *nla)
 925{
 926        return *(u32 *) nla_data(nla);
 927}
 928
 929/**
 930 * nla_get_be32 - return payload of __be32 attribute
 931 * @nla: __be32 netlink attribute
 932 */
 933static inline __be32 nla_get_be32(const struct nlattr *nla)
 934{
 935        return *(__be32 *) nla_data(nla);
 936}
 937
 938/**
 939 * nla_get_u16 - return payload of u16 attribute
 940 * @nla: u16 netlink attribute
 941 */
 942static inline u16 nla_get_u16(const struct nlattr *nla)
 943{
 944        return *(u16 *) nla_data(nla);
 945}
 946
 947/**
 948 * nla_get_be16 - return payload of __be16 attribute
 949 * @nla: __be16 netlink attribute
 950 */
 951static inline __be16 nla_get_be16(const struct nlattr *nla)
 952{
 953        return *(__be16 *) nla_data(nla);
 954}
 955
 956/**
 957 * nla_get_le16 - return payload of __le16 attribute
 958 * @nla: __le16 netlink attribute
 959 */
 960static inline __le16 nla_get_le16(const struct nlattr *nla)
 961{
 962        return *(__le16 *) nla_data(nla);
 963}
 964
 965/**
 966 * nla_get_u8 - return payload of u8 attribute
 967 * @nla: u8 netlink attribute
 968 */
 969static inline u8 nla_get_u8(const struct nlattr *nla)
 970{
 971        return *(u8 *) nla_data(nla);
 972}
 973
 974/**
 975 * nla_get_u64 - return payload of u64 attribute
 976 * @nla: u64 netlink attribute
 977 */
 978static inline u64 nla_get_u64(const struct nlattr *nla)
 979{
 980        u64 tmp;
 981
 982        nla_memcpy(&tmp, nla, sizeof(tmp));
 983
 984        return tmp;
 985}
 986
 987/**
 988 * nla_get_be64 - return payload of __be64 attribute
 989 * @nla: __be64 netlink attribute
 990 */
 991static inline __be64 nla_get_be64(const struct nlattr *nla)
 992{
 993        __be64 tmp;
 994
 995        nla_memcpy(&tmp, nla, sizeof(tmp));
 996
 997        return tmp;
 998}
 999
1000/**
1001 * nla_get_flag - return payload of flag attribute
1002 * @nla: flag netlink attribute
1003 */
1004static inline int nla_get_flag(const struct nlattr *nla)
1005{
1006        return !!nla;
1007}
1008
1009/**
1010 * nla_get_msecs - return payload of msecs attribute
1011 * @nla: msecs netlink attribute
1012 *
1013 * Returns the number of milliseconds in jiffies.
1014 */
1015static inline unsigned long nla_get_msecs(const struct nlattr *nla)
1016{
1017        u64 msecs = nla_get_u64(nla);
1018
1019        return msecs_to_jiffies((unsigned long) msecs);
1020}
1021
1022/**
1023 * nla_nest_start - Start a new level of nested attributes
1024 * @skb: socket buffer to add attributes to
1025 * @attrtype: attribute type of container
1026 *
1027 * Returns the container attribute
1028 */
1029static inline struct nlattr *nla_nest_start(struct sk_buff *skb, int attrtype)
1030{
1031        struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
1032
1033        if (nla_put(skb, attrtype, 0, NULL) < 0)
1034                return NULL;
1035
1036        return start;
1037}
1038
1039/**
1040 * nla_nest_end - Finalize nesting of attributes
1041 * @skb: socket buffer the attributes are stored in
1042 * @start: container attribute
1043 *
1044 * Corrects the container attribute header to include the all
1045 * appeneded attributes.
1046 *
1047 * Returns the total data length of the skb.
1048 */
1049static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
1050{
1051        start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
1052        return skb->len;
1053}
1054
1055/**
1056 * nla_nest_cancel - Cancel nesting of attributes
1057 * @skb: socket buffer the message is stored in
1058 * @start: container attribute
1059 *
1060 * Removes the container attribute and including all nested
1061 * attributes. Returns -EMSGSIZE
1062 */
1063static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start)
1064{
1065        nlmsg_trim(skb, start);
1066}
1067
1068/**
1069 * nla_validate_nested - Validate a stream of nested attributes
1070 * @start: container attribute
1071 * @maxtype: maximum attribute type to be expected
1072 * @policy: validation policy
1073 *
1074 * Validates all attributes in the nested attribute stream against the
1075 * specified policy. Attributes with a type exceeding maxtype will be
1076 * ignored. See documenation of struct nla_policy for more details.
1077 *
1078 * Returns 0 on success or a negative error code.
1079 */
1080static inline int nla_validate_nested(const struct nlattr *start, int maxtype,
1081                                      const struct nla_policy *policy)
1082{
1083        return nla_validate(nla_data(start), nla_len(start), maxtype, policy);
1084}
1085
1086/**
1087 * nla_for_each_attr - iterate over a stream of attributes
1088 * @pos: loop counter, set to current attribute
1089 * @head: head of attribute stream
1090 * @len: length of attribute stream
1091 * @rem: initialized to len, holds bytes currently remaining in stream
1092 */
1093#define nla_for_each_attr(pos, head, len, rem) \
1094        for (pos = head, rem = len; \
1095             nla_ok(pos, rem); \
1096             pos = nla_next(pos, &(rem)))
1097
1098/**
1099 * nla_for_each_nested - iterate over nested attributes
1100 * @pos: loop counter, set to current attribute
1101 * @nla: attribute containing the nested attributes
1102 * @rem: initialized to len, holds bytes currently remaining in stream
1103 */
1104#define nla_for_each_nested(pos, nla, rem) \
1105        nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem)
1106
1107#endif
1108
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.