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#include <linux/in6.h>
   8
   9/* ========================================================================
  10 *         Netlink Messages and Attributes Interface (As Seen On TV)
  11 * ------------------------------------------------------------------------
  12 *                          Messages Interface
  13 * ------------------------------------------------------------------------
  14 *
  15 * Message Format:
  16 *    <--- nlmsg_total_size(payload)  --->
  17 *    <-- nlmsg_msg_size(payload) ->
  18 *   +----------+- - -+-------------+- - -+-------- - -
  19 *   | nlmsghdr | Pad |   Payload   | Pad | nlmsghdr
  20 *   +----------+- - -+-------------+- - -+-------- - -
  21 *   nlmsg_data(nlh)---^                   ^
  22 *   nlmsg_next(nlh)-----------------------+
  23 *
  24 * Payload Format:
  25 *    <---------------------- nlmsg_len(nlh) --------------------->
  26 *    <------ hdrlen ------>       <- nlmsg_attrlen(nlh, hdrlen) ->
  27 *   +----------------------+- - -+--------------------------------+
  28 *   |     Family Header    | Pad |           Attributes           |
  29 *   +----------------------+- - -+--------------------------------+
  30 *   nlmsg_attrdata(nlh, hdrlen)---^
  31 *
  32 * Data Structures:
  33 *   struct nlmsghdr                    netlink message header
  34 *
  35 * Message Construction:
  36 *   nlmsg_new()                        create a new netlink message
  37 *   nlmsg_put()                        add a netlink message to an skb
  38 *   nlmsg_put_answer()                 callback based nlmsg_put()
  39 *   nlmsg_end()                        finalize netlink message
  40 *   nlmsg_get_pos()                    return current position in message
  41 *   nlmsg_trim()                       trim part of message
  42 *   nlmsg_cancel()                     cancel message construction
  43 *   nlmsg_free()                       free a netlink message
  44 *
  45 * Message Sending:
  46 *   nlmsg_multicast()                  multicast message to several groups
  47 *   nlmsg_unicast()                    unicast a message to a single socket
  48 *   nlmsg_notify()                     send notification message
  49 *
  50 * Message Length Calculations:
  51 *   nlmsg_msg_size(payload)            length of message w/o padding
  52 *   nlmsg_total_size(payload)          length of message w/ padding
  53 *   nlmsg_padlen(payload)              length of padding at tail
  54 *
  55 * Message Payload Access:
  56 *   nlmsg_data(nlh)                    head of message payload
  57 *   nlmsg_len(nlh)                     length of message payload
  58 *   nlmsg_attrdata(nlh, hdrlen)        head of attributes data
  59 *   nlmsg_attrlen(nlh, hdrlen)         length of attributes data
  60 *
  61 * Message Parsing:
  62 *   nlmsg_ok(nlh, remaining)           does nlh fit into remaining bytes?
  63 *   nlmsg_next(nlh, remaining)         get next netlink message
  64 *   nlmsg_parse()                      parse attributes of a message
  65 *   nlmsg_find_attr()                  find an attribute in a message
  66 *   nlmsg_for_each_msg()               loop over all messages
  67 *   nlmsg_validate()                   validate netlink message incl. attrs
  68 *   nlmsg_for_each_attr()              loop over all attributes
  69 *
  70 * Misc:
  71 *   nlmsg_report()                     report back to application?
  72 *
  73 * ------------------------------------------------------------------------
  74 *                          Attributes Interface
  75 * ------------------------------------------------------------------------
  76 *
  77 * Attribute Format:
  78 *    <------- nla_total_size(payload) ------->
  79 *    <---- nla_attr_size(payload) ----->
  80 *   +----------+- - -+- - - - - - - - - +- - -+-------- - -
  81 *   |  Header  | Pad |     Payload      | Pad |  Header
  82 *   +----------+- - -+- - - - - - - - - +- - -+-------- - -
  83 *                     <- nla_len(nla) ->      ^
  84 *   nla_data(nla)----^                        |
  85 *   nla_next(nla)-----------------------------'
  86 *
  87 * Data Structures:
  88 *   struct nlattr                      netlink attribute header
  89 *
  90 * Attribute Construction:
  91 *   nla_reserve(skb, type, len)        reserve room for an attribute
  92 *   nla_reserve_nohdr(skb, len)        reserve room for an attribute w/o hdr
  93 *   nla_put(skb, type, len, data)      add attribute to skb
  94 *   nla_put_nohdr(skb, len, data)      add attribute w/o hdr
  95 *   nla_append(skb, len, data)         append data to skb
  96 *
  97 * Attribute Construction for Basic Types:
  98 *   nla_put_u8(skb, type, value)       add u8 attribute to skb
  99 *   nla_put_u16(skb, type, value)      add u16 attribute to skb
 100 *   nla_put_u32(skb, type, value)      add u32 attribute to skb
 101 *   nla_put_u64_64bit(skb, type,
 102 *                     value, padattr)  add u64 attribute to skb
 103 *   nla_put_s8(skb, type, value)       add s8 attribute to skb
 104 *   nla_put_s16(skb, type, value)      add s16 attribute to skb
 105 *   nla_put_s32(skb, type, value)      add s32 attribute to skb
 106 *   nla_put_s64(skb, type, value,
 107 *               padattr)               add s64 attribute to skb
 108 *   nla_put_string(skb, type, str)     add string attribute to skb
 109 *   nla_put_flag(skb, type)            add flag attribute to skb
 110 *   nla_put_msecs(skb, type, jiffies,
 111 *                 padattr)             add msecs attribute to skb
 112 *   nla_put_in_addr(skb, type, addr)   add IPv4 address attribute to skb
 113 *   nla_put_in6_addr(skb, type, addr)  add IPv6 address attribute to skb
 114 *
 115 * Nested Attributes Construction:
 116 *   nla_nest_start(skb, type)          start a nested attribute
 117 *   nla_nest_end(skb, nla)             finalize a nested attribute
 118 *   nla_nest_cancel(skb, nla)          cancel nested attribute construction
 119 *
 120 * Attribute Length Calculations:
 121 *   nla_attr_size(payload)             length of attribute w/o padding
 122 *   nla_total_size(payload)            length of attribute w/ padding
 123 *   nla_padlen(payload)                length of padding
 124 *
 125 * Attribute Payload Access:
 126 *   nla_data(nla)                      head of attribute payload
 127 *   nla_len(nla)                       length of attribute payload
 128 *
 129 * Attribute Payload Access for Basic Types:
 130 *   nla_get_u8(nla)                    get payload for a u8 attribute
 131 *   nla_get_u16(nla)                   get payload for a u16 attribute
 132 *   nla_get_u32(nla)                   get payload for a u32 attribute
 133 *   nla_get_u64(nla)                   get payload for a u64 attribute
 134 *   nla_get_s8(nla)                    get payload for a s8 attribute
 135 *   nla_get_s16(nla)                   get payload for a s16 attribute
 136 *   nla_get_s32(nla)                   get payload for a s32 attribute
 137 *   nla_get_s64(nla)                   get payload for a s64 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_S8,
 178        NLA_S16,
 179        NLA_S32,
 180        NLA_S64,
 181        __NLA_TYPE_MAX,
 182};
 183
 184#define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1)
 185
 186/**
 187 * struct nla_policy - attribute validation policy
 188 * @type: Type of attribute or NLA_UNSPEC
 189 * @len: Type specific length of payload
 190 *
 191 * Policies are defined as arrays of this struct, the array must be
 192 * accessible by attribute type up to the highest identifier to be expected.
 193 *
 194 * Meaning of `len' field:
 195 *    NLA_STRING           Maximum length of string
 196 *    NLA_NUL_STRING       Maximum length of string (excluding NUL)
 197 *    NLA_FLAG             Unused
 198 *    NLA_BINARY           Maximum length of attribute payload
 199 *    NLA_NESTED           Don't use `len' field -- length verification is
 200 *                         done by checking len of nested header (or empty)
 201 *    NLA_NESTED_COMPAT    Minimum length of structure payload
 202 *    NLA_U8, NLA_U16,
 203 *    NLA_U32, NLA_U64,
 204 *    NLA_S8, NLA_S16,
 205 *    NLA_S32, NLA_S64,
 206 *    NLA_MSECS            Leaving the length field zero will verify the
 207 *                         given type fits, using it verifies minimum length
 208 *                         just like "All other"
 209 *    All other            Minimum length of attribute payload
 210 *
 211 * Example:
 212 * static const struct nla_policy my_policy[ATTR_MAX+1] = {
 213 *      [ATTR_FOO] = { .type = NLA_U16 },
 214 *      [ATTR_BAR] = { .type = NLA_STRING, .len = BARSIZ },
 215 *      [ATTR_BAZ] = { .len = sizeof(struct mystruct) },
 216 * };
 217 */
 218struct nla_policy {
 219        u16             type;
 220        u16             len;
 221};
 222
 223/**
 224 * struct nl_info - netlink source information
 225 * @nlh: Netlink message header of original request
 226 * @portid: Netlink PORTID of requesting application
 227 */
 228struct nl_info {
 229        struct nlmsghdr         *nlh;
 230        struct net              *nl_net;
 231        u32                     portid;
 232        bool                    skip_notify;
 233};
 234
 235int netlink_rcv_skb(struct sk_buff *skb,
 236                    int (*cb)(struct sk_buff *, struct nlmsghdr *,
 237                              struct netlink_ext_ack *));
 238int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,
 239                 unsigned int group, int report, gfp_t flags);
 240
 241int nla_validate(const struct nlattr *head, int len, int maxtype,
 242                 const struct nla_policy *policy,
 243                 struct netlink_ext_ack *extack);
 244int nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head,
 245              int len, const struct nla_policy *policy,
 246              struct netlink_ext_ack *extack);
 247int nla_policy_len(const struct nla_policy *, int);
 248struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype);
 249size_t nla_strlcpy(char *dst, const struct nlattr *nla, size_t dstsize);
 250int nla_memcpy(void *dest, const struct nlattr *src, int count);
 251int nla_memcmp(const struct nlattr *nla, const void *data, size_t size);
 252int nla_strcmp(const struct nlattr *nla, const char *str);
 253struct nlattr *__nla_reserve(struct sk_buff *skb, int attrtype, int attrlen);
 254struct nlattr *__nla_reserve_64bit(struct sk_buff *skb, int attrtype,
 255                                   int attrlen, int padattr);
 256void *__nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 257struct nlattr *nla_reserve(struct sk_buff *skb, int attrtype, int attrlen);
 258struct nlattr *nla_reserve_64bit(struct sk_buff *skb, int attrtype,
 259                                 int attrlen, int padattr);
 260void *nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 261void __nla_put(struct sk_buff *skb, int attrtype, int attrlen,
 262               const void *data);
 263void __nla_put_64bit(struct sk_buff *skb, int attrtype, int attrlen,
 264                     const void *data, int padattr);
 265void __nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data);
 266int nla_put(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
 267int nla_put_64bit(struct sk_buff *skb, int attrtype, int attrlen,
 268                  const void *data, int padattr);
 269int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data);
 270int nla_append(struct sk_buff *skb, int attrlen, const void *data);
 271
 272/**************************************************************************
 273 * Netlink Messages
 274 **************************************************************************/
 275
 276/**
 277 * nlmsg_msg_size - length of netlink message not including padding
 278 * @payload: length of message payload
 279 */
 280static inline int nlmsg_msg_size(int payload)
 281{
 282        return NLMSG_HDRLEN + payload;
 283}
 284
 285/**
 286 * nlmsg_total_size - length of netlink message including padding
 287 * @payload: length of message payload
 288 */
 289static inline int nlmsg_total_size(int payload)
 290{
 291        return NLMSG_ALIGN(nlmsg_msg_size(payload));
 292}
 293
 294/**
 295 * nlmsg_padlen - length of padding at the message's tail
 296 * @payload: length of message payload
 297 */
 298static inline int nlmsg_padlen(int payload)
 299{
 300        return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
 301}
 302
 303/**
 304 * nlmsg_data - head of message payload
 305 * @nlh: netlink message header
 306 */
 307static inline void *nlmsg_data(const struct nlmsghdr *nlh)
 308{
 309        return (unsigned char *) nlh + NLMSG_HDRLEN;
 310}
 311
 312/**
 313 * nlmsg_len - length of message payload
 314 * @nlh: netlink message header
 315 */
 316static inline int nlmsg_len(const struct nlmsghdr *nlh)
 317{
 318        return nlh->nlmsg_len - NLMSG_HDRLEN;
 319}
 320
 321/**
 322 * nlmsg_attrdata - head of attributes data
 323 * @nlh: netlink message header
 324 * @hdrlen: length of family specific header
 325 */
 326static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh,
 327                                            int hdrlen)
 328{
 329        unsigned char *data = nlmsg_data(nlh);
 330        return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
 331}
 332
 333/**
 334 * nlmsg_attrlen - length of attributes data
 335 * @nlh: netlink message header
 336 * @hdrlen: length of family specific header
 337 */
 338static inline int nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen)
 339{
 340        return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
 341}
 342
 343/**
 344 * nlmsg_ok - check if the netlink message fits into the remaining bytes
 345 * @nlh: netlink message header
 346 * @remaining: number of bytes remaining in message stream
 347 */
 348static inline int nlmsg_ok(const struct nlmsghdr *nlh, int remaining)
 349{
 350        return (remaining >= (int) sizeof(struct nlmsghdr) &&
 351                nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
 352                nlh->nlmsg_len <= remaining);
 353}
 354
 355/**
 356 * nlmsg_next - next netlink message in message stream
 357 * @nlh: netlink message header
 358 * @remaining: number of bytes remaining in message stream
 359 *
 360 * Returns the next netlink message in the message stream and
 361 * decrements remaining by the size of the current message.
 362 */
 363static inline struct nlmsghdr *
 364nlmsg_next(const struct nlmsghdr *nlh, int *remaining)
 365{
 366        int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
 367
 368        *remaining -= totlen;
 369
 370        return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
 371}
 372
 373/**
 374 * nlmsg_parse - parse attributes of a netlink message
 375 * @nlh: netlink message header
 376 * @hdrlen: length of family specific header
 377 * @tb: destination array with maxtype+1 elements
 378 * @maxtype: maximum attribute type to be expected
 379 * @policy: validation policy
 380 * @extack: extended ACK report struct
 381 *
 382 * See nla_parse()
 383 */
 384static inline int nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
 385                              struct nlattr *tb[], int maxtype,
 386                              const struct nla_policy *policy,
 387                              struct netlink_ext_ack *extack)
 388{
 389        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 390                return -EINVAL;
 391
 392        return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
 393                         nlmsg_attrlen(nlh, hdrlen), policy, extack);
 394}
 395
 396/**
 397 * nlmsg_find_attr - find a specific attribute in a netlink message
 398 * @nlh: netlink message header
 399 * @hdrlen: length of familiy specific header
 400 * @attrtype: type of attribute to look for
 401 *
 402 * Returns the first attribute which matches the specified type.
 403 */
 404static inline struct nlattr *nlmsg_find_attr(const struct nlmsghdr *nlh,
 405                                             int hdrlen, int attrtype)
 406{
 407        return nla_find(nlmsg_attrdata(nlh, hdrlen),
 408                        nlmsg_attrlen(nlh, hdrlen), attrtype);
 409}
 410
 411/**
 412 * nlmsg_validate - validate a netlink message including attributes
 413 * @nlh: netlinket message header
 414 * @hdrlen: length of familiy specific header
 415 * @maxtype: maximum attribute type to be expected
 416 * @policy: validation policy
 417 * @extack: extended ACK report struct
 418 */
 419static inline int nlmsg_validate(const struct nlmsghdr *nlh,
 420                                 int hdrlen, int maxtype,
 421                                 const struct nla_policy *policy,
 422                                 struct netlink_ext_ack *extack)
 423{
 424        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 425                return -EINVAL;
 426
 427        return nla_validate(nlmsg_attrdata(nlh, hdrlen),
 428                            nlmsg_attrlen(nlh, hdrlen), maxtype, policy,
 429                            extack);
 430}
 431
 432/**
 433 * nlmsg_report - need to report back to application?
 434 * @nlh: netlink message header
 435 *
 436 * Returns 1 if a report back to the application is requested.
 437 */
 438static inline int nlmsg_report(const struct nlmsghdr *nlh)
 439{
 440        return !!(nlh->nlmsg_flags & NLM_F_ECHO);
 441}
 442
 443/**
 444 * nlmsg_for_each_attr - iterate over a stream of attributes
 445 * @pos: loop counter, set to current attribute
 446 * @nlh: netlink message header
 447 * @hdrlen: length of familiy specific header
 448 * @rem: initialized to len, holds bytes currently remaining in stream
 449 */
 450#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
 451        nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
 452                          nlmsg_attrlen(nlh, hdrlen), rem)
 453
 454/**
 455 * nlmsg_put - Add a new netlink message to an skb
 456 * @skb: socket buffer to store message in
 457 * @portid: netlink PORTID of requesting application
 458 * @seq: sequence number of message
 459 * @type: message type
 460 * @payload: length of message payload
 461 * @flags: message flags
 462 *
 463 * Returns NULL if the tailroom of the skb is insufficient to store
 464 * the message header and payload.
 465 */
 466static inline struct nlmsghdr *nlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
 467                                         int type, int payload, int flags)
 468{
 469        if (unlikely(skb_tailroom(skb) < nlmsg_total_size(payload)))
 470                return NULL;
 471
 472        return __nlmsg_put(skb, portid, seq, type, payload, flags);
 473}
 474
 475/**
 476 * nlmsg_put_answer - Add a new callback based netlink message to an skb
 477 * @skb: socket buffer to store message in
 478 * @cb: netlink callback
 479 * @type: message type
 480 * @payload: length of message payload
 481 * @flags: message flags
 482 *
 483 * Returns NULL if the tailroom of the skb is insufficient to store
 484 * the message header and payload.
 485 */
 486static inline struct nlmsghdr *nlmsg_put_answer(struct sk_buff *skb,
 487                                                struct netlink_callback *cb,
 488                                                int type, int payload,
 489                                                int flags)
 490{
 491        return nlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
 492                         type, payload, flags);
 493}
 494
 495/**
 496 * nlmsg_new - Allocate a new netlink message
 497 * @payload: size of the message payload
 498 * @flags: the type of memory to allocate.
 499 *
 500 * Use NLMSG_DEFAULT_SIZE if the size of the payload isn't known
 501 * and a good default is needed.
 502 */
 503static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags)
 504{
 505        return alloc_skb(nlmsg_total_size(payload), flags);
 506}
 507
 508/**
 509 * nlmsg_end - Finalize a netlink message
 510 * @skb: socket buffer the message is stored in
 511 * @nlh: netlink message header
 512 *
 513 * Corrects the netlink message header to include the appeneded
 514 * attributes. Only necessary if attributes have been added to
 515 * the message.
 516 */
 517static inline void nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh)
 518{
 519        nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh;
 520}
 521
 522/**
 523 * nlmsg_get_pos - return current position in netlink message
 524 * @skb: socket buffer the message is stored in
 525 *
 526 * Returns a pointer to the current tail of the message.
 527 */
 528static inline void *nlmsg_get_pos(struct sk_buff *skb)
 529{
 530        return skb_tail_pointer(skb);
 531}
 532
 533/**
 534 * nlmsg_trim - Trim message to a mark
 535 * @skb: socket buffer the message is stored in
 536 * @mark: mark to trim to
 537 *
 538 * Trims the message to the provided mark.
 539 */
 540static inline void nlmsg_trim(struct sk_buff *skb, const void *mark)
 541{
 542        if (mark) {
 543                WARN_ON((unsigned char *) mark < skb->data);
 544                skb_trim(skb, (unsigned char *) mark - skb->data);
 545        }
 546}
 547
 548/**
 549 * nlmsg_cancel - Cancel construction of a netlink message
 550 * @skb: socket buffer the message is stored in
 551 * @nlh: netlink message header
 552 *
 553 * Removes the complete netlink message including all
 554 * attributes from the socket buffer again.
 555 */
 556static inline void nlmsg_cancel(struct sk_buff *skb, struct nlmsghdr *nlh)
 557{
 558        nlmsg_trim(skb, nlh);
 559}
 560
 561/**
 562 * nlmsg_free - free a netlink message
 563 * @skb: socket buffer of netlink message
 564 */
 565static inline void nlmsg_free(struct sk_buff *skb)
 566{
 567        kfree_skb(skb);
 568}
 569
 570/**
 571 * nlmsg_multicast - multicast a netlink message
 572 * @sk: netlink socket to spread messages to
 573 * @skb: netlink message as socket buffer
 574 * @portid: own netlink portid to avoid sending to yourself
 575 * @group: multicast group id
 576 * @flags: allocation flags
 577 */
 578static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb,
 579                                  u32 portid, unsigned int group, gfp_t flags)
 580{
 581        int err;
 582
 583        NETLINK_CB(skb).dst_group = group;
 584
 585        err = netlink_broadcast(sk, skb, portid, group, flags);
 586        if (err > 0)
 587                err = 0;
 588
 589        return err;
 590}
 591
 592/**
 593 * nlmsg_unicast - unicast a netlink message
 594 * @sk: netlink socket to spread message to
 595 * @skb: netlink message as socket buffer
 596 * @portid: netlink portid of the destination socket
 597 */
 598static inline int nlmsg_unicast(struct sock *sk, struct sk_buff *skb, u32 portid)
 599{
 600        int err;
 601
 602        err = netlink_unicast(sk, skb, portid, MSG_DONTWAIT);
 603        if (err > 0)
 604                err = 0;
 605
 606        return err;
 607}
 608
 609/**
 610 * nlmsg_for_each_msg - iterate over a stream of messages
 611 * @pos: loop counter, set to current message
 612 * @head: head of message stream
 613 * @len: length of message stream
 614 * @rem: initialized to len, holds bytes currently remaining in stream
 615 */
 616#define nlmsg_for_each_msg(pos, head, len, rem) \
 617        for (pos = head, rem = len; \
 618             nlmsg_ok(pos, rem); \
 619             pos = nlmsg_next(pos, &(rem)))
 620
 621/**
 622 * nl_dump_check_consistent - check if sequence is consistent and advertise if not
 623 * @cb: netlink callback structure that stores the sequence number
 624 * @nlh: netlink message header to write the flag to
 625 *
 626 * This function checks if the sequence (generation) number changed during dump
 627 * and if it did, advertises it in the netlink message header.
 628 *
 629 * The correct way to use it is to set cb->seq to the generation counter when
 630 * all locks for dumping have been acquired, and then call this function for
 631 * each message that is generated.
 632 *
 633 * Note that due to initialisation concerns, 0 is an invalid sequence number
 634 * and must not be used by code that uses this functionality.
 635 */
 636static inline void
 637nl_dump_check_consistent(struct netlink_callback *cb,
 638                         struct nlmsghdr *nlh)
 639{
 640        if (cb->prev_seq && cb->seq != cb->prev_seq)
 641                nlh->nlmsg_flags |= NLM_F_DUMP_INTR;
 642        cb->prev_seq = cb->seq;
 643}
 644
 645/**************************************************************************
 646 * Netlink Attributes
 647 **************************************************************************/
 648
 649/**
 650 * nla_attr_size - length of attribute not including padding
 651 * @payload: length of payload
 652 */
 653static inline int nla_attr_size(int payload)
 654{
 655        return NLA_HDRLEN + payload;
 656}
 657
 658/**
 659 * nla_total_size - total length of attribute including padding
 660 * @payload: length of payload
 661 */
 662static inline int nla_total_size(int payload)
 663{
 664        return NLA_ALIGN(nla_attr_size(payload));
 665}
 666
 667/**
 668 * nla_padlen - length of padding at the tail of attribute
 669 * @payload: length of payload
 670 */
 671static inline int nla_padlen(int payload)
 672{
 673        return nla_total_size(payload) - nla_attr_size(payload);
 674}
 675
 676/**
 677 * nla_type - attribute type
 678 * @nla: netlink attribute
 679 */
 680static inline int nla_type(const struct nlattr *nla)
 681{
 682        return nla->nla_type & NLA_TYPE_MASK;
 683}
 684
 685/**
 686 * nla_data - head of payload
 687 * @nla: netlink attribute
 688 */
 689static inline void *nla_data(const struct nlattr *nla)
 690{
 691        return (char *) nla + NLA_HDRLEN;
 692}
 693
 694/**
 695 * nla_len - length of payload
 696 * @nla: netlink attribute
 697 */
 698static inline int nla_len(const struct nlattr *nla)
 699{
 700        return nla->nla_len - NLA_HDRLEN;
 701}
 702
 703/**
 704 * nla_ok - check if the netlink attribute fits into the remaining bytes
 705 * @nla: netlink attribute
 706 * @remaining: number of bytes remaining in attribute stream
 707 */
 708static inline int nla_ok(const struct nlattr *nla, int remaining)
 709{
 710        return remaining >= (int) sizeof(*nla) &&
 711               nla->nla_len >= sizeof(*nla) &&
 712               nla->nla_len <= remaining;
 713}
 714
 715/**
 716 * nla_next - next netlink attribute in attribute stream
 717 * @nla: netlink attribute
 718 * @remaining: number of bytes remaining in attribute stream
 719 *
 720 * Returns the next netlink attribute in the attribute stream and
 721 * decrements remaining by the size of the current attribute.
 722 */
 723static inline struct nlattr *nla_next(const struct nlattr *nla, int *remaining)
 724{
 725        unsigned int totlen = NLA_ALIGN(nla->nla_len);
 726
 727        *remaining -= totlen;
 728        return (struct nlattr *) ((char *) nla + totlen);
 729}
 730
 731/**
 732 * nla_find_nested - find attribute in a set of nested attributes
 733 * @nla: attribute containing the nested attributes
 734 * @attrtype: type of attribute to look for
 735 *
 736 * Returns the first attribute which matches the specified type.
 737 */
 738static inline struct nlattr *
 739nla_find_nested(const struct nlattr *nla, int attrtype)
 740{
 741        return nla_find(nla_data(nla), nla_len(nla), attrtype);
 742}
 743
 744/**
 745 * nla_parse_nested - parse nested attributes
 746 * @tb: destination array with maxtype+1 elements
 747 * @maxtype: maximum attribute type to be expected
 748 * @nla: attribute containing the nested attributes
 749 * @policy: validation policy
 750 * @extack: extended ACK report struct
 751 *
 752 * See nla_parse()
 753 */
 754static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
 755                                   const struct nlattr *nla,
 756                                   const struct nla_policy *policy,
 757                                   struct netlink_ext_ack *extack)
 758{
 759        return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy,
 760                         extack);
 761}
 762
 763/**
 764 * nla_put_u8 - Add a u8 netlink attribute to a socket buffer
 765 * @skb: socket buffer to add attribute to
 766 * @attrtype: attribute type
 767 * @value: numeric value
 768 */
 769static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
 770{
 771        return nla_put(skb, attrtype, sizeof(u8), &value);
 772}
 773
 774/**
 775 * nla_put_u16 - Add a u16 netlink attribute to a socket buffer
 776 * @skb: socket buffer to add attribute to
 777 * @attrtype: attribute type
 778 * @value: numeric value
 779 */
 780static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
 781{
 782        return nla_put(skb, attrtype, sizeof(u16), &value);
 783}
 784
 785/**
 786 * nla_put_be16 - Add a __be16 netlink attribute to a socket buffer
 787 * @skb: socket buffer to add attribute to
 788 * @attrtype: attribute type
 789 * @value: numeric value
 790 */
 791static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
 792{
 793        return nla_put(skb, attrtype, sizeof(__be16), &value);
 794}
 795
 796/**
 797 * nla_put_net16 - Add 16-bit network byte order netlink attribute to a socket buffer
 798 * @skb: socket buffer to add attribute to
 799 * @attrtype: attribute type
 800 * @value: numeric value
 801 */
 802static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value)
 803{
 804        return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, value);
 805}
 806
 807/**
 808 * nla_put_le16 - Add a __le16 netlink attribute to a socket buffer
 809 * @skb: socket buffer to add attribute to
 810 * @attrtype: attribute type
 811 * @value: numeric value
 812 */
 813static inline int nla_put_le16(struct sk_buff *skb, int attrtype, __le16 value)
 814{
 815        return nla_put(skb, attrtype, sizeof(__le16), &value);
 816}
 817
 818/**
 819 * nla_put_u32 - Add a u32 netlink attribute to a socket buffer
 820 * @skb: socket buffer to add attribute to
 821 * @attrtype: attribute type
 822 * @value: numeric value
 823 */
 824static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
 825{
 826        return nla_put(skb, attrtype, sizeof(u32), &value);
 827}
 828
 829/**
 830 * nla_put_be32 - Add a __be32 netlink attribute to a socket buffer
 831 * @skb: socket buffer to add attribute to
 832 * @attrtype: attribute type
 833 * @value: numeric value
 834 */
 835static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
 836{
 837        return nla_put(skb, attrtype, sizeof(__be32), &value);
 838}
 839
 840/**
 841 * nla_put_net32 - Add 32-bit network byte order netlink attribute to a socket buffer
 842 * @skb: socket buffer to add attribute to
 843 * @attrtype: attribute type
 844 * @value: numeric value
 845 */
 846static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
 847{
 848        return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, value);
 849}
 850
 851/**
 852 * nla_put_le32 - Add a __le32 netlink attribute to a socket buffer
 853 * @skb: socket buffer to add attribute to
 854 * @attrtype: attribute type
 855 * @value: numeric value
 856 */
 857static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
 858{
 859        return nla_put(skb, attrtype, sizeof(__le32), &value);
 860}
 861
 862/**
 863 * nla_put_u64_64bit - Add a u64 netlink attribute to a skb and align it
 864 * @skb: socket buffer to add attribute to
 865 * @attrtype: attribute type
 866 * @value: numeric value
 867 * @padattr: attribute type for the padding
 868 */
 869static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
 870                                    u64 value, int padattr)
 871{
 872        return nla_put_64bit(skb, attrtype, sizeof(u64), &value, padattr);
 873}
 874
 875/**
 876 * nla_put_be64 - Add a __be64 netlink attribute to a socket buffer and align it
 877 * @skb: socket buffer to add attribute to
 878 * @attrtype: attribute type
 879 * @value: numeric value
 880 * @padattr: attribute type for the padding
 881 */
 882static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
 883                               int padattr)
 884{
 885        return nla_put_64bit(skb, attrtype, sizeof(__be64), &value, padattr);
 886}
 887
 888/**
 889 * nla_put_net64 - Add 64-bit network byte order nlattr to a skb and align it
 890 * @skb: socket buffer to add attribute to
 891 * @attrtype: attribute type
 892 * @value: numeric value
 893 * @padattr: attribute type for the padding
 894 */
 895static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
 896                                int padattr)
 897{
 898        return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, value,
 899                            padattr);
 900}
 901
 902/**
 903 * nla_put_le64 - Add a __le64 netlink attribute to a socket buffer and align it
 904 * @skb: socket buffer to add attribute to
 905 * @attrtype: attribute type
 906 * @value: numeric value
 907 * @padattr: attribute type for the padding
 908 */
 909static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
 910                               int padattr)
 911{
 912        return nla_put_64bit(skb, attrtype, sizeof(__le64), &value, padattr);
 913}
 914
 915/**
 916 * nla_put_s8 - Add a s8 netlink attribute to a socket buffer
 917 * @skb: socket buffer to add attribute to
 918 * @attrtype: attribute type
 919 * @value: numeric value
 920 */
 921static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
 922{
 923        return nla_put(skb, attrtype, sizeof(s8), &value);
 924}
 925
 926/**
 927 * nla_put_s16 - Add a s16 netlink attribute to a socket buffer
 928 * @skb: socket buffer to add attribute to
 929 * @attrtype: attribute type
 930 * @value: numeric value
 931 */
 932static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
 933{
 934        return nla_put(skb, attrtype, sizeof(s16), &value);
 935}
 936
 937/**
 938 * nla_put_s32 - Add a s32 netlink attribute to a socket buffer
 939 * @skb: socket buffer to add attribute to
 940 * @attrtype: attribute type
 941 * @value: numeric value
 942 */
 943static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
 944{
 945        return nla_put(skb, attrtype, sizeof(s32), &value);
 946}
 947
 948/**
 949 * nla_put_s64 - Add a s64 netlink attribute to a socket buffer and align it
 950 * @skb: socket buffer to add attribute to
 951 * @attrtype: attribute type
 952 * @value: numeric value
 953 * @padattr: attribute type for the padding
 954 */
 955static inline int nla_put_s64(struct sk_buff *skb, int attrtype, s64 value,
 956                              int padattr)
 957{
 958        return nla_put_64bit(skb, attrtype, sizeof(s64), &value, padattr);
 959}
 960
 961/**
 962 * nla_put_string - Add a string netlink attribute to a socket buffer
 963 * @skb: socket buffer to add attribute to
 964 * @attrtype: attribute type
 965 * @str: NUL terminated string
 966 */
 967static inline int nla_put_string(struct sk_buff *skb, int attrtype,
 968                                 const char *str)
 969{
 970        return nla_put(skb, attrtype, strlen(str) + 1, str);
 971}
 972
 973/**
 974 * nla_put_flag - Add a flag netlink attribute to a socket buffer
 975 * @skb: socket buffer to add attribute to
 976 * @attrtype: attribute type
 977 */
 978static inline int nla_put_flag(struct sk_buff *skb, int attrtype)
 979{
 980        return nla_put(skb, attrtype, 0, NULL);
 981}
 982
 983/**
 984 * nla_put_msecs - Add a msecs netlink attribute to a skb and align it
 985 * @skb: socket buffer to add attribute to
 986 * @attrtype: attribute type
 987 * @njiffies: number of jiffies to convert to msecs
 988 * @padattr: attribute type for the padding
 989 */
 990static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
 991                                unsigned long njiffies, int padattr)
 992{
 993        u64 tmp = jiffies_to_msecs(njiffies);
 994
 995        return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
 996}
 997
 998/**
 999 * nla_put_in_addr - Add an IPv4 address netlink attribute to a socket
1000 * buffer
1001 * @skb: socket buffer to add attribute to
1002 * @attrtype: attribute type
1003 * @addr: IPv4 address
1004 */
1005static inline int nla_put_in_addr(struct sk_buff *skb, int attrtype,
1006                                  __be32 addr)
1007{
1008        return nla_put_be32(skb, attrtype, addr);
1009}
1010
1011/**
1012 * nla_put_in6_addr - Add an IPv6 address netlink attribute to a socket
1013 * buffer
1014 * @skb: socket buffer to add attribute to
1015 * @attrtype: attribute type
1016 * @addr: IPv6 address
1017 */
1018static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype,
1019                                   const struct in6_addr *addr)
1020{
1021        return nla_put(skb, attrtype, sizeof(*addr), addr);
1022}
1023
1024/**
1025 * nla_get_u32 - return payload of u32 attribute
1026 * @nla: u32 netlink attribute
1027 */
1028static inline u32 nla_get_u32(const struct nlattr *nla)
1029{
1030        return *(u32 *) nla_data(nla);
1031}
1032
1033/**
1034 * nla_get_be32 - return payload of __be32 attribute
1035 * @nla: __be32 netlink attribute
1036 */
1037static inline __be32 nla_get_be32(const struct nlattr *nla)
1038{
1039        return *(__be32 *) nla_data(nla);
1040}
1041
1042/**
1043 * nla_get_le32 - return payload of __le32 attribute
1044 * @nla: __le32 netlink attribute
1045 */
1046static inline __le32 nla_get_le32(const struct nlattr *nla)
1047{
1048        return *(__le32 *) nla_data(nla);
1049}
1050
1051/**
1052 * nla_get_u16 - return payload of u16 attribute
1053 * @nla: u16 netlink attribute
1054 */
1055static inline u16 nla_get_u16(const struct nlattr *nla)
1056{
1057        return *(u16 *) nla_data(nla);
1058}
1059
1060/**
1061 * nla_get_be16 - return payload of __be16 attribute
1062 * @nla: __be16 netlink attribute
1063 */
1064static inline __be16 nla_get_be16(const struct nlattr *nla)
1065{
1066        return *(__be16 *) nla_data(nla);
1067}
1068
1069/**
1070 * nla_get_le16 - return payload of __le16 attribute
1071 * @nla: __le16 netlink attribute
1072 */
1073static inline __le16 nla_get_le16(const struct nlattr *nla)
1074{
1075        return *(__le16 *) nla_data(nla);
1076}
1077
1078/**
1079 * nla_get_u8 - return payload of u8 attribute
1080 * @nla: u8 netlink attribute
1081 */
1082static inline u8 nla_get_u8(const struct nlattr *nla)
1083{
1084        return *(u8 *) nla_data(nla);
1085}
1086
1087/**
1088 * nla_get_u64 - return payload of u64 attribute
1089 * @nla: u64 netlink attribute
1090 */
1091static inline u64 nla_get_u64(const struct nlattr *nla)
1092{
1093        u64 tmp;
1094
1095        nla_memcpy(&tmp, nla, sizeof(tmp));
1096
1097        return tmp;
1098}
1099
1100/**
1101 * nla_get_be64 - return payload of __be64 attribute
1102 * @nla: __be64 netlink attribute
1103 */
1104static inline __be64 nla_get_be64(const struct nlattr *nla)
1105{
1106        __be64 tmp;
1107
1108        nla_memcpy(&tmp, nla, sizeof(tmp));
1109
1110        return tmp;
1111}
1112
1113/**
1114 * nla_get_le64 - return payload of __le64 attribute
1115 * @nla: __le64 netlink attribute
1116 */
1117static inline __le64 nla_get_le64(const struct nlattr *nla)
1118{
1119        return *(__le64 *) nla_data(nla);
1120}
1121
1122/**
1123 * nla_get_s32 - return payload of s32 attribute
1124 * @nla: s32 netlink attribute
1125 */
1126static inline s32 nla_get_s32(const struct nlattr *nla)
1127{
1128        return *(s32 *) nla_data(nla);
1129}
1130
1131/**
1132 * nla_get_s16 - return payload of s16 attribute
1133 * @nla: s16 netlink attribute
1134 */
1135static inline s16 nla_get_s16(const struct nlattr *nla)
1136{
1137        return *(s16 *) nla_data(nla);
1138}
1139
1140/**
1141 * nla_get_s8 - return payload of s8 attribute
1142 * @nla: s8 netlink attribute
1143 */
1144static inline s8 nla_get_s8(const struct nlattr *nla)
1145{
1146        return *(s8 *) nla_data(nla);
1147}
1148
1149/**
1150 * nla_get_s64 - return payload of s64 attribute
1151 * @nla: s64 netlink attribute
1152 */
1153static inline s64 nla_get_s64(const struct nlattr *nla)
1154{
1155        s64 tmp;
1156
1157        nla_memcpy(&tmp, nla, sizeof(tmp));
1158
1159        return tmp;
1160}
1161
1162/**
1163 * nla_get_flag - return payload of flag attribute
1164 * @nla: flag netlink attribute
1165 */
1166static inline int nla_get_flag(const struct nlattr *nla)
1167{
1168        return !!nla;
1169}
1170
1171/**
1172 * nla_get_msecs - return payload of msecs attribute
1173 * @nla: msecs netlink attribute
1174 *
1175 * Returns the number of milliseconds in jiffies.
1176 */
1177static inline unsigned long nla_get_msecs(const struct nlattr *nla)
1178{
1179        u64 msecs = nla_get_u64(nla);
1180
1181        return msecs_to_jiffies((unsigned long) msecs);
1182}
1183
1184/**
1185 * nla_get_in_addr - return payload of IPv4 address attribute
1186 * @nla: IPv4 address netlink attribute
1187 */
1188static inline __be32 nla_get_in_addr(const struct nlattr *nla)
1189{
1190        return *(__be32 *) nla_data(nla);
1191}
1192
1193/**
1194 * nla_get_in6_addr - return payload of IPv6 address attribute
1195 * @nla: IPv6 address netlink attribute
1196 */
1197static inline struct in6_addr nla_get_in6_addr(const struct nlattr *nla)
1198{
1199        struct in6_addr tmp;
1200
1201        nla_memcpy(&tmp, nla, sizeof(tmp));
1202        return tmp;
1203}
1204
1205/**
1206 * nla_memdup - duplicate attribute memory (kmemdup)
1207 * @src: netlink attribute to duplicate from
1208 * @gfp: GFP mask
1209 */
1210static inline void *nla_memdup(const struct nlattr *src, gfp_t gfp)
1211{
1212        return kmemdup(nla_data(src), nla_len(src), gfp);
1213}
1214
1215/**
1216 * nla_nest_start - Start a new level of nested attributes
1217 * @skb: socket buffer to add attributes to
1218 * @attrtype: attribute type of container
1219 *
1220 * Returns the container attribute
1221 */
1222static inline struct nlattr *nla_nest_start(struct sk_buff *skb, int attrtype)
1223{
1224        struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
1225
1226        if (nla_put(skb, attrtype, 0, NULL) < 0)
1227                return NULL;
1228
1229        return start;
1230}
1231
1232/**
1233 * nla_nest_end - Finalize nesting of attributes
1234 * @skb: socket buffer the attributes are stored in
1235 * @start: container attribute
1236 *
1237 * Corrects the container attribute header to include the all
1238 * appeneded attributes.
1239 *
1240 * Returns the total data length of the skb.
1241 */
1242static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
1243{
1244        start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
1245        return skb->len;
1246}
1247
1248/**
1249 * nla_nest_cancel - Cancel nesting of attributes
1250 * @skb: socket buffer the message is stored in
1251 * @start: container attribute
1252 *
1253 * Removes the container attribute and including all nested
1254 * attributes. Returns -EMSGSIZE
1255 */
1256static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start)
1257{
1258        nlmsg_trim(skb, start);
1259}
1260
1261/**
1262 * nla_validate_nested - Validate a stream of nested attributes
1263 * @start: container attribute
1264 * @maxtype: maximum attribute type to be expected
1265 * @policy: validation policy
1266 * @extack: extended ACK report struct
1267 *
1268 * Validates all attributes in the nested attribute stream against the
1269 * specified policy. Attributes with a type exceeding maxtype will be
1270 * ignored. See documenation of struct nla_policy for more details.
1271 *
1272 * Returns 0 on success or a negative error code.
1273 */
1274static inline int nla_validate_nested(const struct nlattr *start, int maxtype,
1275                                      const struct nla_policy *policy,
1276                                      struct netlink_ext_ack *extack)
1277{
1278        return nla_validate(nla_data(start), nla_len(start), maxtype, policy,
1279                            extack);
1280}
1281
1282/**
1283 * nla_need_padding_for_64bit - test 64-bit alignment of the next attribute
1284 * @skb: socket buffer the message is stored in
1285 *
1286 * Return true if padding is needed to align the next attribute (nla_data()) to
1287 * a 64-bit aligned area.
1288 */
1289static inline bool nla_need_padding_for_64bit(struct sk_buff *skb)
1290{
1291#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
1292        /* The nlattr header is 4 bytes in size, that's why we test
1293         * if the skb->data _is_ aligned.  A NOP attribute, plus
1294         * nlattr header for next attribute, will make nla_data()
1295         * 8-byte aligned.
1296         */
1297        if (IS_ALIGNED((unsigned long)skb_tail_pointer(skb), 8))
1298                return true;
1299#endif
1300        return false;
1301}
1302
1303/**
1304 * nla_align_64bit - 64-bit align the nla_data() of next attribute
1305 * @skb: socket buffer the message is stored in
1306 * @padattr: attribute type for the padding
1307 *
1308 * Conditionally emit a padding netlink attribute in order to make
1309 * the next attribute we emit have a 64-bit aligned nla_data() area.
1310 * This will only be done in architectures which do not have
1311 * CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS defined.
1312 *
1313 * Returns zero on success or a negative error code.
1314 */
1315static inline int nla_align_64bit(struct sk_buff *skb, int padattr)
1316{
1317        if (nla_need_padding_for_64bit(skb) &&
1318            !nla_reserve(skb, padattr, 0))
1319                return -EMSGSIZE;
1320
1321        return 0;
1322}
1323
1324/**
1325 * nla_total_size_64bit - total length of attribute including padding
1326 * @payload: length of payload
1327 */
1328static inline int nla_total_size_64bit(int payload)
1329{
1330        return NLA_ALIGN(nla_attr_size(payload))
1331#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
1332                + NLA_ALIGN(nla_attr_size(0))
1333#endif
1334                ;
1335}
1336
1337/**
1338 * nla_for_each_attr - iterate over a stream of attributes
1339 * @pos: loop counter, set to current attribute
1340 * @head: head of attribute stream
1341 * @len: length of attribute stream
1342 * @rem: initialized to len, holds bytes currently remaining in stream
1343 */
1344#define nla_for_each_attr(pos, head, len, rem) \
1345        for (pos = head, rem = len; \
1346             nla_ok(pos, rem); \
1347             pos = nla_next(pos, &(rem)))
1348
1349/**
1350 * nla_for_each_nested - iterate over nested attributes
1351 * @pos: loop counter, set to current attribute
1352 * @nla: attribute containing the nested attributes
1353 * @rem: initialized to len, holds bytes currently remaining in stream
1354 */
1355#define nla_for_each_nested(pos, nla, rem) \
1356        nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem)
1357
1358/**
1359 * nla_is_last - Test if attribute is last in stream
1360 * @nla: attribute to test
1361 * @rem: bytes remaining in stream
1362 */
1363static inline bool nla_is_last(const struct nlattr *nla, int rem)
1364{
1365        return nla->nla_len == rem;
1366}
1367
1368#endif
1369