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()                        finanlize 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_COMPAT    Exact length of structure payload
 196 *    All other            Exact length of attribute payload
 197 *
 198 * Example:
 199 * static struct nla_policy my_policy[ATTR_MAX+1] __read_mostly = {
 200 *      [ATTR_FOO] = { .type = NLA_U16 },
 201 *      [ATTR_BAR] = { .type = NLA_STRING, .len = BARSIZ },
 202 *      [ATTR_BAZ] = { .len = sizeof(struct mystruct) },
 203 * };
 204 */
 205struct nla_policy {
 206        u16             type;
 207        u16             len;
 208};
 209
 210/**
 211 * struct nl_info - netlink source information
 212 * @nlh: Netlink message header of original request
 213 * @pid: Netlink PID of requesting application
 214 */
 215struct nl_info {
 216        struct nlmsghdr         *nlh;
 217        struct net              *nl_net;
 218        u32                     pid;
 219};
 220
 221extern int              netlink_rcv_skb(struct sk_buff *skb,
 222                                        int (*cb)(struct sk_buff *,
 223                                                  struct nlmsghdr *));
 224extern int              nlmsg_notify(struct sock *sk, struct sk_buff *skb,
 225                                     u32 pid, unsigned int group, int report,
 226                                     gfp_t flags);
 227
 228extern int              nla_validate(struct nlattr *head, int len, int maxtype,
 229                                     const struct nla_policy *policy);
 230extern int              nla_parse(struct nlattr *tb[], int maxtype,
 231                                  struct nlattr *head, int len,
 232                                  const struct nla_policy *policy);
 233extern int              nla_policy_len(const struct nla_policy *, int);
 234extern struct nlattr *  nla_find(struct nlattr *head, int len, int attrtype);
 235extern size_t           nla_strlcpy(char *dst, const struct nlattr *nla,
 236                                    size_t dstsize);
 237extern int              nla_memcpy(void *dest, const struct nlattr *src, int count);
 238extern int              nla_memcmp(const struct nlattr *nla, const void *data,
 239                                   size_t size);
 240extern int              nla_strcmp(const struct nlattr *nla, const char *str);
 241extern struct nlattr *  __nla_reserve(struct sk_buff *skb, int attrtype,
 242                                      int attrlen);
 243extern void *           __nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 244extern struct nlattr *  nla_reserve(struct sk_buff *skb, int attrtype,
 245                                    int attrlen);
 246extern void *           nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 247extern void             __nla_put(struct sk_buff *skb, int attrtype,
 248                                  int attrlen, const void *data);
 249extern void             __nla_put_nohdr(struct sk_buff *skb, int attrlen,
 250                                        const void *data);
 251extern int              nla_put(struct sk_buff *skb, int attrtype,
 252                                int attrlen, const void *data);
 253extern int              nla_put_nohdr(struct sk_buff *skb, int attrlen,
 254                                      const void *data);
 255extern int              nla_append(struct sk_buff *skb, int attrlen,
 256                                   const void *data);
 257
 258/**************************************************************************
 259 * Netlink Messages
 260 **************************************************************************/
 261
 262/**
 263 * nlmsg_msg_size - length of netlink message not including padding
 264 * @payload: length of message payload
 265 */
 266static inline int nlmsg_msg_size(int payload)
 267{
 268        return NLMSG_HDRLEN + payload;
 269}
 270
 271/**
 272 * nlmsg_total_size - length of netlink message including padding
 273 * @payload: length of message payload
 274 */
 275static inline int nlmsg_total_size(int payload)
 276{
 277        return NLMSG_ALIGN(nlmsg_msg_size(payload));
 278}
 279
 280/**
 281 * nlmsg_padlen - length of padding at the message's tail
 282 * @payload: length of message payload
 283 */
 284static inline int nlmsg_padlen(int payload)
 285{
 286        return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
 287}
 288
 289/**
 290 * nlmsg_data - head of message payload
 291 * @nlh: netlink messsage header
 292 */
 293static inline void *nlmsg_data(const struct nlmsghdr *nlh)
 294{
 295        return (unsigned char *) nlh + NLMSG_HDRLEN;
 296}
 297
 298/**
 299 * nlmsg_len - length of message payload
 300 * @nlh: netlink message header
 301 */
 302static inline int nlmsg_len(const struct nlmsghdr *nlh)
 303{
 304        return nlh->nlmsg_len - NLMSG_HDRLEN;
 305}
 306
 307/**
 308 * nlmsg_attrdata - head of attributes data
 309 * @nlh: netlink message header
 310 * @hdrlen: length of family specific header
 311 */
 312static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh,
 313                                            int hdrlen)
 314{
 315        unsigned char *data = nlmsg_data(nlh);
 316        return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
 317}
 318
 319/**
 320 * nlmsg_attrlen - length of attributes data
 321 * @nlh: netlink message header
 322 * @hdrlen: length of family specific header
 323 */
 324static inline int nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen)
 325{
 326        return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
 327}
 328
 329/**
 330 * nlmsg_ok - check if the netlink message fits into the remaining bytes
 331 * @nlh: netlink message header
 332 * @remaining: number of bytes remaining in message stream
 333 */
 334static inline int nlmsg_ok(const struct nlmsghdr *nlh, int remaining)
 335{
 336        return (remaining >= (int) sizeof(struct nlmsghdr) &&
 337                nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
 338                nlh->nlmsg_len <= remaining);
 339}
 340
 341/**
 342 * nlmsg_next - next netlink message in message stream
 343 * @nlh: netlink message header
 344 * @remaining: number of bytes remaining in message stream
 345 *
 346 * Returns the next netlink message in the message stream and
 347 * decrements remaining by the size of the current message.
 348 */
 349static inline struct nlmsghdr *nlmsg_next(struct nlmsghdr *nlh, int *remaining)
 350{
 351        int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
 352
 353        *remaining -= totlen;
 354
 355        return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
 356}
 357
 358/**
 359 * nlmsg_parse - parse attributes of a netlink message
 360 * @nlh: netlink message header
 361 * @hdrlen: length of family specific header
 362 * @tb: destination array with maxtype+1 elements
 363 * @maxtype: maximum attribute type to be expected
 364 * @policy: validation policy
 365 *
 366 * See nla_parse()
 367 */
 368static inline int nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
 369                              struct nlattr *tb[], int maxtype,
 370                              const struct nla_policy *policy)
 371{
 372        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 373                return -EINVAL;
 374
 375        return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
 376                         nlmsg_attrlen(nlh, hdrlen), policy);
 377}
 378
 379/**
 380 * nlmsg_find_attr - find a specific attribute in a netlink message
 381 * @nlh: netlink message header
 382 * @hdrlen: length of familiy specific header
 383 * @attrtype: type of attribute to look for
 384 *
 385 * Returns the first attribute which matches the specified type.
 386 */
 387static inline struct nlattr *nlmsg_find_attr(struct nlmsghdr *nlh,
 388                                             int hdrlen, int attrtype)
 389{
 390        return nla_find(nlmsg_attrdata(nlh, hdrlen),
 391                        nlmsg_attrlen(nlh, hdrlen), attrtype);
 392}
 393
 394/**
 395 * nlmsg_validate - validate a netlink message including attributes
 396 * @nlh: netlinket message header
 397 * @hdrlen: length of familiy specific header
 398 * @maxtype: maximum attribute type to be expected
 399 * @policy: validation policy
 400 */
 401static inline int nlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype,
 402                                 const struct nla_policy *policy)
 403{
 404        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 405                return -EINVAL;
 406
 407        return nla_validate(nlmsg_attrdata(nlh, hdrlen),
 408                            nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
 409}
 410
 411/**
 412 * nlmsg_report - need to report back to application?
 413 * @nlh: netlink message header
 414 *
 415 * Returns 1 if a report back to the application is requested.
 416 */
 417static inline int nlmsg_report(const struct nlmsghdr *nlh)
 418{
 419        return !!(nlh->nlmsg_flags & NLM_F_ECHO);
 420}
 421
 422/**
 423 * nlmsg_for_each_attr - iterate over a stream of attributes
 424 * @pos: loop counter, set to current attribute
 425 * @nlh: netlink message header
 426 * @hdrlen: length of familiy specific header
 427 * @rem: initialized to len, holds bytes currently remaining in stream
 428 */
 429#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
 430        nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
 431                          nlmsg_attrlen(nlh, hdrlen), rem)
 432
 433#if 0
 434/* FIXME: Enable once all users have been converted */
 435
 436/**
 437 * __nlmsg_put - Add a new netlink message to an skb
 438 * @skb: socket buffer to store message in
 439 * @pid: netlink process id
 440 * @seq: sequence number of message
 441 * @type: message type
 442 * @payload: length of message payload
 443 * @flags: message flags
 444 *
 445 * The caller is responsible to ensure that the skb provides enough
 446 * tailroom for both the netlink header and payload.
 447 */
 448static inline struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid,
 449                                           u32 seq, int type, int payload,
 450                                           int flags)
 451{
 452        struct nlmsghdr *nlh;
 453
 454        nlh = (struct nlmsghdr *) skb_put(skb, nlmsg_total_size(payload));
 455        nlh->nlmsg_type = type;
 456        nlh->nlmsg_len = nlmsg_msg_size(payload);
 457        nlh->nlmsg_flags = flags;
 458        nlh->nlmsg_pid = pid;
 459        nlh->nlmsg_seq = seq;
 460
 461        memset((unsigned char *) nlmsg_data(nlh) + payload, 0,
 462               nlmsg_padlen(payload));
 463
 464        return nlh;
 465}
 466#endif
 467
 468/**
 469 * nlmsg_put - Add a new netlink message to an skb
 470 * @skb: socket buffer to store message in
 471 * @pid: netlink process id
 472 * @seq: sequence number of message
 473 * @type: message type
 474 * @payload: length of message payload
 475 * @flags: message flags
 476 *
 477 * Returns NULL if the tailroom of the skb is insufficient to store
 478 * the message header and payload.
 479 */
 480static inline struct nlmsghdr *nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
 481                                         int type, int payload, int flags)
 482{
 483        if (unlikely(skb_tailroom(skb) < nlmsg_total_size(payload)))
 484                return NULL;
 485
 486        return __nlmsg_put(skb, pid, seq, type, payload, flags);
 487}
 488
 489/**
 490 * nlmsg_put_answer - Add a new callback based netlink message to an skb
 491 * @skb: socket buffer to store message in
 492 * @cb: netlink callback
 493 * @type: message type
 494 * @payload: length of message payload
 495 * @flags: message flags
 496 *
 497 * Returns NULL if the tailroom of the skb is insufficient to store
 498 * the message header and payload.
 499 */
 500static inline struct nlmsghdr *nlmsg_put_answer(struct sk_buff *skb,
 501                                                struct netlink_callback *cb,
 502                                                int type, int payload,
 503                                                int flags)
 504{
 505        return nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq,
 506                         type, payload, flags);
 507}
 508
 509/**
 510 * nlmsg_new - Allocate a new netlink message
 511 * @payload: size of the message payload
 512 * @flags: the type of memory to allocate.
 513 *
 514 * Use NLMSG_DEFAULT_SIZE if the size of the payload isn't known
 515 * and a good default is needed.
 516 */
 517static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags)
 518{
 519        return alloc_skb(nlmsg_total_size(payload), flags);
 520}
 521
 522/**
 523 * nlmsg_end - Finalize a netlink message
 524 * @skb: socket buffer the message is stored in
 525 * @nlh: netlink message header
 526 *
 527 * Corrects the netlink message header to include the appeneded
 528 * attributes. Only necessary if attributes have been added to
 529 * the message.
 530 *
 531 * Returns the total data length of the skb.
 532 */
 533static inline int nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh)
 534{
 535        nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh;
 536
 537        return skb->len;
 538}
 539
 540/**
 541 * nlmsg_get_pos - return current position in netlink message
 542 * @skb: socket buffer the message is stored in
 543 *
 544 * Returns a pointer to the current tail of the message.
 545 */
 546static inline void *nlmsg_get_pos(struct sk_buff *skb)
 547{
 548        return skb_tail_pointer(skb);
 549}
 550
 551/**
 552 * nlmsg_trim - Trim message to a mark
 553 * @skb: socket buffer the message is stored in
 554 * @mark: mark to trim to
 555 *
 556 * Trims the message to the provided mark.
 557 */
 558static inline void nlmsg_trim(struct sk_buff *skb, const void *mark)
 559{
 560        if (mark)
 561                skb_trim(skb, (unsigned char *) mark - skb->data);
 562}
 563
 564/**
 565 * nlmsg_cancel - Cancel construction of a netlink message
 566 * @skb: socket buffer the message is stored in
 567 * @nlh: netlink message header
 568 *
 569 * Removes the complete netlink message including all
 570 * attributes from the socket buffer again.
 571 */
 572static inline void nlmsg_cancel(struct sk_buff *skb, struct nlmsghdr *nlh)
 573{
 574        nlmsg_trim(skb, nlh);
 575}
 576
 577/**
 578 * nlmsg_free - free a netlink message
 579 * @skb: socket buffer of netlink message
 580 */
 581static inline void nlmsg_free(struct sk_buff *skb)
 582{
 583        kfree_skb(skb);
 584}
 585
 586/**
 587 * nlmsg_multicast - multicast a netlink message
 588 * @sk: netlink socket to spread messages to
 589 * @skb: netlink message as socket buffer
 590 * @pid: own netlink pid to avoid sending to yourself
 591 * @group: multicast group id
 592 * @flags: allocation flags
 593 */
 594static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb,
 595                                  u32 pid, unsigned int group, gfp_t flags)
 596{
 597        int err;
 598
 599        NETLINK_CB(skb).dst_group = group;
 600
 601        err = netlink_broadcast(sk, skb, pid, group, flags);
 602        if (err > 0)
 603                err = 0;
 604
 605        return err;
 606}
 607
 608/**
 609 * nlmsg_unicast - unicast a netlink message
 610 * @sk: netlink socket to spread message to
 611 * @skb: netlink message as socket buffer
 612 * @pid: netlink pid of the destination socket
 613 */
 614static inline int nlmsg_unicast(struct sock *sk, struct sk_buff *skb, u32 pid)
 615{
 616        int err;
 617
 618        err = netlink_unicast(sk, skb, pid, MSG_DONTWAIT);
 619        if (err > 0)
 620                err = 0;
 621
 622        return err;
 623}
 624
 625/**
 626 * nlmsg_for_each_msg - iterate over a stream of messages
 627 * @pos: loop counter, set to current message
 628 * @head: head of message stream
 629 * @len: length of message stream
 630 * @rem: initialized to len, holds bytes currently remaining in stream
 631 */
 632#define nlmsg_for_each_msg(pos, head, len, rem) \
 633        for (pos = head, rem = len; \
 634             nlmsg_ok(pos, rem); \
 635             pos = nlmsg_next(pos, &(rem)))
 636
 637/**************************************************************************
 638 * Netlink Attributes
 639 **************************************************************************/
 640
 641/**
 642 * nla_attr_size - length of attribute not including padding
 643 * @payload: length of payload
 644 */
 645static inline int nla_attr_size(int payload)
 646{
 647        return NLA_HDRLEN + payload;
 648}
 649
 650/**
 651 * nla_total_size - total length of attribute including padding
 652 * @payload: length of payload
 653 */
 654static inline int nla_total_size(int payload)
 655{
 656        return NLA_ALIGN(nla_attr_size(payload));
 657}
 658
 659/**
 660 * nla_padlen - length of padding at the tail of attribute
 661 * @payload: length of payload
 662 */
 663static inline int nla_padlen(int payload)
 664{
 665        return nla_total_size(payload) - nla_attr_size(payload);
 666}
 667
 668/**
 669 * nla_type - attribute type
 670 * @nla: netlink attribute
 671 */
 672static inline int nla_type(const struct nlattr *nla)
 673{
 674        return nla->nla_type & NLA_TYPE_MASK;
 675}
 676
 677/**
 678 * nla_data - head of payload
 679 * @nla: netlink attribute
 680 */
 681static inline void *nla_data(const struct nlattr *nla)
 682{
 683        return (char *) nla + NLA_HDRLEN;
 684}
 685
 686/**
 687 * nla_len - length of payload
 688 * @nla: netlink attribute
 689 */
 690static inline int nla_len(const struct nlattr *nla)
 691{
 692        return nla->nla_len - NLA_HDRLEN;
 693}
 694
 695/**
 696 * nla_ok - check if the netlink attribute fits into the remaining bytes
 697 * @nla: netlink attribute
 698 * @remaining: number of bytes remaining in attribute stream
 699 */
 700static inline int nla_ok(const struct nlattr *nla, int remaining)
 701{
 702        return remaining >= (int) sizeof(*nla) &&
 703               nla->nla_len >= sizeof(*nla) &&
 704               nla->nla_len <= remaining;
 705}
 706
 707/**
 708 * nla_next - next netlink attribute in attribute stream
 709 * @nla: netlink attribute
 710 * @remaining: number of bytes remaining in attribute stream
 711 *
 712 * Returns the next netlink attribute in the attribute stream and
 713 * decrements remaining by the size of the current attribute.
 714 */
 715static inline struct nlattr *nla_next(const struct nlattr *nla, int *remaining)
 716{
 717        int totlen = NLA_ALIGN(nla->nla_len);
 718
 719        *remaining -= totlen;
 720        return (struct nlattr *) ((char *) nla + totlen);
 721}
 722
 723/**
 724 * nla_find_nested - find attribute in a set of nested attributes
 725 * @nla: attribute containing the nested attributes
 726 * @attrtype: type of attribute to look for
 727 *
 728 * Returns the first attribute which matches the specified type.
 729 */
 730static inline struct nlattr *nla_find_nested(struct nlattr *nla, int attrtype)
 731{
 732        return nla_find(nla_data(nla), nla_len(nla), attrtype);
 733}
 734
 735/**
 736 * nla_parse_nested - parse nested attributes
 737 * @tb: destination array with maxtype+1 elements
 738 * @maxtype: maximum attribute type to be expected
 739 * @nla: attribute containing the nested attributes
 740 * @policy: validation policy
 741 *
 742 * See nla_parse()
 743 */
 744static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
 745                                   const struct nlattr *nla,
 746                                   const struct nla_policy *policy)
 747{
 748        return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy);
 749}
 750
 751/**
 752 * nla_put_u8 - Add a u8 netlink attribute to a socket buffer
 753 * @skb: socket buffer to add attribute to
 754 * @attrtype: attribute type
 755 * @value: numeric value
 756 */
 757static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
 758{
 759        return nla_put(skb, attrtype, sizeof(u8), &value);
 760}
 761
 762/**
 763 * nla_put_u16 - Add a u16 netlink attribute to a socket buffer
 764 * @skb: socket buffer to add attribute to
 765 * @attrtype: attribute type
 766 * @value: numeric value
 767 */
 768static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
 769{
 770        return nla_put(skb, attrtype, sizeof(u16), &value);
 771}
 772
 773/**
 774 * nla_put_u32 - Add a u32 netlink attribute to a socket buffer
 775 * @skb: socket buffer to add attribute to
 776 * @attrtype: attribute type
 777 * @value: numeric value
 778 */
 779static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
 780{
 781        return nla_put(skb, attrtype, sizeof(u32), &value);
 782}
 783
 784/**
 785 * nla_put_64 - Add a u64 netlink attribute to a socket buffer
 786 * @skb: socket buffer to add attribute to
 787 * @attrtype: attribute type
 788 * @value: numeric value
 789 */
 790static inline int nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
 791{
 792        return nla_put(skb, attrtype, sizeof(u64), &value);
 793}
 794
 795/**
 796 * nla_put_string - Add a string netlink attribute to a socket buffer
 797 * @skb: socket buffer to add attribute to
 798 * @attrtype: attribute type
 799 * @str: NUL terminated string
 800 */
 801static inline int nla_put_string(struct sk_buff *skb, int attrtype,
 802                                 const char *str)
 803{
 804        return nla_put(skb, attrtype, strlen(str) + 1, str);
 805}
 806
 807/**
 808 * nla_put_flag - Add a flag netlink attribute to a socket buffer
 809 * @skb: socket buffer to add attribute to
 810 * @attrtype: attribute type
 811 */
 812static inline int nla_put_flag(struct sk_buff *skb, int attrtype)
 813{
 814        return nla_put(skb, attrtype, 0, NULL);
 815}
 816
 817/**
 818 * nla_put_msecs - Add a msecs netlink attribute to a socket buffer
 819 * @skb: socket buffer to add attribute to
 820 * @attrtype: attribute type
 821 * @jiffies: number of msecs in jiffies
 822 */
 823static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
 824                                unsigned long jiffies)
 825{
 826        u64 tmp = jiffies_to_msecs(jiffies);
 827        return nla_put(skb, attrtype, sizeof(u64), &tmp);
 828}
 829
 830#define NLA_PUT(skb, attrtype, attrlen, data) \
 831        do { \
 832                if (unlikely(nla_put(skb, attrtype, attrlen, data) < 0)) \
 833                        goto nla_put_failure; \
 834        } while(0)
 835
 836#define NLA_PUT_TYPE(skb, type, attrtype, value) \
 837        do { \
 838                type __tmp = value; \
 839                NLA_PUT(skb, attrtype, sizeof(type), &__tmp); \
 840        } while(0)
 841
 842#define NLA_PUT_U8(skb, attrtype, value) \
 843        NLA_PUT_TYPE(skb, u8, attrtype, value)
 844
 845#define NLA_PUT_U16(skb, attrtype, value) \
 846        NLA_PUT_TYPE(skb, u16, attrtype, value)
 847
 848#define NLA_PUT_LE16(skb, attrtype, value) \
 849        NLA_PUT_TYPE(skb, __le16, attrtype, value)
 850
 851#define NLA_PUT_BE16(skb, attrtype, value) \
 852        NLA_PUT_TYPE(skb, __be16, attrtype, value)
 853
 854#define NLA_PUT_U32(skb, attrtype, value) \
 855        NLA_PUT_TYPE(skb, u32, attrtype, value)
 856
 857#define NLA_PUT_BE32(skb, attrtype, value) \
 858        NLA_PUT_TYPE(skb, __be32, attrtype, value)
 859
 860#define NLA_PUT_U64(skb, attrtype, value) \
 861        NLA_PUT_TYPE(skb, u64, attrtype, value)
 862
 863#define NLA_PUT_BE64(skb, attrtype, value) \
 864        NLA_PUT_TYPE(skb, __be64, attrtype, value)
 865
 866#define NLA_PUT_STRING(skb, attrtype, value) \
 867        NLA_PUT(skb, attrtype, strlen(value) + 1, value)
 868
 869#define NLA_PUT_FLAG(skb, attrtype) \
 870        NLA_PUT(skb, attrtype, 0, NULL)
 871
 872#define NLA_PUT_MSECS(skb, attrtype, jiffies) \
 873        NLA_PUT_U64(skb, attrtype, jiffies_to_msecs(jiffies))
 874
 875/**
 876 * nla_get_u32 - return payload of u32 attribute
 877 * @nla: u32 netlink attribute
 878 */
 879static inline u32 nla_get_u32(const struct nlattr *nla)
 880{
 881        return *(u32 *) nla_data(nla);
 882}
 883
 884/**
 885 * nla_get_be32 - return payload of __be32 attribute
 886 * @nla: __be32 netlink attribute
 887 */
 888static inline __be32 nla_get_be32(const struct nlattr *nla)
 889{
 890        return *(__be32 *) nla_data(nla);
 891}
 892
 893/**
 894 * nla_get_u16 - return payload of u16 attribute
 895 * @nla: u16 netlink attribute
 896 */
 897static inline u16 nla_get_u16(const struct nlattr *nla)
 898{
 899        return *(u16 *) nla_data(nla);
 900}
 901
 902/**
 903 * nla_get_be16 - return payload of __be16 attribute
 904 * @nla: __be16 netlink attribute
 905 */
 906static inline __be16 nla_get_be16(const struct nlattr *nla)
 907{
 908        return *(__be16 *) nla_data(nla);
 909}
 910
 911/**
 912 * nla_get_le16 - return payload of __le16 attribute
 913 * @nla: __le16 netlink attribute
 914 */
 915static inline __le16 nla_get_le16(const struct nlattr *nla)
 916{
 917        return *(__le16 *) nla_data(nla);
 918}
 919
 920/**
 921 * nla_get_u8 - return payload of u8 attribute
 922 * @nla: u8 netlink attribute
 923 */
 924static inline u8 nla_get_u8(const struct nlattr *nla)
 925{
 926        return *(u8 *) nla_data(nla);
 927}
 928
 929/**
 930 * nla_get_u64 - return payload of u64 attribute
 931 * @nla: u64 netlink attribute
 932 */
 933static inline u64 nla_get_u64(const struct nlattr *nla)
 934{
 935        u64 tmp;
 936
 937        nla_memcpy(&tmp, nla, sizeof(tmp));
 938
 939        return tmp;
 940}
 941
 942/**
 943 * nla_get_be64 - return payload of __be64 attribute
 944 * @nla: __be64 netlink attribute
 945 */
 946static inline __be64 nla_get_be64(const struct nlattr *nla)
 947{
 948        return *(__be64 *) nla_data(nla);
 949}
 950
 951/**
 952 * nla_get_flag - return payload of flag attribute
 953 * @nla: flag netlink attribute
 954 */
 955static inline int nla_get_flag(const struct nlattr *nla)
 956{
 957        return !!nla;
 958}
 959
 960/**
 961 * nla_get_msecs - return payload of msecs attribute
 962 * @nla: msecs netlink attribute
 963 *
 964 * Returns the number of milliseconds in jiffies.
 965 */
 966static inline unsigned long nla_get_msecs(const struct nlattr *nla)
 967{
 968        u64 msecs = nla_get_u64(nla);
 969
 970        return msecs_to_jiffies((unsigned long) msecs);
 971}
 972
 973/**
 974 * nla_nest_start - Start a new level of nested attributes
 975 * @skb: socket buffer to add attributes to
 976 * @attrtype: attribute type of container
 977 *
 978 * Returns the container attribute
 979 */
 980static inline struct nlattr *nla_nest_start(struct sk_buff *skb, int attrtype)
 981{
 982        struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
 983
 984        if (nla_put(skb, attrtype, 0, NULL) < 0)
 985                return NULL;
 986
 987        return start;
 988}
 989
 990/**
 991 * nla_nest_end - Finalize nesting of attributes
 992 * @skb: socket buffer the attributes are stored in
 993 * @start: container attribute
 994 *
 995 * Corrects the container attribute header to include the all
 996 * appeneded attributes.
 997 *
 998 * Returns the total data length of the skb.
 999 */
