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_compat_start(skb, type,   start a nested compat attribute
 123 *                         len, data)
 124 *   nla_nest_compat_end(skb, type)     finalize a nested compat attribute
 125 *   nla_nest_cancel(skb, nla)          cancel nested attribute construction
 126 *
 127 * Attribute Length Calculations:
 128 *   nla_attr_size(payload)             length of attribute w/o padding
 129 *   nla_total_size(payload)            length of attribute w/ padding
 130 *   nla_padlen(payload)                length of padding
 131 *
 132 * Attribute Payload Access:
 133 *   nla_data(nla)                      head of attribute payload
 134 *   nla_len(nla)                       length of attribute payload
 135 *
 136 * Attribute Payload Access for Basic Types:
 137 *   nla_get_u8(nla)                    get payload for a u8 attribute
 138 *   nla_get_u16(nla)                   get payload for a u16 attribute
 139 *   nla_get_u32(nla)                   get payload for a u32 attribute
 140 *   nla_get_u64(nla)                   get payload for a u64 attribute
 141 *   nla_get_flag(nla)                  return 1 if flag is true
 142 *   nla_get_msecs(nla)                 get payload for a msecs attribute
 143 *
 144 * Attribute Misc:
 145 *   nla_memcpy(dest, nla, count)       copy attribute into memory
 146 *   nla_memcmp(nla, data, size)        compare attribute with memory area
 147 *   nla_strlcpy(dst, nla, size)        copy attribute to a sized string
 148 *   nla_strcmp(nla, str)               compare attribute with string
 149 *
 150 * Attribute Parsing:
 151 *   nla_ok(nla, remaining)             does nla fit into remaining bytes?
 152 *   nla_next(nla, remaining)           get next netlink attribute
 153 *   nla_validate()                     validate a stream of attributes
 154 *   nla_validate_nested()              validate a stream of nested attributes
 155 *   nla_find()                         find attribute in stream of attributes
 156 *   nla_find_nested()                  find attribute in nested attributes
 157 *   nla_parse()                        parse and validate stream of attrs
 158 *   nla_parse_nested()                 parse nested attribuets
 159 *   nla_parse_nested_compat()          parse nested compat attributes
 160 *   nla_for_each_attr()                loop over all attributes
 161 *   nla_for_each_nested()              loop over the nested attributes
 162 *=========================================================================
 163 */
 164
 165 /**
 166  * Standard attribute types to specify validation policy
 167  */
 168enum {
 169        NLA_UNSPEC,
 170        NLA_U8,
 171        NLA_U16,
 172        NLA_U32,
 173        NLA_U64,
 174        NLA_STRING,
 175        NLA_FLAG,
 176        NLA_MSECS,
 177        NLA_NESTED,
 178        NLA_NESTED_COMPAT,
 179        NLA_NUL_STRING,
 180        NLA_BINARY,
 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_COMPAT    Exact length of structure payload
 200 *    All other            Exact length of attribute payload
 201 *
 202 * Example:
 203 * static struct nla_policy my_policy[ATTR_MAX+1] __read_mostly = {
 204 *      [ATTR_FOO] = { .type = NLA_U16 },
 205 *      [ATTR_BAR] = { .type = NLA_STRING, .len = BARSIZ },
 206 *      [ATTR_BAZ] = { .len = sizeof(struct mystruct) },
 207 * };
 208 */
 209struct nla_policy {
 210        u16             type;
 211        u16             len;
 212};
 213
 214/**
 215 * struct nl_info - netlink source information
 216 * @nlh: Netlink message header of original request
 217 * @pid: Netlink PID of requesting application
 218 */
 219struct nl_info {
 220        struct nlmsghdr         *nlh;
 221        struct net              *nl_net;
 222        u32                     pid;
 223};
 224
 225extern int              netlink_rcv_skb(struct sk_buff *skb,
 226                                        int (*cb)(struct sk_buff *,
 227                                                  struct nlmsghdr *));
 228extern int              nlmsg_notify(struct sock *sk, struct sk_buff *skb,
 229                                     u32 pid, unsigned int group, int report,
 230                                     gfp_t flags);
 231
 232extern int              nla_validate(struct nlattr *head, int len, int maxtype,
 233                                     const struct nla_policy *policy);
 234extern int              nla_parse(struct nlattr *tb[], int maxtype,
 235                                  struct nlattr *head, int len,
 236                                  const struct nla_policy *policy);
 237extern struct nlattr *  nla_find(struct nlattr *head, int len, int attrtype);
 238extern size_t           nla_strlcpy(char *dst, const struct nlattr *nla,
 239                                    size_t dstsize);
 240extern int              nla_memcpy(void *dest, struct nlattr *src, int count);
 241extern int              nla_memcmp(const struct nlattr *nla, const void *data,
 242                                   size_t size);
 243extern int              nla_strcmp(const struct nlattr *nla, const char *str);
 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 struct nlattr *  nla_reserve(struct sk_buff *skb, int attrtype,
 248                                    int attrlen);
 249extern void *           nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
 250extern void             __nla_put(struct sk_buff *skb, int attrtype,
 251                                  int attrlen, const void *data);
 252extern void             __nla_put_nohdr(struct sk_buff *skb, int attrlen,
 253                                        const void *data);
 254extern int              nla_put(struct sk_buff *skb, int attrtype,
 255                                int attrlen, const void *data);
 256extern int              nla_put_nohdr(struct sk_buff *skb, int attrlen,
 257                                      const void *data);
 258extern int              nla_append(struct sk_buff *skb, int attrlen,
 259                                   const void *data);
 260
 261/**************************************************************************
 262 * Netlink Messages
 263 **************************************************************************/
 264
 265/**
 266 * nlmsg_msg_size - length of netlink message not including padding
 267 * @payload: length of message payload
 268 */
 269static inline int nlmsg_msg_size(int payload)
 270{
 271        return NLMSG_HDRLEN + payload;
 272}
 273
 274/**
 275 * nlmsg_total_size - length of netlink message including padding
 276 * @payload: length of message payload
 277 */
 278static inline int nlmsg_total_size(int payload)
 279{
 280        return NLMSG_ALIGN(nlmsg_msg_size(payload));
 281}
 282
 283/**
 284 * nlmsg_padlen - length of padding at the message's tail
 285 * @payload: length of message payload
 286 */
 287static inline int nlmsg_padlen(int payload)
 288{
 289        return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
 290}
 291
 292/**
 293 * nlmsg_data - head of message payload
 294 * @nlh: netlink messsage header
 295 */
 296static inline void *nlmsg_data(const struct nlmsghdr *nlh)
 297{
 298        return (unsigned char *) nlh + NLMSG_HDRLEN;
 299}
 300
 301/**
 302 * nlmsg_len - length of message payload
 303 * @nlh: netlink message header
 304 */
 305static inline int nlmsg_len(const struct nlmsghdr *nlh)
 306{
 307        return nlh->nlmsg_len - NLMSG_HDRLEN;
 308}
 309
 310/**
 311 * nlmsg_attrdata - head of attributes data
 312 * @nlh: netlink message header
 313 * @hdrlen: length of family specific header
 314 */
 315static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh,
 316                                            int hdrlen)
 317{
 318        unsigned char *data = nlmsg_data(nlh);
 319        return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
 320}
 321
 322/**
 323 * nlmsg_attrlen - length of attributes data
 324 * @nlh: netlink message header
 325 * @hdrlen: length of family specific header
 326 */
 327static inline int nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen)
 328{
 329        return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
 330}
 331
 332/**
 333 * nlmsg_ok - check if the netlink message fits into the remaining bytes
 334 * @nlh: netlink message header
 335 * @remaining: number of bytes remaining in message stream
 336 */
 337static inline int nlmsg_ok(const struct nlmsghdr *nlh, int remaining)
 338{
 339        return (remaining >= sizeof(struct nlmsghdr) &&
 340                nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
 341                nlh->nlmsg_len <= remaining);
 342}
 343
 344/**
 345 * nlmsg_next - next netlink message in message stream
 346 * @nlh: netlink message header
 347 * @remaining: number of bytes remaining in message stream
 348 *
 349 * Returns the next netlink message in the message stream and
 350 * decrements remaining by the size of the current message.
 351 */
 352static inline struct nlmsghdr *nlmsg_next(struct nlmsghdr *nlh, int *remaining)
 353{
 354        int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
 355
 356        *remaining -= totlen;
 357
 358        return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
 359}
 360
 361/**
 362 * nlmsg_parse - parse attributes of a netlink message
 363 * @nlh: netlink message header
 364 * @hdrlen: length of family specific header
 365 * @tb: destination array with maxtype+1 elements
 366 * @maxtype: maximum attribute type to be expected
 367 * @policy: validation policy
 368 *
 369 * See nla_parse()
 370 */
 371static inline int nlmsg_parse(struct nlmsghdr *nlh, int hdrlen,
 372                              struct nlattr *tb[], int maxtype,
 373                              const struct nla_policy *policy)
 374{
 375        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 376                return -EINVAL;
 377
 378        return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
 379                         nlmsg_attrlen(nlh, hdrlen), policy);
 380}
 381
 382/**
 383 * nlmsg_find_attr - find a specific attribute in a netlink message
 384 * @nlh: netlink message header
 385 * @hdrlen: length of familiy specific header
 386 * @attrtype: type of attribute to look for
 387 *
 388 * Returns the first attribute which matches the specified type.
 389 */
 390static inline struct nlattr *nlmsg_find_attr(struct nlmsghdr *nlh,
 391                                             int hdrlen, int attrtype)
 392{
 393        return nla_find(nlmsg_attrdata(nlh, hdrlen),
 394                        nlmsg_attrlen(nlh, hdrlen), attrtype);
 395}
 396
 397/**
 398 * nlmsg_validate - validate a netlink message including attributes
 399 * @nlh: netlinket message header
 400 * @hdrlen: length of familiy specific header
 401 * @maxtype: maximum attribute type to be expected
 402 * @policy: validation policy
 403 */
 404static inline int nlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype,
 405                                 const struct nla_policy *policy)
 406{
 407        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 408                return -EINVAL;
 409
 410        return nla_validate(nlmsg_attrdata(nlh, hdrlen),
 411                            nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
 412}
 413
 414/**
 415 * nlmsg_report - need to report back to application?
 416 * @nlh: netlink message header
 417 *
 418 * Returns 1 if a report back to the application is requested.
 419 */
 420static inline int nlmsg_report(struct nlmsghdr *nlh)
 421{
 422        return !!(nlh->nlmsg_flags & NLM_F_ECHO);
 423}
 424
 425/**
 426 * nlmsg_for_each_attr - iterate over a stream of attributes
 427 * @pos: loop counter, set to current attribute
 428 * @nlh: netlink message header
 429 * @hdrlen: length of familiy specific header
 430 * @rem: initialized to len, holds bytes currently remaining in stream
 431 */
 432#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
 433        nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
 434                          nlmsg_attrlen(nlh, hdrlen), rem)
 435
 436#if 0
 437/* FIXME: Enable once all users have been converted */
 438
 439/**
 440 * __nlmsg_put - Add a new netlink message to an skb
 441 * @skb: socket buffer to store message in
 442 * @pid: netlink process id
 443 * @seq: sequence number of message
 444 * @type: message type
 445 * @payload: length of message payload
 446 * @flags: message flags
 447 *
 448 * The caller is responsible to ensure that the skb provides enough
 449 * tailroom for both the netlink header and payload.
 450 */
 451static inline struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid,
 452                                           u32 seq, int type, int payload,
 453                                           int flags)
 454{
 455        struct nlmsghdr *nlh;
 456
 457        nlh = (struct nlmsghdr *) skb_put(skb, nlmsg_total_size(payload));
 458        nlh->nlmsg_type = type;
 459        nlh->nlmsg_len = nlmsg_msg_size(payload);
 460        nlh->nlmsg_flags = flags;
 461        nlh->nlmsg_pid = pid;
 462        nlh->nlmsg_seq = seq;
 463
 464        memset((unsigned char *) nlmsg_data(nlh) + payload, 0,
 465               nlmsg_padlen(payload));
 466
 467        return nlh;
 468}
 469#endif
 470
 471/**
 472 * nlmsg_put - Add a new netlink message to an skb
 473 * @skb: socket buffer to store message in
 474 * @pid: netlink process id
 475 * @seq: sequence number of message
 476 * @type: message type
 477 * @payload: length of message payload
 478 * @flags: message flags
 479 *
 480 * Returns NULL if the tailroom of the skb is insufficient to store
 481 * the message header and payload.
 482 */
 483static inline struct nlmsghdr *nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
 484                                         int type, int payload, int flags)
 485{
 486        if (unlikely(skb_tailroom(skb) < nlmsg_total_size(payload)))
 487                return NULL;
 488
 489        return __nlmsg_put(skb, pid, seq, type, payload, flags);
 490}
 491
 492/**
 493 * nlmsg_put_answer - Add a new callback based netlink message to an skb
 494 * @skb: socket buffer to store message in
 495 * @cb: netlink callback
 496 * @type: message type
 497 * @payload: length of message payload
 498 * @flags: message flags
 499 *
 500 * Returns NULL if the tailroom of the skb is insufficient to store
 501 * the message header and payload.
 502 */
 503static inline struct nlmsghdr *nlmsg_put_answer(struct sk_buff *skb,
 504                                                struct netlink_callback *cb,
 505                                                int type, int payload,
 506                                                int flags)
 507{
 508        return nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq,
 509                         type, payload, flags);
 510}
 511
 512/**
 513 * nlmsg_new - Allocate a new netlink message
 514 * @payload: size of the message payload
 515 * @flags: the type of memory to allocate.
 516 *
 517 * Use NLMSG_DEFAULT_SIZE if the size of the payload isn't known
 518 * and a good default is needed.
 519 */
 520static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags)
 521{
 522        return alloc_skb(nlmsg_total_size(payload), flags);
 523}
 524
 525/**
 526 * nlmsg_end - Finalize a netlink message
 527 * @skb: socket buffer the message is stored in
 528 * @nlh: netlink message header
 529 *
 530 * Corrects the netlink message header to include the appeneded
 531 * attributes. Only necessary if attributes have been added to
 532 * the message.
 533 *
 534 * Returns the total data length of the skb.
 535 */
 536static inline int nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh)
 537{
 538        nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh;
 539
 540        return skb->len;
 541}
 542
 543/**
 544 * nlmsg_get_pos - return current position in netlink message
 545 * @skb: socket buffer the message is stored in
 546 *
 547 * Returns a pointer to the current tail of the message.
 548 */
 549static inline void *nlmsg_get_pos(struct sk_buff *skb)
 550{
 551        return skb_tail_pointer(skb);
 552}
 553
 554/**
 555 * nlmsg_trim - Trim message to a mark
 556 * @skb: socket buffer the message is stored in
 557 * @mark: mark to trim to
 558 *
 559 * Trims the message to the provided mark.
 560 */
 561static inline void nlmsg_trim(struct sk_buff *skb, const void *mark)
 562{
 563        if (mark)
 564                skb_trim(skb, (unsigned char *) mark - skb->data);
 565}
 566
 567/**
 568 * nlmsg_cancel - Cancel construction of a netlink message
 569 * @skb: socket buffer the message is stored in
 570 * @nlh: netlink message header
 571 *
 572 * Removes the complete netlink message including all
 573 * attributes from the socket buffer again.
 574 */
 575static inline void nlmsg_cancel(struct sk_buff *skb, struct nlmsghdr *nlh)
 576{
 577        nlmsg_trim(skb, nlh);
 578}
 579
 580/**
 581 * nlmsg_free - free a netlink message
 582 * @skb: socket buffer of netlink message
 583 */
 584static inline void nlmsg_free(struct sk_buff *skb)
 585{
 586        kfree_skb(skb);
 587}
 588
 589/**
 590 * nlmsg_multicast - multicast a netlink message
 591 * @sk: netlink socket to spread messages to
 592 * @skb: netlink message as socket buffer
 593 * @pid: own netlink pid to avoid sending to yourself
 594 * @group: multicast group id
 595 * @flags: allocation flags
 596 */
 597static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb,
 598                                  u32 pid, unsigned int group, gfp_t flags)
 599{
 600        int err;
 601
 602        NETLINK_CB(skb).dst_group = group;
 603
 604        err = netlink_broadcast(sk, skb, pid, group, flags);
 605        if (err > 0)
 606                err = 0;
 607
 608        return err;
 609}
 610
 611/**
 612 * nlmsg_unicast - unicast a netlink message
 613 * @sk: netlink socket to spread message to
 614 * @skb: netlink message as socket buffer
 615 * @pid: netlink pid of the destination socket
 616 */
 617static inline int nlmsg_unicast(struct sock *sk, struct sk_buff *skb, u32 pid)
 618{
 619        int err;
 620
 621        err = netlink_unicast(sk, skb, pid, MSG_DONTWAIT);
 622        if (err > 0)
 623                err = 0;
 624
 625        return err;
 626}
 627
 628/**
 629 * nlmsg_for_each_msg - iterate over a stream of messages
 630 * @pos: loop counter, set to current message
 631 * @head: head of message stream
 632 * @len: length of message stream
 633 * @rem: initialized to len, holds bytes currently remaining in stream
 634 */
 635#define nlmsg_for_each_msg(pos, head, len, rem) \
 636        for (pos = head, rem = len; \
 637             nlmsg_ok(pos, rem); \
 638             pos = nlmsg_next(pos, &(rem)))
 639
 640/**************************************************************************
 641 * Netlink Attributes
 642 **************************************************************************/
 643
 644/**
 645 * nla_attr_size - length of attribute not including padding
 646 * @payload: length of payload
 647 */
 648static inline int nla_attr_size(int payload)
 649{
 650        return NLA_HDRLEN + payload;
 651}
 652
 653/**
 654 * nla_total_size - total length of attribute including padding
 655 * @payload: length of payload
 656 */
 657static inline int nla_total_size(int payload)
 658{
 659        return NLA_ALIGN(nla_attr_size(payload));
 660}
 661
 662/**
 663 * nla_padlen - length of padding at the tail of attribute
 664 * @payload: length of payload
 665 */
 666static inline int nla_padlen(int payload)
 667{
 668        return nla_total_size(payload) - nla_attr_size(payload);
 669}
 670
 671/**
 672 * nla_type - attribute type
 673 * @nla: netlink attribute
 674 */
 675static inline int nla_type(const struct nlattr *nla)
 676{
 677        return nla->nla_type & NLA_TYPE_MASK;
 678}
 679
 680/**
 681 * nla_data - head of payload
 682 * @nla: netlink attribute
 683 */
 684static inline void *nla_data(const struct nlattr *nla)
 685{
 686        return (char *) nla + NLA_HDRLEN;
 687}
 688
 689/**
 690 * nla_len - length of payload
 691 * @nla: netlink attribute
 692 */
 693static inline int nla_len(const struct nlattr *nla)
 694{
 695        return nla->nla_len - NLA_HDRLEN;
 696}
 697
 698/**
 699 * nla_ok - check if the netlink attribute fits into the remaining bytes
 700 * @nla: netlink attribute
 701 * @remaining: number of bytes remaining in attribute stream
 702 */
 703static inline int nla_ok(const struct nlattr *nla, int remaining)
 704{
 705        return remaining >= (int) sizeof(*nla) &&
 706               nla->nla_len >= sizeof(*nla) &&
 707               nla->nla_len <= remaining;
 708}
 709
 710/**
 711 * nla_next - next netlink attribute in attribute stream
 712 * @nla: netlink attribute
 713 * @remaining: number of bytes remaining in attribute stream
 714 *
 715 * Returns the next netlink attribute in the attribute stream and
 716 * decrements remaining by the size of the current attribute.
 717 */
 718static inline struct nlattr *nla_next(const struct nlattr *nla, int *remaining)
 719{
 720        int totlen = NLA_ALIGN(nla->nla_len);
 721
 722        *remaining -= totlen;
 723        return (struct nlattr *) ((char *) nla + totlen);
 724}
 725
 726/**
 727 * nla_find_nested - find attribute in a set of nested attributes
 728 * @nla: attribute containing the nested attributes
 729 * @attrtype: type of attribute to look for
 730 *
 731 * Returns the first attribute which matches the specified type.
 732 */
 733static inline struct nlattr *nla_find_nested(struct nlattr *nla, int attrtype)
 734{
 735        return nla_find(nla_data(nla), nla_len(nla), attrtype);
 736}
 737
 738/**
 739 * nla_parse_nested - parse nested attributes
 740 * @tb: destination array with maxtype+1 elements
 741 * @maxtype: maximum attribute type to be expected
 742 * @nla: attribute containing the nested attributes
 743 * @policy: validation policy
 744 *
 745 * See nla_parse()
 746 */
 747static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
 748                                   struct nlattr *nla,
 749                                   const struct nla_policy *policy)
 750{
 751        return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy);
 752}
 753
 754/**
 755 * nla_parse_nested_compat - parse nested compat attributes
 756 * @tb: destination array with maxtype+1 elements
 757 * @maxtype: maximum attribute type to be expected
 758 * @nla: attribute containing the nested attributes
 759 * @data: pointer to point to contained structure
 760 * @len: length of contained structure
 761 * @policy: validation policy
 762 *
 763 * Parse a nested compat attribute. The compat attribute contains a structure
 764 * and optionally a set of nested attributes. On success the data pointer
 765 * points to the nested data and tb contains the parsed attributes
 766 * (see nla_parse).
 767 */
 768static inline int __nla_parse_nested_compat(struct nlattr *tb[], int maxtype,
 769                                            struct nlattr *nla,
 770                                            const struct nla_policy *policy,
 771                                            int len)
 772{
 773        int nested_len = nla_len(nla) - NLA_ALIGN(len);
 774
 775        if (nested_len < 0)
 776                return -EINVAL;
 777        if (nested_len >= nla_attr_size(0))
 778                return nla_parse(tb, maxtype, nla_data(nla) + NLA_ALIGN(len),
 779                                 nested_len, policy);
 780        memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
 781        return 0;
 782}
 783
 784#define nla_parse_nested_compat(tb, maxtype, nla, policy, data, len) \
 785({      data = nla_len(nla) >= len ? nla_data(nla) : NULL; \
 786        __nla_parse_nested_compat(tb, maxtype, nla, policy, len); })
 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_U32(skb, attrtype, value) \
 891        NLA_PUT_TYPE(skb, u32, attrtype, value)
 892
 893#define NLA_PUT_BE32(skb, attrtype, value) \
 894        NLA_PUT_TYPE(skb, __be32, attrtype, value)
 895
 896#define NLA_PUT_U64(skb, attrtype, value) \
 897        NLA_PUT_TYPE(skb, u64, attrtype, value)
 898
 899#define NLA_PUT_BE64(skb, attrtype, value) \
 900        NLA_PUT_TYPE(skb, __be64, attrtype, value)
 901
 902#define NLA_PUT_STRING(skb, attrtype, value) \
 903        NLA_PUT(skb, attrtype, strlen(value) + 1, value)
 904
 905#define NLA_PUT_FLAG(skb, attrtype) \
 906        NLA_PUT(skb, attrtype, 0, NULL)
 907
 908#define NLA_PUT_MSECS(skb, attrtype, jiffies) \
 909        NLA_PUT_U64(skb, attrtype, jiffies_to_msecs(jiffies))
 910
 911/**
 912 * nla_get_u32 - return payload of u32 attribute
 913 * @nla: u32 netlink attribute
 914 */
 915static inline u32 nla_get_u32(struct nlattr *nla)
 916{
 917        return *(u32 *) nla_data(nla);
 918}
 919
 920/**
 921 * nla_get_be32 - return payload of __be32 attribute
 922 * @nla: __be32 netlink attribute
 923 */
 924static inline __be32 nla_get_be32(struct nlattr *nla)
 925{
 926        return *(__be32 *) nla_data(nla);
 927}
 928
 929/**
 930 * nla_get_u16 - return payload of u16 attribute
 931 * @nla: u16 netlink attribute
 932 */
 933static inline u16 nla_get_u16(struct nlattr *nla)
 934{
 935        return *(u16 *) nla_data(nla);
 936}
 937
 938/**
 939 * nla_get_be16 - return payload of __be16 attribute
 940 * @nla: __be16 netlink attribute
 941 */
 942static inline __be16 nla_get_be16(struct nlattr *nla)
 943{
 944        return *(__be16 *) nla_data(nla);
 945}
 946
 947/**
 948 * nla_get_le16 - return payload of __le16 attribute
 949 * @nla: __le16 netlink attribute
 950 */
 951static inline __le16 nla_get_le16(struct nlattr *nla)
 952{
 953        return *(__le16 *) nla_data(nla);
 954}
 955
 956/**
 957 * nla_get_u8 - return payload of u8 attribute
 958 * @nla: u8 netlink attribute
 959 */
 960static inline u8 nla_get_u8(struct nlattr *nla)
 961{
 962        return *(u8 *) nla_data(nla);
 963}
 964
 965/**
 966 * nla_get_u64 - return payload of u64 attribute
 967 * @nla: u64 netlink attribute
 968 */
 969static inline u64 nla_get_u64(struct nlattr *nla)
 970{
 971        u64 tmp;
 972
 973        nla_memcpy(&tmp, nla, sizeof(tmp));
 974
 975        return tmp;
 976}
 977
 978/**
 979 * nla_get_flag - return payload of flag attribute
 980 * @nla: flag netlink attribute
 981 */
 982static inline int nla_get_flag(struct nlattr *nla)
 983{
 984        return !!nla;
 985}
 986
 987/**
 988 * nla_get_msecs - return payload of msecs attribute
 989 * @nla: msecs netlink attribute
 990 *
 991 * Returns the number of milliseconds in jiffies.
 992 */
 993static inline unsigned long nla_get_msecs(struct nlattr *nla)
 994{
 995        u64 msecs = nla_get_u64(nla);
 996
 997        return msecs_to_jiffies((unsigned long) msecs);
 998}
 999