1000static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
1001{
1002        start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
1003        return skb->len;
1004}
1005
1006/**
1007 * nla_nest_cancel - Cancel nesting of attributes
1008 * @skb: socket buffer the message is stored in
1009 * @start: container attribute
1010 *
1011 * Removes the container attribute and including all nested
1012 * attributes. Returns -EMSGSIZE
1013 */
1014static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start)
1015{
1016        nlmsg_trim(skb, start);
1017}
1018
1019/**
1020 * nla_validate_nested - Validate a stream of nested attributes
1021 * @start: container attribute
1022 * @maxtype: maximum attribute type to be expected
1023 * @policy: validation policy
1024 *
1025 * Validates all attributes in the nested attribute stream against the
1026 * specified policy. Attributes with a type exceeding maxtype will be
1027 * ignored. See documenation of struct nla_policy for more details.
1028 *
1029 * Returns 0 on success or a negative error code.
1030 */
1031static inline int nla_validate_nested(struct nlattr *start, int maxtype,
1032                                      const struct nla_policy *policy)
1033{
1034        return nla_validate(nla_data(start), nla_len(start), maxtype, policy);
1035}
1036
1037/**
1038 * nla_for_each_attr - iterate over a stream of attributes
1039 * @pos: loop counter, set to current attribute
1040 * @head: head of attribute stream
1041 * @len: length of attribute stream
1042 * @rem: initialized to len, holds bytes currently remaining in stream
1043 */
1044#define nla_for_each_attr(pos, head, len, rem) \
1045        for (pos = head, rem = len; \
1046             nla_ok(pos, rem); \
1047             pos = nla_next(pos, &(rem)))
1048
1049/**
1050 * nla_for_each_nested - iterate over nested attributes
1051 * @pos: loop counter, set to current attribute
1052 * @nla: attribute containing the nested attributes
1053 * @rem: initialized to len, holds bytes currently remaining in stream
1054 */
1055#define nla_for_each_nested(pos, nla, rem) \
1056        nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem)
1057
1058#endif
1059