1000/**
1001 * nla_nest_start - Start a new level of nested attributes
1002 * @skb: socket buffer to add attributes to
1003 * @attrtype: attribute type of container
1004 *
1005 * Returns the container attribute
1006 */
1007static inline struct nlattr *nla_nest_start(struct sk_buff *skb, int attrtype)
1008{
1009        struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
1010
1011        if (nla_put(skb, attrtype, 0, NULL) < 0)
1012                return NULL;
1013
1014        return start;
1015}
1016
1017/**
1018 * nla_nest_end - Finalize nesting of attributes
1019 * @skb: socket buffer the attributes are stored in
1020 * @start: container attribute
1021 *
1022 * Corrects the container attribute header to include the all
1023 * appeneded attributes.
1024 *
1025 * Returns the total data length of the skb.
1026 */
1027static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
1028{
1029        start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
1030        return skb->len;
1031}
1032
1033/**
1034 * nla_nest_compat_start - Start a new level of nested compat attributes
1035 * @skb: socket buffer to add attributes to
1036 * @attrtype: attribute type of container
1037 * @attrlen: length of structure
1038 * @data: pointer to structure
1039 *
1040 * Start a nested compat attribute that contains both a structure and
1041 * a set of nested attributes.
1042 *
1043 * Returns the container attribute
1044 */
1045static inline struct nlattr *nla_nest_compat_start(struct sk_buff *skb,
1046                                                   int attrtype, int attrlen,
1047                                                   const void *data)
1048{
1049        struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
1050
1051        if (nla_put(skb, attrtype, attrlen, data) < 0)
1052                return NULL;
1053        if (nla_nest_start(skb, attrtype) == NULL) {
1054                nlmsg_trim(skb, start);
1055                return NULL;
1056        }
1057        return start;
1058}
1059
1060/**
1061 * nla_nest_compat_end - Finalize nesting of compat attributes
1062 * @skb: socket buffer the attributes are stored in
1063 * @start: container attribute
1064 *
1065 * Corrects the container attribute header to include the all
1066 * appeneded attributes.
1067 *
1068 * Returns the total data length of the skb.
1069 */
1070static inline int nla_nest_compat_end(struct sk_buff *skb, struct nlattr *start)
1071{
1072        struct nlattr *nest = (void *)start + NLMSG_ALIGN(start->nla_len);
1073
1074        start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
1075        return nla_nest_end(skb, nest);
1076}
1077
1078/**
1079 * nla_nest_cancel - Cancel nesting of attributes
1080 * @skb: socket buffer the message is stored in
1081 * @start: container attribute
1082 *
1083 * Removes the container attribute and including all nested
1084 * attributes. Returns -EMSGSIZE
1085 */
1086static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start)
1087{
1088        nlmsg_trim(skb, start);
1089}
1090
1091/**
1092 * nla_validate_nested - Validate a stream of nested attributes
1093 * @start: container attribute
1094 * @maxtype: maximum attribute type to be expected
1095 * @policy: validation policy
1096 *
1097 * Validates all attributes in the nested attribute stream against the
1098 * specified policy. Attributes with a type exceeding maxtype will be
1099 * ignored. See documenation of struct nla_policy for more details.
1100 *
1101 * Returns 0 on success or a negative error code.
1102 */
1103static inline int nla_validate_nested(struct nlattr *start, int maxtype,
1104                                      const struct nla_policy *policy)
1105{
1106        return nla_validate(nla_data(start), nla_len(start), maxtype, policy);
1107}
1108
1109/**
1110 * nla_for_each_attr - iterate over a stream of attributes
1111 * @pos: loop counter, set to current attribute
1112 * @head: head of attribute stream
1113 * @len: length of attribute stream
1114 * @rem: initialized to len, holds bytes currently remaining in stream
1115 */
1116#define nla_for_each_attr(pos, head, len, rem) \
1117        for (pos = head, rem = len; \
1118             nla_ok(pos, rem); \
1119             pos = nla_next(pos, &(rem)))
1120
1121/**
1122 * nla_for_each_nested - iterate over nested attributes
1123 * @pos: loop counter, set to current attribute
1124 * @nla: attribute containing the nested attributes
1125 * @rem: initialized to len, holds bytes currently remaining in stream
1126 */
1127#define nla_for_each_nested(pos, nla, rem) \
1128        nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem)
1129
1130#endif
1131
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.