LCOV - code coverage report
Current view: top level - include/net - netlink.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 109 183 59.6 %
Date: 2021-04-22 12:43:58 Functions: 9 15 60.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef __NET_NETLINK_H
       3             : #define __NET_NETLINK_H
       4             : 
       5             : #include <linux/types.h>
       6             : #include <linux/netlink.h>
       7             : #include <linux/jiffies.h>
       8             : #include <linux/in6.h>
       9             : 
      10             : /* ========================================================================
      11             :  *         Netlink Messages and Attributes Interface (As Seen On TV)
      12             :  * ------------------------------------------------------------------------
      13             :  *                          Messages Interface
      14             :  * ------------------------------------------------------------------------
      15             :  *
      16             :  * Message Format:
      17             :  *    <--- nlmsg_total_size(payload)  --->
      18             :  *    <-- nlmsg_msg_size(payload) ->
      19             :  *   +----------+- - -+-------------+- - -+-------- - -
      20             :  *   | nlmsghdr | Pad |   Payload   | Pad | nlmsghdr
      21             :  *   +----------+- - -+-------------+- - -+-------- - -
      22             :  *   nlmsg_data(nlh)---^                   ^
      23             :  *   nlmsg_next(nlh)-----------------------+
      24             :  *
      25             :  * Payload Format:
      26             :  *    <---------------------- nlmsg_len(nlh) --------------------->
      27             :  *    <------ hdrlen ------>       <- nlmsg_attrlen(nlh, hdrlen) ->
      28             :  *   +----------------------+- - -+--------------------------------+
      29             :  *   |     Family Header    | Pad |           Attributes           |
      30             :  *   +----------------------+- - -+--------------------------------+
      31             :  *   nlmsg_attrdata(nlh, hdrlen)---^
      32             :  *
      33             :  * Data Structures:
      34             :  *   struct nlmsghdr                    netlink message header
      35             :  *
      36             :  * Message Construction:
      37             :  *   nlmsg_new()                        create a new netlink message
      38             :  *   nlmsg_put()                        add a netlink message to an skb
      39             :  *   nlmsg_put_answer()                 callback based nlmsg_put()
      40             :  *   nlmsg_end()                        finalize netlink message
      41             :  *   nlmsg_get_pos()                    return current position in message
      42             :  *   nlmsg_trim()                       trim part of message
      43             :  *   nlmsg_cancel()                     cancel message construction
      44             :  *   nlmsg_free()                       free a netlink message
      45             :  *
      46             :  * Message Sending:
      47             :  *   nlmsg_multicast()                  multicast message to several groups
      48             :  *   nlmsg_unicast()                    unicast a message to a single socket
      49             :  *   nlmsg_notify()                     send notification message
      50             :  *
      51             :  * Message Length Calculations:
      52             :  *   nlmsg_msg_size(payload)            length of message w/o padding
      53             :  *   nlmsg_total_size(payload)          length of message w/ padding
      54             :  *   nlmsg_padlen(payload)              length of padding at tail
      55             :  *
      56             :  * Message Payload Access:
      57             :  *   nlmsg_data(nlh)                    head of message payload
      58             :  *   nlmsg_len(nlh)                     length of message payload
      59             :  *   nlmsg_attrdata(nlh, hdrlen)        head of attributes data
      60             :  *   nlmsg_attrlen(nlh, hdrlen)         length of attributes data
      61             :  *
      62             :  * Message Parsing:
      63             :  *   nlmsg_ok(nlh, remaining)           does nlh fit into remaining bytes?
      64             :  *   nlmsg_next(nlh, remaining)         get next netlink message
      65             :  *   nlmsg_parse()                      parse attributes of a message
      66             :  *   nlmsg_find_attr()                  find an attribute in a message
      67             :  *   nlmsg_for_each_msg()               loop over all messages
      68             :  *   nlmsg_validate()                   validate netlink message incl. attrs
      69             :  *   nlmsg_for_each_attr()              loop over all attributes
      70             :  *
      71             :  * Misc:
      72             :  *   nlmsg_report()                     report back to application?
      73             :  *
      74             :  * ------------------------------------------------------------------------
      75             :  *                          Attributes Interface
      76             :  * ------------------------------------------------------------------------
      77             :  *
      78             :  * Attribute Format:
      79             :  *    <------- nla_total_size(payload) ------->
      80             :  *    <---- nla_attr_size(payload) ----->
      81             :  *   +----------+- - -+- - - - - - - - - +- - -+-------- - -
      82             :  *   |  Header  | Pad |     Payload      | Pad |  Header
      83             :  *   +----------+- - -+- - - - - - - - - +- - -+-------- - -
      84             :  *                     <- nla_len(nla) ->      ^
      85             :  *   nla_data(nla)----^                        |
      86             :  *   nla_next(nla)-----------------------------'
      87             :  *
      88             :  * Data Structures:
      89             :  *   struct nlattr                      netlink attribute header
      90             :  *
      91             :  * Attribute Construction:
      92             :  *   nla_reserve(skb, type, len)        reserve room for an attribute
      93             :  *   nla_reserve_nohdr(skb, len)        reserve room for an attribute w/o hdr
      94             :  *   nla_put(skb, type, len, data)      add attribute to skb
      95             :  *   nla_put_nohdr(skb, len, data)      add attribute w/o hdr
      96             :  *   nla_append(skb, len, data)         append data to skb
      97             :  *
      98             :  * Attribute Construction for Basic Types:
      99             :  *   nla_put_u8(skb, type, value)       add u8 attribute to skb
     100             :  *   nla_put_u16(skb, type, value)      add u16 attribute to skb
     101             :  *   nla_put_u32(skb, type, value)      add u32 attribute to skb
     102             :  *   nla_put_u64_64bit(skb, type,
     103             :  *                     value, padattr)  add u64 attribute to skb
     104             :  *   nla_put_s8(skb, type, value)       add s8 attribute to skb
     105             :  *   nla_put_s16(skb, type, value)      add s16 attribute to skb
     106             :  *   nla_put_s32(skb, type, value)      add s32 attribute to skb
     107             :  *   nla_put_s64(skb, type, value,
     108             :  *               padattr)               add s64 attribute to skb
     109             :  *   nla_put_string(skb, type, str)     add string attribute to skb
     110             :  *   nla_put_flag(skb, type)            add flag attribute to skb
     111             :  *   nla_put_msecs(skb, type, jiffies,
     112             :  *                 padattr)             add msecs attribute to skb
     113             :  *   nla_put_in_addr(skb, type, addr)   add IPv4 address attribute to skb
     114             :  *   nla_put_in6_addr(skb, type, addr)  add IPv6 address attribute to skb
     115             :  *
     116             :  * Nested Attributes Construction:
     117             :  *   nla_nest_start(skb, type)          start a nested attribute
     118             :  *   nla_nest_end(skb, nla)             finalize a nested attribute
     119             :  *   nla_nest_cancel(skb, nla)          cancel nested attribute construction
     120             :  *
     121             :  * Attribute Length Calculations:
     122             :  *   nla_attr_size(payload)             length of attribute w/o padding
     123             :  *   nla_total_size(payload)            length of attribute w/ padding
     124             :  *   nla_padlen(payload)                length of padding
     125             :  *
     126             :  * Attribute Payload Access:
     127             :  *   nla_data(nla)                      head of attribute payload
     128             :  *   nla_len(nla)                       length of attribute payload
     129             :  *
     130             :  * Attribute Payload Access for Basic Types:
     131             :  *   nla_get_u8(nla)                    get payload for a u8 attribute
     132             :  *   nla_get_u16(nla)                   get payload for a u16 attribute
     133             :  *   nla_get_u32(nla)                   get payload for a u32 attribute
     134             :  *   nla_get_u64(nla)                   get payload for a u64 attribute
     135             :  *   nla_get_s8(nla)                    get payload for a s8 attribute
     136             :  *   nla_get_s16(nla)                   get payload for a s16 attribute
     137             :  *   nla_get_s32(nla)                   get payload for a s32 attribute
     138             :  *   nla_get_s64(nla)                   get payload for a s64 attribute
     139             :  *   nla_get_flag(nla)                  return 1 if flag is true
     140             :  *   nla_get_msecs(nla)                 get payload for a msecs attribute
     141             :  *
     142             :  * Attribute Misc:
     143             :  *   nla_memcpy(dest, nla, count)       copy attribute into memory
     144             :  *   nla_memcmp(nla, data, size)        compare attribute with memory area
     145             :  *   nla_strscpy(dst, nla, size)        copy attribute to a sized string
     146             :  *   nla_strcmp(nla, str)               compare attribute with string
     147             :  *
     148             :  * Attribute Parsing:
     149             :  *   nla_ok(nla, remaining)             does nla fit into remaining bytes?
     150             :  *   nla_next(nla, remaining)           get next netlink attribute
     151             :  *   nla_validate()                     validate a stream of attributes
     152             :  *   nla_validate_nested()              validate a stream of nested attributes
     153             :  *   nla_find()                         find attribute in stream of attributes
     154             :  *   nla_find_nested()                  find attribute in nested attributes
     155             :  *   nla_parse()                        parse and validate stream of attrs
     156             :  *   nla_parse_nested()                 parse nested attributes
     157             :  *   nla_for_each_attr()                loop over all attributes
     158             :  *   nla_for_each_nested()              loop over the nested attributes
     159             :  *=========================================================================
     160             :  */
     161             : 
     162             :  /**
     163             :   * Standard attribute types to specify validation policy
     164             :   */
     165             : enum {
     166             :         NLA_UNSPEC,
     167             :         NLA_U8,
     168             :         NLA_U16,
     169             :         NLA_U32,
     170             :         NLA_U64,
     171             :         NLA_STRING,
     172             :         NLA_FLAG,
     173             :         NLA_MSECS,
     174             :         NLA_NESTED,
     175             :         NLA_NESTED_ARRAY,
     176             :         NLA_NUL_STRING,
     177             :         NLA_BINARY,
     178             :         NLA_S8,
     179             :         NLA_S16,
     180             :         NLA_S32,
     181             :         NLA_S64,
     182             :         NLA_BITFIELD32,
     183             :         NLA_REJECT,
     184             :         __NLA_TYPE_MAX,
     185             : };
     186             : 
     187             : #define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1)
     188             : 
     189             : struct netlink_range_validation {
     190             :         u64 min, max;
     191             : };
     192             : 
     193             : struct netlink_range_validation_signed {
     194             :         s64 min, max;
     195             : };
     196             : 
     197             : enum nla_policy_validation {
     198             :         NLA_VALIDATE_NONE,
     199             :         NLA_VALIDATE_RANGE,
     200             :         NLA_VALIDATE_RANGE_WARN_TOO_LONG,
     201             :         NLA_VALIDATE_MIN,
     202             :         NLA_VALIDATE_MAX,
     203             :         NLA_VALIDATE_MASK,
     204             :         NLA_VALIDATE_RANGE_PTR,
     205             :         NLA_VALIDATE_FUNCTION,
     206             : };
     207             : 
     208             : /**
     209             :  * struct nla_policy - attribute validation policy
     210             :  * @type: Type of attribute or NLA_UNSPEC
     211             :  * @validation_type: type of attribute validation done in addition to
     212             :  *      type-specific validation (e.g. range, function call), see
     213             :  *      &enum nla_policy_validation
     214             :  * @len: Type specific length of payload
     215             :  *
     216             :  * Policies are defined as arrays of this struct, the array must be
     217             :  * accessible by attribute type up to the highest identifier to be expected.
     218             :  *
     219             :  * Meaning of `len' field:
     220             :  *    NLA_STRING           Maximum length of string
     221             :  *    NLA_NUL_STRING       Maximum length of string (excluding NUL)
     222             :  *    NLA_FLAG             Unused
     223             :  *    NLA_BINARY           Maximum length of attribute payload
     224             :  *                         (but see also below with the validation type)
     225             :  *    NLA_NESTED,
     226             :  *    NLA_NESTED_ARRAY     Length verification is done by checking len of
     227             :  *                         nested header (or empty); len field is used if
     228             :  *                         nested_policy is also used, for the max attr
     229             :  *                         number in the nested policy.
     230             :  *    NLA_U8, NLA_U16,
     231             :  *    NLA_U32, NLA_U64,
     232             :  *    NLA_S8, NLA_S16,
     233             :  *    NLA_S32, NLA_S64,
     234             :  *    NLA_MSECS            Leaving the length field zero will verify the
     235             :  *                         given type fits, using it verifies minimum length
     236             :  *                         just like "All other"
     237             :  *    NLA_BITFIELD32       Unused
     238             :  *    NLA_REJECT           Unused
     239             :  *    All other            Minimum length of attribute payload
     240             :  *
     241             :  * Meaning of validation union:
     242             :  *    NLA_BITFIELD32       This is a 32-bit bitmap/bitselector attribute and
     243             :  *                         `bitfield32_valid' is the u32 value of valid flags
     244             :  *    NLA_REJECT           This attribute is always rejected and `reject_message'
     245             :  *                         may point to a string to report as the error instead
     246             :  *                         of the generic one in extended ACK.
     247             :  *    NLA_NESTED           `nested_policy' to a nested policy to validate, must
     248             :  *                         also set `len' to the max attribute number. Use the
     249             :  *                         provided NLA_POLICY_NESTED() macro.
     250             :  *                         Note that nla_parse() will validate, but of course not
     251             :  *                         parse, the nested sub-policies.
     252             :  *    NLA_NESTED_ARRAY     `nested_policy' points to a nested policy to validate,
     253             :  *                         must also set `len' to the max attribute number. Use
     254             :  *                         the provided NLA_POLICY_NESTED_ARRAY() macro.
     255             :  *                         The difference to NLA_NESTED is the structure:
     256             :  *                         NLA_NESTED has the nested attributes directly inside
     257             :  *                         while an array has the nested attributes at another
     258             :  *                         level down and the attribute types directly in the
     259             :  *                         nesting don't matter.
     260             :  *    NLA_U8,
     261             :  *    NLA_U16,
     262             :  *    NLA_U32,
     263             :  *    NLA_U64,
     264             :  *    NLA_S8,
     265             :  *    NLA_S16,
     266             :  *    NLA_S32,
     267             :  *    NLA_S64              The `min' and `max' fields are used depending on the
     268             :  *                         validation_type field, if that is min/max/range then
     269             :  *                         the min, max or both are used (respectively) to check
     270             :  *                         the value of the integer attribute.
     271             :  *                         Note that in the interest of code simplicity and
     272             :  *                         struct size both limits are s16, so you cannot
     273             :  *                         enforce a range that doesn't fall within the range
     274             :  *                         of s16 - do that as usual in the code instead.
     275             :  *                         Use the NLA_POLICY_MIN(), NLA_POLICY_MAX() and
     276             :  *                         NLA_POLICY_RANGE() macros.
     277             :  *    NLA_U8,
     278             :  *    NLA_U16,
     279             :  *    NLA_U32,
     280             :  *    NLA_U64              If the validation_type field instead is set to
     281             :  *                         NLA_VALIDATE_RANGE_PTR, `range' must be a pointer
     282             :  *                         to a struct netlink_range_validation that indicates
     283             :  *                         the min/max values.
     284             :  *                         Use NLA_POLICY_FULL_RANGE().
     285             :  *    NLA_S8,
     286             :  *    NLA_S16,
     287             :  *    NLA_S32,
     288             :  *    NLA_S64              If the validation_type field instead is set to
     289             :  *                         NLA_VALIDATE_RANGE_PTR, `range_signed' must be a
     290             :  *                         pointer to a struct netlink_range_validation_signed
     291             :  *                         that indicates the min/max values.
     292             :  *                         Use NLA_POLICY_FULL_RANGE_SIGNED().
     293             :  *
     294             :  *    NLA_BINARY           If the validation type is like the ones for integers
     295             :  *                         above, then the min/max length (not value like for
     296             :  *                         integers) of the attribute is enforced.
     297             :  *
     298             :  *    All other            Unused - but note that it's a union
     299             :  *
     300             :  * Meaning of `validate' field, use via NLA_POLICY_VALIDATE_FN:
     301             :  *    NLA_BINARY           Validation function called for the attribute.
     302             :  *    All other            Unused - but note that it's a union
     303             :  *
     304             :  * Example:
     305             :  *
     306             :  * static const u32 myvalidflags = 0xff231023;
     307             :  *
     308             :  * static const struct nla_policy my_policy[ATTR_MAX+1] = {
     309             :  *      [ATTR_FOO] = { .type = NLA_U16 },
     310             :  *      [ATTR_BAR] = { .type = NLA_STRING, .len = BARSIZ },
     311             :  *      [ATTR_BAZ] = NLA_POLICY_EXACT_LEN(sizeof(struct mystruct)),
     312             :  *      [ATTR_GOO] = NLA_POLICY_BITFIELD32(myvalidflags),
     313             :  * };
     314             :  */
     315             : struct nla_policy {
     316             :         u8              type;
     317             :         u8              validation_type;
     318             :         u16             len;
     319             :         union {
     320             :                 const u32 bitfield32_valid;
     321             :                 const u32 mask;
     322             :                 const char *reject_message;
     323             :                 const struct nla_policy *nested_policy;
     324             :                 struct netlink_range_validation *range;
     325             :                 struct netlink_range_validation_signed *range_signed;
     326             :                 struct {
     327             :                         s16 min, max;
     328             :                 };
     329             :                 int (*validate)(const struct nlattr *attr,
     330             :                                 struct netlink_ext_ack *extack);
     331             :                 /* This entry is special, and used for the attribute at index 0
     332             :                  * only, and specifies special data about the policy, namely it
     333             :                  * specifies the "boundary type" where strict length validation
     334             :                  * starts for any attribute types >= this value, also, strict
     335             :                  * nesting validation starts here.
     336             :                  *
     337             :                  * Additionally, it means that NLA_UNSPEC is actually NLA_REJECT
     338             :                  * for any types >= this, so need to use NLA_POLICY_MIN_LEN() to
     339             :                  * get the previous pure { .len = xyz } behaviour. The advantage
     340             :                  * of this is that types not specified in the policy will be
     341             :                  * rejected.
     342             :                  *
     343             :                  * For completely new families it should be set to 1 so that the
     344             :                  * validation is enforced for all attributes. For existing ones
     345             :                  * it should be set at least when new attributes are added to
     346             :                  * the enum used by the policy, and be set to the new value that
     347             :                  * was added to enforce strict validation from thereon.
     348             :                  */
     349             :                 u16 strict_start_type;
     350             :         };
     351             : };
     352             : 
     353             : #define NLA_POLICY_ETH_ADDR             NLA_POLICY_EXACT_LEN(ETH_ALEN)
     354             : #define NLA_POLICY_ETH_ADDR_COMPAT      NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN)
     355             : 
     356             : #define _NLA_POLICY_NESTED(maxattr, policy) \
     357             :         { .type = NLA_NESTED, .nested_policy = policy, .len = maxattr }
     358             : #define _NLA_POLICY_NESTED_ARRAY(maxattr, policy) \
     359             :         { .type = NLA_NESTED_ARRAY, .nested_policy = policy, .len = maxattr }
     360             : #define NLA_POLICY_NESTED(policy) \
     361             :         _NLA_POLICY_NESTED(ARRAY_SIZE(policy) - 1, policy)
     362             : #define NLA_POLICY_NESTED_ARRAY(policy) \
     363             :         _NLA_POLICY_NESTED_ARRAY(ARRAY_SIZE(policy) - 1, policy)
     364             : #define NLA_POLICY_BITFIELD32(valid) \
     365             :         { .type = NLA_BITFIELD32, .bitfield32_valid = valid }
     366             : 
     367             : #define __NLA_IS_UINT_TYPE(tp)                                          \
     368             :         (tp == NLA_U8 || tp == NLA_U16 || tp == NLA_U32 || tp == NLA_U64)
     369             : #define __NLA_IS_SINT_TYPE(tp)                                          \
     370             :         (tp == NLA_S8 || tp == NLA_S16 || tp == NLA_S32 || tp == NLA_S64)
     371             : 
     372             : #define __NLA_ENSURE(condition) BUILD_BUG_ON_ZERO(!(condition))
     373             : #define NLA_ENSURE_UINT_TYPE(tp)                        \
     374             :         (__NLA_ENSURE(__NLA_IS_UINT_TYPE(tp)) + tp)
     375             : #define NLA_ENSURE_UINT_OR_BINARY_TYPE(tp)              \
     376             :         (__NLA_ENSURE(__NLA_IS_UINT_TYPE(tp) || \
     377             :                       tp == NLA_MSECS ||                \
     378             :                       tp == NLA_BINARY) + tp)
     379             : #define NLA_ENSURE_SINT_TYPE(tp)                        \
     380             :         (__NLA_ENSURE(__NLA_IS_SINT_TYPE(tp)) + tp)
     381             : #define NLA_ENSURE_INT_OR_BINARY_TYPE(tp)               \
     382             :         (__NLA_ENSURE(__NLA_IS_UINT_TYPE(tp) ||         \
     383             :                       __NLA_IS_SINT_TYPE(tp) ||         \
     384             :                       tp == NLA_MSECS ||                \
     385             :                       tp == NLA_BINARY) + tp)
     386             : #define NLA_ENSURE_NO_VALIDATION_PTR(tp)                \
     387             :         (__NLA_ENSURE(tp != NLA_BITFIELD32 &&           \
     388             :                       tp != NLA_REJECT &&               \
     389             :                       tp != NLA_NESTED &&               \
     390             :                       tp != NLA_NESTED_ARRAY) + tp)
     391             : 
     392             : #define NLA_POLICY_RANGE(tp, _min, _max) {              \
     393             :         .type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp),      \
     394             :         .validation_type = NLA_VALIDATE_RANGE,          \
     395             :         .min = _min,                                    \
     396             :         .max = _max                                     \
     397             : }
     398             : 
     399             : #define NLA_POLICY_FULL_RANGE(tp, _range) {             \
     400             :         .type = NLA_ENSURE_UINT_OR_BINARY_TYPE(tp),     \
     401             :         .validation_type = NLA_VALIDATE_RANGE_PTR,      \
     402             :         .range = _range,                                \
     403             : }
     404             : 
     405             : #define NLA_POLICY_FULL_RANGE_SIGNED(tp, _range) {      \
     406             :         .type = NLA_ENSURE_SINT_TYPE(tp),               \
     407             :         .validation_type = NLA_VALIDATE_RANGE_PTR,      \
     408             :         .range_signed = _range,                         \
     409             : }
     410             : 
     411             : #define NLA_POLICY_MIN(tp, _min) {                      \
     412             :         .type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp),      \
     413             :         .validation_type = NLA_VALIDATE_MIN,            \
     414             :         .min = _min,                                    \
     415             : }
     416             : 
     417             : #define NLA_POLICY_MAX(tp, _max) {                      \
     418             :         .type = NLA_ENSURE_INT_OR_BINARY_TYPE(tp),      \
     419             :         .validation_type = NLA_VALIDATE_MAX,            \
     420             :         .max = _max,                                    \
     421             : }
     422             : 
     423             : #define NLA_POLICY_MASK(tp, _mask) {                    \
     424             :         .type = NLA_ENSURE_UINT_TYPE(tp),               \
     425             :         .validation_type = NLA_VALIDATE_MASK,           \
     426             :         .mask = _mask,                                  \
     427             : }
     428             : 
     429             : #define NLA_POLICY_VALIDATE_FN(tp, fn, ...) {           \
     430             :         .type = NLA_ENSURE_NO_VALIDATION_PTR(tp),       \
     431             :         .validation_type = NLA_VALIDATE_FUNCTION,       \
     432             :         .validate = fn,                                 \
     433             :         .len = __VA_ARGS__ + 0,                         \
     434             : }
     435             : 
     436             : #define NLA_POLICY_EXACT_LEN(_len)      NLA_POLICY_RANGE(NLA_BINARY, _len, _len)
     437             : #define NLA_POLICY_EXACT_LEN_WARN(_len) {                       \
     438             :         .type = NLA_BINARY,                                     \
     439             :         .validation_type = NLA_VALIDATE_RANGE_WARN_TOO_LONG,    \
     440             :         .min = _len,                                            \
     441             :         .max = _len                                             \
     442             : }
     443             : #define NLA_POLICY_MIN_LEN(_len)        NLA_POLICY_MIN(NLA_BINARY, _len)
     444             : 
     445             : /**
     446             :  * struct nl_info - netlink source information
     447             :  * @nlh: Netlink message header of original request
     448             :  * @nl_net: Network namespace
     449             :  * @portid: Netlink PORTID of requesting application
     450             :  * @skip_notify: Skip netlink notifications to user space
     451             :  * @skip_notify_kernel: Skip selected in-kernel notifications
     452             :  */
     453             : struct nl_info {
     454             :         struct nlmsghdr         *nlh;
     455             :         struct net              *nl_net;
     456             :         u32                     portid;
     457             :         u8                      skip_notify:1,
     458             :                                 skip_notify_kernel:1;
     459             : };
     460             : 
     461             : /**
     462             :  * enum netlink_validation - netlink message/attribute validation levels
     463             :  * @NL_VALIDATE_LIBERAL: Old-style "be liberal" validation, not caring about
     464             :  *      extra data at the end of the message, attributes being longer than
     465             :  *      they should be, or unknown attributes being present.
     466             :  * @NL_VALIDATE_TRAILING: Reject junk data encountered after attribute parsing.
     467             :  * @NL_VALIDATE_MAXTYPE: Reject attributes > max type; Together with _TRAILING
     468             :  *      this is equivalent to the old nla_parse_strict()/nlmsg_parse_strict().
     469             :  * @NL_VALIDATE_UNSPEC: Reject attributes with NLA_UNSPEC in the policy.
     470             :  *      This can safely be set by the kernel when the given policy has no
     471             :  *      NLA_UNSPEC anymore, and can thus be used to ensure policy entries
     472             :  *      are enforced going forward.
     473             :  * @NL_VALIDATE_STRICT_ATTRS: strict attribute policy parsing (e.g.
     474             :  *      U8, U16, U32 must have exact size, etc.)
     475             :  * @NL_VALIDATE_NESTED: Check that NLA_F_NESTED is set for NLA_NESTED(_ARRAY)
     476             :  *      and unset for other policies.
     477             :  */
     478             : enum netlink_validation {
     479             :         NL_VALIDATE_LIBERAL = 0,
     480             :         NL_VALIDATE_TRAILING = BIT(0),
     481             :         NL_VALIDATE_MAXTYPE = BIT(1),
     482             :         NL_VALIDATE_UNSPEC = BIT(2),
     483             :         NL_VALIDATE_STRICT_ATTRS = BIT(3),
     484             :         NL_VALIDATE_NESTED = BIT(4),
     485             : };
     486             : 
     487             : #define NL_VALIDATE_DEPRECATED_STRICT (NL_VALIDATE_TRAILING |\
     488             :                                        NL_VALIDATE_MAXTYPE)
     489             : #define NL_VALIDATE_STRICT (NL_VALIDATE_TRAILING |\
     490             :                             NL_VALIDATE_MAXTYPE |\
     491             :                             NL_VALIDATE_UNSPEC |\
     492             :                             NL_VALIDATE_STRICT_ATTRS |\
     493             :                             NL_VALIDATE_NESTED)
     494             : 
     495             : int netlink_rcv_skb(struct sk_buff *skb,
     496             :                     int (*cb)(struct sk_buff *, struct nlmsghdr *,
     497             :                               struct netlink_ext_ack *));
     498             : int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,
     499             :                  unsigned int group, int report, gfp_t flags);
     500             : 
     501             : int __nla_validate(const struct nlattr *head, int len, int maxtype,
     502             :                    const struct nla_policy *policy, unsigned int validate,
     503             :                    struct netlink_ext_ack *extack);
     504             : int __nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head,
     505             :                 int len, const struct nla_policy *policy, unsigned int validate,
     506             :                 struct netlink_ext_ack *extack);
     507             : int nla_policy_len(const struct nla_policy *, int);
     508             : struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype);
     509             : ssize_t nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize);
     510             : char *nla_strdup(const struct nlattr *nla, gfp_t flags);
     511             : int nla_memcpy(void *dest, const struct nlattr *src, int count);
     512             : int nla_memcmp(const struct nlattr *nla, const void *data, size_t size);
     513             : int nla_strcmp(const struct nlattr *nla, const char *str);
     514             : struct nlattr *__nla_reserve(struct sk_buff *skb, int attrtype, int attrlen);
     515             : struct nlattr *__nla_reserve_64bit(struct sk_buff *skb, int attrtype,
     516             :                                    int attrlen, int padattr);
     517             : void *__nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
     518             : struct nlattr *nla_reserve(struct sk_buff *skb, int attrtype, int attrlen);
     519             : struct nlattr *nla_reserve_64bit(struct sk_buff *skb, int attrtype,
     520             :                                  int attrlen, int padattr);
     521             : void *nla_reserve_nohdr(struct sk_buff *skb, int attrlen);
     522             : void __nla_put(struct sk_buff *skb, int attrtype, int attrlen,
     523             :                const void *data);
     524             : void __nla_put_64bit(struct sk_buff *skb, int attrtype, int attrlen,
     525             :                      const void *data, int padattr);
     526             : void __nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data);
     527             : int nla_put(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
     528             : int nla_put_64bit(struct sk_buff *skb, int attrtype, int attrlen,
     529             :                   const void *data, int padattr);
     530             : int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data);
     531             : int nla_append(struct sk_buff *skb, int attrlen, const void *data);
     532             : 
     533             : /**************************************************************************
     534             :  * Netlink Messages
     535             :  **************************************************************************/
     536             : 
     537             : /**
     538             :  * nlmsg_msg_size - length of netlink message not including padding
     539             :  * @payload: length of message payload
     540             :  */
     541         619 : static inline int nlmsg_msg_size(int payload)
     542             : {
     543         158 :         return NLMSG_HDRLEN + payload;
     544             : }
     545             : 
     546             : /**
     547             :  * nlmsg_total_size - length of netlink message including padding
     548             :  * @payload: length of message payload
     549             :  */
     550         463 : static inline int nlmsg_total_size(int payload)
     551             : {
     552         433 :         return NLMSG_ALIGN(nlmsg_msg_size(payload));
     553             : }
     554             : 
     555             : /**
     556             :  * nlmsg_padlen - length of padding at the message's tail
     557             :  * @payload: length of message payload
     558             :  */
     559             : static inline int nlmsg_padlen(int payload)
     560             : {
     561             :         return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
     562             : }
     563             : 
     564             : /**
     565             :  * nlmsg_data - head of message payload
     566             :  * @nlh: netlink message header
     567             :  */
     568         341 : static inline void *nlmsg_data(const struct nlmsghdr *nlh)
     569             : {
     570         312 :         return (unsigned char *) nlh + NLMSG_HDRLEN;
     571             : }
     572             : 
     573             : /**
     574             :  * nlmsg_len - length of message payload
     575             :  * @nlh: netlink message header
     576             :  */
     577          95 : static inline int nlmsg_len(const struct nlmsghdr *nlh)
     578             : {
     579          68 :         return nlh->nlmsg_len - NLMSG_HDRLEN;
     580             : }
     581             : 
     582             : /**
     583             :  * nlmsg_attrdata - head of attributes data
     584             :  * @nlh: netlink message header
     585             :  * @hdrlen: length of family specific header
     586             :  */
     587          29 : static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh,
     588             :                                             int hdrlen)
     589             : {
     590          29 :         unsigned char *data = nlmsg_data(nlh);
     591          29 :         return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
     592             : }
     593             : 
     594             : /**
     595             :  * nlmsg_attrlen - length of attributes data
     596             :  * @nlh: netlink message header
     597             :  * @hdrlen: length of family specific header
     598             :  */
     599          29 : static inline int nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen)
     600             : {
     601           2 :         return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
     602             : }
     603             : 
     604             : /**
     605             :  * nlmsg_ok - check if the netlink message fits into the remaining bytes
     606             :  * @nlh: netlink message header
     607             :  * @remaining: number of bytes remaining in message stream
     608             :  */
     609             : static inline int nlmsg_ok(const struct nlmsghdr *nlh, int remaining)
     610             : {
     611             :         return (remaining >= (int) sizeof(struct nlmsghdr) &&
     612             :                 nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
     613             :                 nlh->nlmsg_len <= remaining);
     614             : }
     615             : 
     616             : /**
     617             :  * nlmsg_next - next netlink message in message stream
     618             :  * @nlh: netlink message header
     619             :  * @remaining: number of bytes remaining in message stream
     620             :  *
     621             :  * Returns the next netlink message in the message stream and
     622             :  * decrements remaining by the size of the current message.
     623             :  */
     624             : static inline struct nlmsghdr *
     625             : nlmsg_next(const struct nlmsghdr *nlh, int *remaining)
     626             : {
     627             :         int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
     628             : 
     629             :         *remaining -= totlen;
     630             : 
     631             :         return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
     632             : }
     633             : 
     634             : /**
     635             :  * nla_parse - Parse a stream of attributes into a tb buffer
     636             :  * @tb: destination array with maxtype+1 elements
     637             :  * @maxtype: maximum attribute type to be expected
     638             :  * @head: head of attribute stream
     639             :  * @len: length of attribute stream
     640             :  * @policy: validation policy
     641             :  * @extack: extended ACK pointer
     642             :  *
     643             :  * Parses a stream of attributes and stores a pointer to each attribute in
     644             :  * the tb array accessible via the attribute type. Attributes with a type
     645             :  * exceeding maxtype will be rejected, policy must be specified, attributes
     646             :  * will be validated in the strictest way possible.
     647             :  *
     648             :  * Returns 0 on success or a negative error code.
     649             :  */
     650             : static inline int nla_parse(struct nlattr **tb, int maxtype,
     651             :                             const struct nlattr *head, int len,
     652             :                             const struct nla_policy *policy,
     653             :                             struct netlink_ext_ack *extack)
     654             : {
     655             :         return __nla_parse(tb, maxtype, head, len, policy,
     656             :                            NL_VALIDATE_STRICT, extack);
     657             : }
     658             : 
     659             : /**
     660             :  * nla_parse_deprecated - Parse a stream of attributes into a tb buffer
     661             :  * @tb: destination array with maxtype+1 elements
     662             :  * @maxtype: maximum attribute type to be expected
     663             :  * @head: head of attribute stream
     664             :  * @len: length of attribute stream
     665             :  * @policy: validation policy
     666             :  * @extack: extended ACK pointer
     667             :  *
     668             :  * Parses a stream of attributes and stores a pointer to each attribute in
     669             :  * the tb array accessible via the attribute type. Attributes with a type
     670             :  * exceeding maxtype will be ignored and attributes from the policy are not
     671             :  * always strictly validated (only for new attributes).
     672             :  *
     673             :  * Returns 0 on success or a negative error code.
     674             :  */
     675           0 : static inline int nla_parse_deprecated(struct nlattr **tb, int maxtype,
     676             :                                        const struct nlattr *head, int len,
     677             :                                        const struct nla_policy *policy,
     678             :                                        struct netlink_ext_ack *extack)
     679             : {
     680           0 :         return __nla_parse(tb, maxtype, head, len, policy,
     681             :                            NL_VALIDATE_LIBERAL, extack);
     682             : }
     683             : 
     684             : /**
     685             :  * nla_parse_deprecated_strict - Parse a stream of attributes into a tb buffer
     686             :  * @tb: destination array with maxtype+1 elements
     687             :  * @maxtype: maximum attribute type to be expected
     688             :  * @head: head of attribute stream
     689             :  * @len: length of attribute stream
     690             :  * @policy: validation policy
     691             :  * @extack: extended ACK pointer
     692             :  *
     693             :  * Parses a stream of attributes and stores a pointer to each attribute in
     694             :  * the tb array accessible via the attribute type. Attributes with a type
     695             :  * exceeding maxtype will be rejected as well as trailing data, but the
     696             :  * policy is not completely strictly validated (only for new attributes).
     697             :  *
     698             :  * Returns 0 on success or a negative error code.
     699             :  */
     700             : static inline int nla_parse_deprecated_strict(struct nlattr **tb, int maxtype,
     701             :                                               const struct nlattr *head,
     702             :                                               int len,
     703             :                                               const struct nla_policy *policy,
     704             :                                               struct netlink_ext_ack *extack)
     705             : {
     706             :         return __nla_parse(tb, maxtype, head, len, policy,
     707             :                            NL_VALIDATE_DEPRECATED_STRICT, extack);
     708             : }
     709             : 
     710             : /**
     711             :  * __nlmsg_parse - parse attributes of a netlink message
     712             :  * @nlh: netlink message header
     713             :  * @hdrlen: length of family specific header
     714             :  * @tb: destination array with maxtype+1 elements
     715             :  * @maxtype: maximum attribute type to be expected
     716             :  * @policy: validation policy
     717             :  * @validate: validation strictness
     718             :  * @extack: extended ACK report struct
     719             :  *
     720             :  * See nla_parse()
     721             :  */
     722          25 : static inline int __nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
     723             :                                 struct nlattr *tb[], int maxtype,
     724             :                                 const struct nla_policy *policy,
     725             :                                 unsigned int validate,
     726             :                                 struct netlink_ext_ack *extack)
     727             : {
     728          25 :         if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen)) {
     729           0 :                 NL_SET_ERR_MSG(extack, "Invalid header length");
     730           0 :                 return -EINVAL;
     731             :         }
     732             : 
     733          25 :         return __nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
     734             :                            nlmsg_attrlen(nlh, hdrlen), policy, validate,
     735             :                            extack);
     736             : }
     737             : 
     738             : /**
     739             :  * nlmsg_parse - parse attributes of a netlink message
     740             :  * @nlh: netlink message header
     741             :  * @hdrlen: length of family specific header
     742             :  * @tb: destination array with maxtype+1 elements
     743             :  * @maxtype: maximum attribute type to be expected
     744             :  * @extack: extended ACK report struct
     745             :  *
     746             :  * See nla_parse()
     747             :  */
     748           0 : static inline int nlmsg_parse(const struct nlmsghdr *nlh, int hdrlen,
     749             :                               struct nlattr *tb[], int maxtype,
     750             :                               const struct nla_policy *policy,
     751             :                               struct netlink_ext_ack *extack)
     752             : {
     753           0 :         return __nlmsg_parse(nlh, hdrlen, tb, maxtype, policy,
     754             :                              NL_VALIDATE_STRICT, extack);
     755             : }
     756             : 
     757             : /**
     758             :  * nlmsg_parse_deprecated - parse attributes of a netlink message
     759             :  * @nlh: netlink message header
     760             :  * @hdrlen: length of family specific header
     761             :  * @tb: destination array with maxtype+1 elements
     762             :  * @maxtype: maximum attribute type to be expected
     763             :  * @extack: extended ACK report struct
     764             :  *
     765             :  * See nla_parse_deprecated()
     766             :  */
     767          25 : static inline int nlmsg_parse_deprecated(const struct nlmsghdr *nlh, int hdrlen,
     768             :                                          struct nlattr *tb[], int maxtype,
     769             :                                          const struct nla_policy *policy,
     770             :                                          struct netlink_ext_ack *extack)
     771             : {
     772          25 :         return __nlmsg_parse(nlh, hdrlen, tb, maxtype, policy,
     773             :                              NL_VALIDATE_LIBERAL, extack);
     774             : }
     775             : 
     776             : /**
     777             :  * nlmsg_parse_deprecated_strict - parse attributes of a netlink message
     778             :  * @nlh: netlink message header
     779             :  * @hdrlen: length of family specific header
     780             :  * @tb: destination array with maxtype+1 elements
     781             :  * @maxtype: maximum attribute type to be expected
     782             :  * @extack: extended ACK report struct
     783             :  *
     784             :  * See nla_parse_deprecated_strict()
     785             :  */
     786             : static inline int
     787           0 : nlmsg_parse_deprecated_strict(const struct nlmsghdr *nlh, int hdrlen,
     788             :                               struct nlattr *tb[], int maxtype,
     789             :                               const struct nla_policy *policy,
     790             :                               struct netlink_ext_ack *extack)
     791             : {
     792           0 :         return __nlmsg_parse(nlh, hdrlen, tb, maxtype, policy,
     793             :                              NL_VALIDATE_DEPRECATED_STRICT, extack);
     794             : }
     795             : 
     796             : /**
     797             :  * nlmsg_find_attr - find a specific attribute in a netlink message
     798             :  * @nlh: netlink message header
     799             :  * @hdrlen: length of familiy specific header
     800             :  * @attrtype: type of attribute to look for
     801             :  *
     802             :  * Returns the first attribute which matches the specified type.
     803             :  */
     804           0 : static inline struct nlattr *nlmsg_find_attr(const struct nlmsghdr *nlh,
     805             :                                              int hdrlen, int attrtype)
     806             : {
     807           0 :         return nla_find(nlmsg_attrdata(nlh, hdrlen),
     808             :                         nlmsg_attrlen(nlh, hdrlen), attrtype);
     809             : }
     810             : 
     811             : /**
     812             :  * nla_validate_deprecated - Validate a stream of attributes
     813             :  * @head: head of attribute stream
     814             :  * @len: length of attribute stream
     815             :  * @maxtype: maximum attribute type to be expected
     816             :  * @policy: validation policy
     817             :  * @validate: validation strictness
     818             :  * @extack: extended ACK report struct
     819             :  *
     820             :  * Validates all attributes in the specified attribute stream against the
     821             :  * specified policy. Validation is done in liberal mode.
     822             :  * See documenation of struct nla_policy for more details.
     823             :  *
     824             :  * Returns 0 on success or a negative error code.
     825             :  */
     826             : static inline int nla_validate_deprecated(const struct nlattr *head, int len,
     827             :                                           int maxtype,
     828             :                                           const struct nla_policy *policy,
     829             :                                           struct netlink_ext_ack *extack)
     830             : {
     831             :         return __nla_validate(head, len, maxtype, policy, NL_VALIDATE_LIBERAL,
     832             :                               extack);
     833             : }
     834             : 
     835             : /**
     836             :  * nla_validate - Validate a stream of attributes
     837             :  * @head: head of attribute stream
     838             :  * @len: length of attribute stream
     839             :  * @maxtype: maximum attribute type to be expected
     840             :  * @policy: validation policy
     841             :  * @extack: extended ACK report struct
     842             :  *
     843             :  * Validates all attributes in the specified attribute stream against the
     844             :  * specified policy. Validation is done in strict mode.
     845             :  * See documenation of struct nla_policy for more details.
     846             :  *
     847             :  * Returns 0 on success or a negative error code.
     848             :  */
     849           0 : static inline int nla_validate(const struct nlattr *head, int len, int maxtype,
     850             :                                const struct nla_policy *policy,
     851             :                                struct netlink_ext_ack *extack)
     852             : {
     853           0 :         return __nla_validate(head, len, maxtype, policy, NL_VALIDATE_STRICT,
     854             :                               extack);
     855             : }
     856             : 
     857             : /**
     858             :  * nlmsg_validate_deprecated - validate a netlink message including attributes
     859             :  * @nlh: netlinket message header
     860             :  * @hdrlen: length of familiy specific header
     861             :  * @maxtype: maximum attribute type to be expected
     862             :  * @policy: validation policy
     863             :  * @extack: extended ACK report struct
     864             :  */
     865           2 : static inline int nlmsg_validate_deprecated(const struct nlmsghdr *nlh,
     866             :                                             int hdrlen, int maxtype,
     867             :                                             const struct nla_policy *policy,
     868             :                                             struct netlink_ext_ack *extack)
     869             : {
     870           2 :         if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
     871             :                 return -EINVAL;
     872             : 
     873           2 :         return __nla_validate(nlmsg_attrdata(nlh, hdrlen),
     874             :                               nlmsg_attrlen(nlh, hdrlen), maxtype,
     875             :                               policy, NL_VALIDATE_LIBERAL, extack);
     876             : }
     877             : 
     878             : 
     879             : 
     880             : /**
     881             :  * nlmsg_report - need to report back to application?
     882             :  * @nlh: netlink message header
     883             :  *
     884             :  * Returns 1 if a report back to the application is requested.
     885             :  */
     886           4 : static inline int nlmsg_report(const struct nlmsghdr *nlh)
     887             : {
     888           4 :         return !!(nlh->nlmsg_flags & NLM_F_ECHO);
     889             : }
     890             : 
     891             : /**
     892             :  * nlmsg_for_each_attr - iterate over a stream of attributes
     893             :  * @pos: loop counter, set to current attribute
     894             :  * @nlh: netlink message header
     895             :  * @hdrlen: length of familiy specific header
     896             :  * @rem: initialized to len, holds bytes currently remaining in stream
     897             :  */
     898             : #define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
     899             :         nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
     900             :                           nlmsg_attrlen(nlh, hdrlen), rem)
     901             : 
     902             : /**
     903             :  * nlmsg_put - Add a new netlink message to an skb
     904             :  * @skb: socket buffer to store message in
     905             :  * @portid: netlink PORTID of requesting application
     906             :  * @seq: sequence number of message
     907             :  * @type: message type
     908             :  * @payload: length of message payload
     909             :  * @flags: message flags
     910             :  *
     911             :  * Returns NULL if the tailroom of the skb is insufficient to store
     912             :  * the message header and payload.
     913             :  */
     914         119 : static inline struct nlmsghdr *nlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
     915             :                                          int type, int payload, int flags)
     916             : {
     917         238 :         if (unlikely(skb_tailroom(skb) < nlmsg_total_size(payload)))
     918             :                 return NULL;
     919             : 
     920         119 :         return __nlmsg_put(skb, portid, seq, type, payload, flags);
     921             : }
     922             : 
     923             : /**
     924             :  * nlmsg_put_answer - Add a new callback based netlink message to an skb
     925             :  * @skb: socket buffer to store message in
     926             :  * @cb: netlink callback
     927             :  * @type: message type
     928             :  * @payload: length of message payload
     929             :  * @flags: message flags
     930             :  *
     931             :  * Returns NULL if the tailroom of the skb is insufficient to store
     932             :  * the message header and payload.
     933             :  */
     934          33 : static inline struct nlmsghdr *nlmsg_put_answer(struct sk_buff *skb,
     935             :                                                 struct netlink_callback *cb,
     936             :                                                 int type, int payload,
     937             :                                                 int flags)
     938             : {
     939          33 :         return nlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
     940             :                          type, payload, flags);
     941             : }
     942             : 
     943             : /**
     944             :  * nlmsg_new - Allocate a new netlink message
     945             :  * @payload: size of the message payload
     946             :  * @flags: the type of memory to allocate.
     947             :  *
     948             :  * Use NLMSG_DEFAULT_SIZE if the size of the payload isn't known
     949             :  * and a good default is needed.
     950             :  */
     951          39 : static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags)
     952             : {
     953          39 :         return alloc_skb(nlmsg_total_size(payload), flags);
     954             : }
     955             : 
     956             : /**
     957             :  * nlmsg_end - Finalize a netlink message
     958             :  * @skb: socket buffer the message is stored in
     959             :  * @nlh: netlink message header
     960             :  *
     961             :  * Corrects the netlink message header to include the appeneded
     962             :  * attributes. Only necessary if attributes have been added to
     963             :  * the message.
     964             :  */
     965          96 : static inline void nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh)
     966             : {
     967          96 :         nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh;
     968           0 : }
     969             : 
     970             : /**
     971             :  * nlmsg_get_pos - return current position in netlink message
     972             :  * @skb: socket buffer the message is stored in
     973             :  *
     974             :  * Returns a pointer to the current tail of the message.
     975             :  */
     976             : static inline void *nlmsg_get_pos(struct sk_buff *skb)
     977             : {
     978             :         return skb_tail_pointer(skb);
     979             : }
     980             : 
     981             : /**
     982             :  * nlmsg_trim - Trim message to a mark
     983             :  * @skb: socket buffer the message is stored in
     984             :  * @mark: mark to trim to
     985             :  *
     986             :  * Trims the message to the provided mark.
     987             :  */
     988          16 : static inline void nlmsg_trim(struct sk_buff *skb, const void *mark)
     989             : {
     990          16 :         if (mark) {
     991          16 :                 WARN_ON((unsigned char *) mark < skb->data);
     992          16 :                 skb_trim(skb, (unsigned char *) mark - skb->data);
     993             :         }
     994          16 : }
     995             : 
     996             : /**
     997             :  * nlmsg_cancel - Cancel construction of a netlink message
     998             :  * @skb: socket buffer the message is stored in
     999             :  * @nlh: netlink message header
    1000             :  *
    1001             :  * Removes the complete netlink message including all
    1002             :  * attributes from the socket buffer again.
    1003             :  */
    1004           0 : static inline void nlmsg_cancel(struct sk_buff *skb, struct nlmsghdr *nlh)
    1005             : {
    1006           0 :         nlmsg_trim(skb, nlh);
    1007           0 : }
    1008             : 
    1009             : /**
    1010             :  * nlmsg_free - free a netlink message
    1011             :  * @skb: socket buffer of netlink message
    1012             :  */
    1013           0 : static inline void nlmsg_free(struct sk_buff *skb)
    1014             : {
    1015           0 :         kfree_skb(skb);
    1016           0 : }
    1017             : 
    1018             : /**
    1019             :  * nlmsg_multicast - multicast a netlink message
    1020             :  * @sk: netlink socket to spread messages to
    1021             :  * @skb: netlink message as socket buffer
    1022             :  * @portid: own netlink portid to avoid sending to yourself
    1023             :  * @group: multicast group id
    1024             :  * @flags: allocation flags
    1025             :  */
    1026          29 : static inline int nlmsg_multicast(struct sock *sk, struct sk_buff *skb,
    1027             :                                   u32 portid, unsigned int group, gfp_t flags)
    1028             : {
    1029          29 :         int err;
    1030             : 
    1031          29 :         NETLINK_CB(skb).dst_group = group;
    1032             : 
    1033          29 :         err = netlink_broadcast(sk, skb, portid, group, flags);
    1034          29 :         if (err > 0)
    1035             :                 err = 0;
    1036             : 
    1037          29 :         return err;
    1038             : }
    1039             : 
    1040             : /**
    1041             :  * nlmsg_unicast - unicast a netlink message
    1042             :  * @sk: netlink socket to spread message to
    1043             :  * @skb: netlink message as socket buffer
    1044             :  * @portid: netlink portid of the destination socket
    1045             :  */
    1046           0 : static inline int nlmsg_unicast(struct sock *sk, struct sk_buff *skb, u32 portid)
    1047             : {
    1048           0 :         int err;
    1049             : 
    1050           0 :         err = netlink_unicast(sk, skb, portid, MSG_DONTWAIT);
    1051           0 :         if (err > 0)
    1052             :                 err = 0;
    1053             : 
    1054           0 :         return err;
    1055             : }
    1056             : 
    1057             : /**
    1058             :  * nlmsg_for_each_msg - iterate over a stream of messages
    1059             :  * @pos: loop counter, set to current message
    1060             :  * @head: head of message stream
    1061             :  * @len: length of message stream
    1062             :  * @rem: initialized to len, holds bytes currently remaining in stream
    1063             :  */
    1064             : #define nlmsg_for_each_msg(pos, head, len, rem) \
    1065             :         for (pos = head, rem = len; \
    1066             :              nlmsg_ok(pos, rem); \
    1067             :              pos = nlmsg_next(pos, &(rem)))
    1068             : 
    1069             : /**
    1070             :  * nl_dump_check_consistent - check if sequence is consistent and advertise if not
    1071             :  * @cb: netlink callback structure that stores the sequence number
    1072             :  * @nlh: netlink message header to write the flag to
    1073             :  *
    1074             :  * This function checks if the sequence (generation) number changed during dump
    1075             :  * and if it did, advertises it in the netlink message header.
    1076             :  *
    1077             :  * The correct way to use it is to set cb->seq to the generation counter when
    1078             :  * all locks for dumping have been acquired, and then call this function for
    1079             :  * each message that is generated.
    1080             :  *
    1081             :  * Note that due to initialisation concerns, 0 is an invalid sequence number
    1082             :  * and must not be used by code that uses this functionality.
    1083             :  */
    1084             : static inline void
    1085          81 : nl_dump_check_consistent(struct netlink_callback *cb,
    1086             :                          struct nlmsghdr *nlh)
    1087             : {
    1088          81 :         if (cb->prev_seq && cb->seq != cb->prev_seq)
    1089           0 :                 nlh->nlmsg_flags |= NLM_F_DUMP_INTR;
    1090          81 :         cb->prev_seq = cb->seq;
    1091           0 : }
    1092             : 
    1093             : /**************************************************************************
    1094             :  * Netlink Attributes
    1095             :  **************************************************************************/
    1096             : 
    1097             : /**
    1098             :  * nla_attr_size - length of attribute not including padding
    1099             :  * @payload: length of payload
    1100             :  */
    1101        3781 : static inline int nla_attr_size(int payload)
    1102             : {
    1103        3754 :         return NLA_HDRLEN + payload;
    1104             : }
    1105             : 
    1106             : /**
    1107             :  * nla_total_size - total length of attribute including padding
    1108             :  * @payload: length of payload
    1109             :  */
    1110        3781 : static inline int nla_total_size(int payload)
    1111             : {
    1112        1826 :         return NLA_ALIGN(nla_attr_size(payload));
    1113             : }
    1114             : 
    1115             : /**
    1116             :  * nla_padlen - length of padding at the tail of attribute
    1117             :  * @payload: length of payload
    1118             :  */
    1119         860 : static inline int nla_padlen(int payload)
    1120             : {
    1121         860 :         return nla_total_size(payload) - nla_attr_size(payload);
    1122             : }
    1123             : 
    1124             : /**
    1125             :  * nla_type - attribute type
    1126             :  * @nla: netlink attribute
    1127             :  */
    1128          30 : static inline int nla_type(const struct nlattr *nla)
    1129             : {
    1130          18 :         return nla->nla_type & NLA_TYPE_MASK;
    1131             : }
    1132             : 
    1133             : /**
    1134             :  * nla_data - head of payload
    1135             :  * @nla: netlink attribute
    1136             :  */
    1137        1337 : static inline void *nla_data(const struct nlattr *nla)
    1138             : {
    1139         515 :         return (char *) nla + NLA_HDRLEN;
    1140             : }
    1141             : 
    1142             : /**
    1143             :  * nla_len - length of payload
    1144             :  * @nla: netlink attribute
    1145             :  */
    1146          13 : static inline int nla_len(const struct nlattr *nla)
    1147             : {
    1148          13 :         return nla->nla_len - NLA_HDRLEN;
    1149             : }
    1150             : 
    1151             : /**
    1152             :  * nla_ok - check if the netlink attribute fits into the remaining bytes
    1153             :  * @nla: netlink attribute
    1154             :  * @remaining: number of bytes remaining in attribute stream
    1155             :  */
    1156          47 : static inline int nla_ok(const struct nlattr *nla, int remaining)
    1157             : {
    1158          65 :         return remaining >= (int) sizeof(*nla) &&
    1159          47 :                nla->nla_len >= sizeof(*nla) &&
    1160          18 :                nla->nla_len <= remaining;
    1161             : }
    1162             : 
    1163             : /**
    1164             :  * nla_next - next netlink attribute in attribute stream
    1165             :  * @nla: netlink attribute
    1166             :  * @remaining: number of bytes remaining in attribute stream
    1167             :  *
    1168             :  * Returns the next netlink attribute in the attribute stream and
    1169             :  * decrements remaining by the size of the current attribute.
    1170             :  */
    1171          18 : static inline struct nlattr *nla_next(const struct nlattr *nla, int *remaining)
    1172             : {
    1173          18 :         unsigned int totlen = NLA_ALIGN(nla->nla_len);
    1174             : 
    1175          18 :         *remaining -= totlen;
    1176          18 :         return (struct nlattr *) ((char *) nla + totlen);
    1177             : }
    1178             : 
    1179             : /**
    1180             :  * nla_find_nested - find attribute in a set of nested attributes
    1181             :  * @nla: attribute containing the nested attributes
    1182             :  * @attrtype: type of attribute to look for
    1183             :  *
    1184             :  * Returns the first attribute which matches the specified type.
    1185             :  */
    1186             : static inline struct nlattr *
    1187           0 : nla_find_nested(const struct nlattr *nla, int attrtype)
    1188             : {
    1189           0 :         return nla_find(nla_data(nla), nla_len(nla), attrtype);
    1190             : }
    1191             : 
    1192             : /**
    1193             :  * nla_parse_nested - parse nested attributes
    1194             :  * @tb: destination array with maxtype+1 elements
    1195             :  * @maxtype: maximum attribute type to be expected
    1196             :  * @nla: attribute containing the nested attributes
    1197             :  * @policy: validation policy
    1198             :  * @extack: extended ACK report struct
    1199             :  *
    1200             :  * See nla_parse()
    1201             :  */
    1202             : static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
    1203             :                                    const struct nlattr *nla,
    1204             :                                    const struct nla_policy *policy,
    1205             :                                    struct netlink_ext_ack *extack)
    1206             : {
    1207             :         if (!(nla->nla_type & NLA_F_NESTED)) {
    1208             :                 NL_SET_ERR_MSG_ATTR(extack, nla, "NLA_F_NESTED is missing");
    1209             :                 return -EINVAL;
    1210             :         }
    1211             : 
    1212             :         return __nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy,
    1213             :                            NL_VALIDATE_STRICT, extack);
    1214             : }
    1215             : 
    1216             : /**
    1217             :  * nla_parse_nested_deprecated - parse nested attributes
    1218             :  * @tb: destination array with maxtype+1 elements
    1219             :  * @maxtype: maximum attribute type to be expected
    1220             :  * @nla: attribute containing the nested attributes
    1221             :  * @policy: validation policy
    1222             :  * @extack: extended ACK report struct
    1223             :  *
    1224             :  * See nla_parse_deprecated()
    1225             :  */
    1226           0 : static inline int nla_parse_nested_deprecated(struct nlattr *tb[], int maxtype,
    1227             :                                               const struct nlattr *nla,
    1228             :                                               const struct nla_policy *policy,
    1229             :                                               struct netlink_ext_ack *extack)
    1230             : {
    1231           0 :         return __nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy,
    1232             :                            NL_VALIDATE_LIBERAL, extack);
    1233             : }
    1234             : 
    1235             : /**
    1236             :  * nla_put_u8 - Add a u8 netlink attribute to a socket buffer
    1237             :  * @skb: socket buffer to add attribute to
    1238             :  * @attrtype: attribute type
    1239             :  * @value: numeric value
    1240             :  */
    1241          80 : static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
    1242             : {
    1243             :         /* temporary variables to work around GCC PR81715 with asan-stack=1 */
    1244          80 :         u8 tmp = value;
    1245             : 
    1246          80 :         return nla_put(skb, attrtype, sizeof(u8), &tmp);
    1247             : }
    1248             : 
    1249             : /**
    1250             :  * nla_put_u16 - Add a u16 netlink attribute to a socket buffer
    1251             :  * @skb: socket buffer to add attribute to
    1252             :  * @attrtype: attribute type
    1253             :  * @value: numeric value
    1254             :  */
    1255           2 : static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
    1256             : {
    1257           2 :         u16 tmp = value;
    1258             : 
    1259           2 :         return nla_put(skb, attrtype, sizeof(u16), &tmp);
    1260             : }
    1261             : 
    1262             : /**
    1263             :  * nla_put_be16 - Add a __be16 netlink attribute to a socket buffer
    1264             :  * @skb: socket buffer to add attribute to
    1265             :  * @attrtype: attribute type
    1266             :  * @value: numeric value
    1267             :  */
    1268             : static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
    1269             : {
    1270             :         __be16 tmp = value;
    1271             : 
    1272             :         return nla_put(skb, attrtype, sizeof(__be16), &tmp);
    1273             : }
    1274             : 
    1275             : /**
    1276             :  * nla_put_net16 - Add 16-bit network byte order netlink attribute to a socket buffer
    1277             :  * @skb: socket buffer to add attribute to
    1278             :  * @attrtype: attribute type
    1279             :  * @value: numeric value
    1280             :  */
    1281             : static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value)
    1282             : {
    1283             :         __be16 tmp = value;
    1284             : 
    1285             :         return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
    1286             : }
    1287             : 
    1288             : /**
    1289             :  * nla_put_le16 - Add a __le16 netlink attribute to a socket buffer
    1290             :  * @skb: socket buffer to add attribute to
    1291             :  * @attrtype: attribute type
    1292             :  * @value: numeric value
    1293             :  */
    1294             : static inline int nla_put_le16(struct sk_buff *skb, int attrtype, __le16 value)
    1295             : {
    1296             :         __le16 tmp = value;
    1297             : 
    1298             :         return nla_put(skb, attrtype, sizeof(__le16), &tmp);
    1299             : }
    1300             : 
    1301             : /**
    1302             :  * nla_put_u32 - Add a u32 netlink attribute to a socket buffer
    1303             :  * @skb: socket buffer to add attribute to
    1304             :  * @attrtype: attribute type
    1305             :  * @value: numeric value
    1306             :  */
    1307         306 : static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
    1308             : {
    1309         306 :         u32 tmp = value;
    1310             : 
    1311         306 :         return nla_put(skb, attrtype, sizeof(u32), &tmp);
    1312             : }
    1313             : 
    1314             : /**
    1315             :  * nla_put_be32 - Add a __be32 netlink attribute to a socket buffer
    1316             :  * @skb: socket buffer to add attribute to
    1317             :  * @attrtype: attribute type
    1318             :  * @value: numeric value
    1319             :  */
    1320         122 : static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
    1321             : {
    1322         122 :         __be32 tmp = value;
    1323             : 
    1324         122 :         return nla_put(skb, attrtype, sizeof(__be32), &tmp);
    1325             : }
    1326             : 
    1327             : /**
    1328             :  * nla_put_net32 - Add 32-bit network byte order netlink attribute to a socket buffer
    1329             :  * @skb: socket buffer to add attribute to
    1330             :  * @attrtype: attribute type
    1331             :  * @value: numeric value
    1332             :  */
    1333             : static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
    1334             : {
    1335             :         __be32 tmp = value;
    1336             : 
    1337             :         return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
    1338             : }
    1339             : 
    1340             : /**
    1341             :  * nla_put_le32 - Add a __le32 netlink attribute to a socket buffer
    1342             :  * @skb: socket buffer to add attribute to
    1343             :  * @attrtype: attribute type
    1344             :  * @value: numeric value
    1345             :  */
    1346             : static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
    1347             : {
    1348             :         __le32 tmp = value;
    1349             : 
    1350             :         return nla_put(skb, attrtype, sizeof(__le32), &tmp);
    1351             : }
    1352             : 
    1353             : /**
    1354             :  * nla_put_u64_64bit - Add a u64 netlink attribute to a skb and align it
    1355             :  * @skb: socket buffer to add attribute to
    1356             :  * @attrtype: attribute type
    1357             :  * @value: numeric value
    1358             :  * @padattr: attribute type for the padding
    1359             :  */
    1360           0 : static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
    1361             :                                     u64 value, int padattr)
    1362             : {
    1363           0 :         u64 tmp = value;
    1364             : 
    1365           0 :         return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
    1366             : }
    1367             : 
    1368             : /**
    1369             :  * nla_put_be64 - Add a __be64 netlink attribute to a socket buffer and align it
    1370             :  * @skb: socket buffer to add attribute to
    1371             :  * @attrtype: attribute type
    1372             :  * @value: numeric value
    1373             :  * @padattr: attribute type for the padding
    1374             :  */
    1375             : static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
    1376             :                                int padattr)
    1377             : {
    1378             :         __be64 tmp = value;
    1379             : 
    1380             :         return nla_put_64bit(skb, attrtype, sizeof(__be64), &tmp, padattr);
    1381             : }
    1382             : 
    1383             : /**
    1384             :  * nla_put_net64 - Add 64-bit network byte order nlattr to a skb and align it
    1385             :  * @skb: socket buffer to add attribute to
    1386             :  * @attrtype: attribute type
    1387             :  * @value: numeric value
    1388             :  * @padattr: attribute type for the padding
    1389             :  */
    1390             : static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
    1391             :                                 int padattr)
    1392             : {
    1393             :         __be64 tmp = value;
    1394             : 
    1395             :         return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, tmp,
    1396             :                             padattr);
    1397             : }
    1398             : 
    1399             : /**
    1400             :  * nla_put_le64 - Add a __le64 netlink attribute to a socket buffer and align it
    1401             :  * @skb: socket buffer to add attribute to
    1402             :  * @attrtype: attribute type
    1403             :  * @value: numeric value
    1404             :  * @padattr: attribute type for the padding
    1405             :  */
    1406             : static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
    1407             :                                int padattr)
    1408             : {
    1409             :         __le64 tmp = value;
    1410             : 
    1411             :         return nla_put_64bit(skb, attrtype, sizeof(__le64), &tmp, padattr);
    1412             : }
    1413             : 
    1414             : /**
    1415             :  * nla_put_s8 - Add a s8 netlink attribute to a socket buffer
    1416             :  * @skb: socket buffer to add attribute to
    1417             :  * @attrtype: attribute type
    1418             :  * @value: numeric value
    1419             :  */
    1420             : static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
    1421             : {
    1422             :         s8 tmp = value;
    1423             : 
    1424             :         return nla_put(skb, attrtype, sizeof(s8), &tmp);
    1425             : }
    1426             : 
    1427             : /**
    1428             :  * nla_put_s16 - Add a s16 netlink attribute to a socket buffer
    1429             :  * @skb: socket buffer to add attribute to
    1430             :  * @attrtype: attribute type
    1431             :  * @value: numeric value
    1432             :  */
    1433             : static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
    1434             : {
    1435             :         s16 tmp = value;
    1436             : 
    1437             :         return nla_put(skb, attrtype, sizeof(s16), &tmp);
    1438             : }
    1439             : 
    1440             : /**
    1441             :  * nla_put_s32 - Add a s32 netlink attribute to a socket buffer
    1442             :  * @skb: socket buffer to add attribute to
    1443             :  * @attrtype: attribute type
    1444             :  * @value: numeric value
    1445             :  */
    1446          28 : static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
    1447             : {
    1448          28 :         s32 tmp = value;
    1449             : 
    1450          28 :         return nla_put(skb, attrtype, sizeof(s32), &tmp);
    1451             : }
    1452             : 
    1453             : /**
    1454             :  * nla_put_s64 - Add a s64 netlink attribute to a socket buffer and align it
    1455             :  * @skb: socket buffer to add attribute to
    1456             :  * @attrtype: attribute type
    1457             :  * @value: numeric value
    1458             :  * @padattr: attribute type for the padding
    1459             :  */
    1460           0 : static inline int nla_put_s64(struct sk_buff *skb, int attrtype, s64 value,
    1461             :                               int padattr)
    1462             : {
    1463           0 :         s64 tmp = value;
    1464             : 
    1465           0 :         return nla_put_64bit(skb, attrtype, sizeof(s64), &tmp, padattr);
    1466             : }
    1467             : 
    1468             : /**
    1469             :  * nla_put_string - Add a string netlink attribute to a socket buffer
    1470             :  * @skb: socket buffer to add attribute to
    1471             :  * @attrtype: attribute type
    1472             :  * @str: NUL terminated string
    1473             :  */
    1474          72 : static inline int nla_put_string(struct sk_buff *skb, int attrtype,
    1475             :                                  const char *str)
    1476             : {
    1477          72 :         return nla_put(skb, attrtype, strlen(str) + 1, str);
    1478             : }
    1479             : 
    1480             : /**
    1481             :  * nla_put_flag - Add a flag netlink attribute to a socket buffer
    1482             :  * @skb: socket buffer to add attribute to
    1483             :  * @attrtype: attribute type
    1484             :  */
    1485           0 : static inline int nla_put_flag(struct sk_buff *skb, int attrtype)
    1486             : {
    1487           0 :         return nla_put(skb, attrtype, 0, NULL);
    1488             : }
    1489             : 
    1490             : /**
    1491             :  * nla_put_msecs - Add a msecs netlink attribute to a skb and align it
    1492             :  * @skb: socket buffer to add attribute to
    1493             :  * @attrtype: attribute type
    1494             :  * @njiffies: number of jiffies to convert to msecs
    1495             :  * @padattr: attribute type for the padding
    1496             :  */
    1497           0 : static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
    1498             :                                 unsigned long njiffies, int padattr)
    1499             : {
    1500           0 :         u64 tmp = jiffies_to_msecs(njiffies);
    1501             : 
    1502           0 :         return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
    1503             : }
    1504             : 
    1505             : /**
    1506             :  * nla_put_in_addr - Add an IPv4 address netlink attribute to a socket
    1507             :  * buffer
    1508             :  * @skb: socket buffer to add attribute to
    1509             :  * @attrtype: attribute type
    1510             :  * @addr: IPv4 address
    1511             :  */
    1512         122 : static inline int nla_put_in_addr(struct sk_buff *skb, int attrtype,
    1513             :                                   __be32 addr)
    1514             : {
    1515         122 :         __be32 tmp = addr;
    1516             : 
    1517         122 :         return nla_put_be32(skb, attrtype, tmp);
    1518             : }
    1519             : 
    1520             : /**
    1521             :  * nla_put_in6_addr - Add an IPv6 address netlink attribute to a socket
    1522             :  * buffer
    1523             :  * @skb: socket buffer to add attribute to
    1524             :  * @attrtype: attribute type
    1525             :  * @addr: IPv6 address
    1526             :  */
    1527           0 : static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype,
    1528             :                                    const struct in6_addr *addr)
    1529             : {
    1530           0 :         return nla_put(skb, attrtype, sizeof(*addr), addr);
    1531             : }
    1532             : 
    1533             : /**
    1534             :  * nla_put_bitfield32 - Add a bitfield32 netlink attribute to a socket buffer
    1535             :  * @skb: socket buffer to add attribute to
    1536             :  * @attrtype: attribute type
    1537             :  * @value: value carrying bits
    1538             :  * @selector: selector of valid bits
    1539             :  */
    1540             : static inline int nla_put_bitfield32(struct sk_buff *skb, int attrtype,
    1541             :                                      __u32 value, __u32 selector)
    1542             : {
    1543             :         struct nla_bitfield32 tmp = { value, selector, };
    1544             : 
    1545             :         return nla_put(skb, attrtype, sizeof(tmp), &tmp);
    1546             : }
    1547             : 
    1548             : /**
    1549             :  * nla_get_u32 - return payload of u32 attribute
    1550             :  * @nla: u32 netlink attribute
    1551             :  */
    1552           3 : static inline u32 nla_get_u32(const struct nlattr *nla)
    1553             : {
    1554           3 :         return *(u32 *) nla_data(nla);
    1555             : }
    1556             : 
    1557             : /**
    1558             :  * nla_get_be32 - return payload of __be32 attribute
    1559             :  * @nla: __be32 netlink attribute
    1560             :  */
    1561           3 : static inline __be32 nla_get_be32(const struct nlattr *nla)
    1562             : {
    1563           3 :         return *(__be32 *) nla_data(nla);
    1564             : }
    1565             : 
    1566             : /**
    1567             :  * nla_get_le32 - return payload of __le32 attribute
    1568             :  * @nla: __le32 netlink attribute
    1569             :  */
    1570             : static inline __le32 nla_get_le32(const struct nlattr *nla)
    1571             : {
    1572             :         return *(__le32 *) nla_data(nla);
    1573             : }
    1574             : 
    1575             : /**
    1576             :  * nla_get_u16 - return payload of u16 attribute
    1577             :  * @nla: u16 netlink attribute
    1578             :  */
    1579           0 : static inline u16 nla_get_u16(const struct nlattr *nla)
    1580             : {
    1581           0 :         return *(u16 *) nla_data(nla);
    1582             : }
    1583             : 
    1584             : /**
    1585             :  * nla_get_be16 - return payload of __be16 attribute
    1586             :  * @nla: __be16 netlink attribute
    1587             :  */
    1588           0 : static inline __be16 nla_get_be16(const struct nlattr *nla)
    1589             : {
    1590           0 :         return *(__be16 *) nla_data(nla);
    1591             : }
    1592             : 
    1593             : /**
    1594             :  * nla_get_le16 - return payload of __le16 attribute
    1595             :  * @nla: __le16 netlink attribute
    1596             :  */
    1597             : static inline __le16 nla_get_le16(const struct nlattr *nla)
    1598             : {
    1599             :         return *(__le16 *) nla_data(nla);
    1600             : }
    1601             : 
    1602             : /**
    1603             :  * nla_get_u8 - return payload of u8 attribute
    1604             :  * @nla: u8 netlink attribute
    1605             :  */
    1606           0 : static inline u8 nla_get_u8(const struct nlattr *nla)
    1607             : {
    1608           0 :         return *(u8 *) nla_data(nla);
    1609             : }
    1610             : 
    1611             : /**
    1612             :  * nla_get_u64 - return payload of u64 attribute
    1613             :  * @nla: u64 netlink attribute
    1614             :  */
    1615           0 : static inline u64 nla_get_u64(const struct nlattr *nla)
    1616             : {
    1617           0 :         u64 tmp;
    1618             : 
    1619           0 :         nla_memcpy(&tmp, nla, sizeof(tmp));
    1620             : 
    1621           0 :         return tmp;
    1622             : }
    1623             : 
    1624             : /**
    1625             :  * nla_get_be64 - return payload of __be64 attribute
    1626             :  * @nla: __be64 netlink attribute
    1627             :  */
    1628             : static inline __be64 nla_get_be64(const struct nlattr *nla)
    1629             : {
    1630             :         __be64 tmp;
    1631             : 
    1632             :         nla_memcpy(&tmp, nla, sizeof(tmp));
    1633             : 
    1634             :         return tmp;
    1635             : }
    1636             : 
    1637             : /**
    1638             :  * nla_get_le64 - return payload of __le64 attribute
    1639             :  * @nla: __le64 netlink attribute
    1640             :  */
    1641             : static inline __le64 nla_get_le64(const struct nlattr *nla)
    1642             : {
    1643             :         return *(__le64 *) nla_data(nla);
    1644             : }
    1645             : 
    1646             : /**
    1647             :  * nla_get_s32 - return payload of s32 attribute
    1648             :  * @nla: s32 netlink attribute
    1649             :  */
    1650           0 : static inline s32 nla_get_s32(const struct nlattr *nla)
    1651             : {
    1652           0 :         return *(s32 *) nla_data(nla);
    1653             : }
    1654             : 
    1655             : /**
    1656             :  * nla_get_s16 - return payload of s16 attribute
    1657             :  * @nla: s16 netlink attribute
    1658             :  */
    1659           0 : static inline s16 nla_get_s16(const struct nlattr *nla)
    1660             : {
    1661           0 :         return *(s16 *) nla_data(nla);
    1662             : }
    1663             : 
    1664             : /**
    1665             :  * nla_get_s8 - return payload of s8 attribute
    1666             :  * @nla: s8 netlink attribute
    1667             :  */
    1668           0 : static inline s8 nla_get_s8(const struct nlattr *nla)
    1669             : {
    1670           0 :         return *(s8 *) nla_data(nla);
    1671             : }
    1672             : 
    1673             : /**
    1674             :  * nla_get_s64 - return payload of s64 attribute
    1675             :  * @nla: s64 netlink attribute
    1676             :  */
    1677           0 : static inline s64 nla_get_s64(const struct nlattr *nla)
    1678             : {
    1679           0 :         s64 tmp;
    1680             : 
    1681           0 :         nla_memcpy(&tmp, nla, sizeof(tmp));
    1682             : 
    1683           0 :         return tmp;
    1684             : }
    1685             : 
    1686             : /**
    1687             :  * nla_get_flag - return payload of flag attribute
    1688             :  * @nla: flag netlink attribute
    1689             :  */
    1690           0 : static inline int nla_get_flag(const struct nlattr *nla)
    1691             : {
    1692           0 :         return !!nla;
    1693             : }
    1694             : 
    1695             : /**
    1696             :  * nla_get_msecs - return payload of msecs attribute
    1697             :  * @nla: msecs netlink attribute
    1698             :  *
    1699             :  * Returns the number of milliseconds in jiffies.
    1700             :  */
    1701           0 : static inline unsigned long nla_get_msecs(const struct nlattr *nla)
    1702             : {
    1703           0 :         u64 msecs = nla_get_u64(nla);
    1704             : 
    1705           0 :         return msecs_to_jiffies((unsigned long) msecs);
    1706             : }
    1707             : 
    1708             : /**
    1709             :  * nla_get_in_addr - return payload of IPv4 address attribute
    1710             :  * @nla: IPv4 address netlink attribute
    1711             :  */
    1712           3 : static inline __be32 nla_get_in_addr(const struct nlattr *nla)
    1713             : {
    1714           2 :         return *(__be32 *) nla_data(nla);
    1715             : }
    1716             : 
    1717             : /**
    1718             :  * nla_get_in6_addr - return payload of IPv6 address attribute
    1719             :  * @nla: IPv6 address netlink attribute
    1720             :  */
    1721           0 : static inline struct in6_addr nla_get_in6_addr(const struct nlattr *nla)
    1722             : {
    1723           0 :         struct in6_addr tmp;
    1724             : 
    1725           0 :         nla_memcpy(&tmp, nla, sizeof(tmp));
    1726           0 :         return tmp;
    1727             : }
    1728             : 
    1729             : /**
    1730             :  * nla_get_bitfield32 - return payload of 32 bitfield attribute
    1731             :  * @nla: nla_bitfield32 attribute
    1732             :  */
    1733             : static inline struct nla_bitfield32 nla_get_bitfield32(const struct nlattr *nla)
    1734             : {
    1735             :         struct nla_bitfield32 tmp;
    1736             : 
    1737             :         nla_memcpy(&tmp, nla, sizeof(tmp));
    1738             :         return tmp;
    1739             : }
    1740             : 
    1741             : /**
    1742             :  * nla_memdup - duplicate attribute memory (kmemdup)
    1743             :  * @src: netlink attribute to duplicate from
    1744             :  * @gfp: GFP mask
    1745             :  */
    1746             : static inline void *nla_memdup(const struct nlattr *src, gfp_t gfp)
    1747             : {
    1748             :         return kmemdup(nla_data(src), nla_len(src), gfp);
    1749             : }
    1750             : 
    1751             : /**
    1752             :  * nla_nest_start_noflag - Start a new level of nested attributes
    1753             :  * @skb: socket buffer to add attributes to
    1754             :  * @attrtype: attribute type of container
    1755             :  *
    1756             :  * This function exists for backward compatibility to use in APIs which never
    1757             :  * marked their nest attributes with NLA_F_NESTED flag. New APIs should use
    1758             :  * nla_nest_start() which sets the flag.
    1759             :  *
    1760             :  * Returns the container attribute or NULL on error
    1761             :  */
    1762          69 : static inline struct nlattr *nla_nest_start_noflag(struct sk_buff *skb,
    1763             :                                                    int attrtype)
    1764             : {
    1765          69 :         struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
    1766             : 
    1767          69 :         if (nla_put(skb, attrtype, 0, NULL) < 0)
    1768           0 :                 return NULL;
    1769             : 
    1770             :         return start;
    1771             : }
    1772             : 
    1773             : /**
    1774             :  * nla_nest_start - Start a new level of nested attributes, with NLA_F_NESTED
    1775             :  * @skb: socket buffer to add attributes to
    1776             :  * @attrtype: attribute type of container
    1777             :  *
    1778             :  * Unlike nla_nest_start_noflag(), mark the nest attribute with NLA_F_NESTED
    1779             :  * flag. This is the preferred function to use in new code.
    1780             :  *
    1781             :  * Returns the container attribute or NULL on error
    1782             :  */
    1783          16 : static inline struct nlattr *nla_nest_start(struct sk_buff *skb, int attrtype)
    1784             : {
    1785          16 :         return nla_nest_start_noflag(skb, attrtype | NLA_F_NESTED);
    1786             : }
    1787             : 
    1788             : /**
    1789             :  * nla_nest_end - Finalize nesting of attributes
    1790             :  * @skb: socket buffer the attributes are stored in
    1791             :  * @start: container attribute
    1792             :  *
    1793             :  * Corrects the container attribute header to include the all
    1794             :  * appeneded attributes.
    1795             :  *
    1796             :  * Returns the total data length of the skb.
    1797             :  */
    1798          53 : static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
    1799             : {
    1800          53 :         start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
    1801          53 :         return skb->len;
    1802             : }
    1803             : 
    1804             : /**
    1805             :  * nla_nest_cancel - Cancel nesting of attributes
    1806             :  * @skb: socket buffer the message is stored in
    1807             :  * @start: container attribute
    1808             :  *
    1809             :  * Removes the container attribute and including all nested
    1810             :  * attributes. Returns -EMSGSIZE
    1811             :  */
    1812          16 : static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start)
    1813             : {
    1814          16 :         nlmsg_trim(skb, start);
    1815           0 : }
    1816             : 
    1817             : /**
    1818             :  * __nla_validate_nested - Validate a stream of nested attributes
    1819             :  * @start: container attribute
    1820             :  * @maxtype: maximum attribute type to be expected
    1821             :  * @policy: validation policy
    1822             :  * @validate: validation strictness
    1823             :  * @extack: extended ACK report struct
    1824             :  *
    1825             :  * Validates all attributes in the nested attribute stream against the
    1826             :  * specified policy. Attributes with a type exceeding maxtype will be
    1827             :  * ignored. See documenation of struct nla_policy for more details.
    1828             :  *
    1829             :  * Returns 0 on success or a negative error code.
    1830             :  */
    1831             : static inline int __nla_validate_nested(const struct nlattr *start, int maxtype,
    1832             :                                         const struct nla_policy *policy,
    1833             :                                         unsigned int validate,
    1834             :                                         struct netlink_ext_ack *extack)
    1835             : {
    1836             :         return __nla_validate(nla_data(start), nla_len(start), maxtype, policy,
    1837             :                               validate, extack);
    1838             : }
    1839             : 
    1840             : static inline int
    1841             : nla_validate_nested(const struct nlattr *start, int maxtype,
    1842             :                     const struct nla_policy *policy,
    1843             :                     struct netlink_ext_ack *extack)
    1844             : {
    1845             :         return __nla_validate_nested(start, maxtype, policy,
    1846             :                                      NL_VALIDATE_STRICT, extack);
    1847             : }
    1848             : 
    1849             : static inline int
    1850             : nla_validate_nested_deprecated(const struct nlattr *start, int maxtype,
    1851             :                                const struct nla_policy *policy,
    1852             :                                struct netlink_ext_ack *extack)
    1853             : {
    1854             :         return __nla_validate_nested(start, maxtype, policy,
    1855             :                                      NL_VALIDATE_LIBERAL, extack);
    1856             : }
    1857             : 
    1858             : /**
    1859             :  * nla_need_padding_for_64bit - test 64-bit alignment of the next attribute
    1860             :  * @skb: socket buffer the message is stored in
    1861             :  *
    1862             :  * Return true if padding is needed to align the next attribute (nla_data()) to
    1863             :  * a 64-bit aligned area.
    1864             :  */
    1865          64 : static inline bool nla_need_padding_for_64bit(struct sk_buff *skb)
    1866             : {
    1867             : #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
    1868             :         /* The nlattr header is 4 bytes in size, that's why we test
    1869             :          * if the skb->data _is_ aligned.  A NOP attribute, plus
    1870             :          * nlattr header for next attribute, will make nla_data()
    1871             :          * 8-byte aligned.
    1872             :          */
    1873             :         if (IS_ALIGNED((unsigned long)skb_tail_pointer(skb), 8))
    1874             :                 return true;
    1875             : #endif
    1876          32 :         return false;
    1877             : }
    1878             : 
    1879             : /**
    1880             :  * nla_align_64bit - 64-bit align the nla_data() of next attribute
    1881             :  * @skb: socket buffer the message is stored in
    1882             :  * @padattr: attribute type for the padding
    1883             :  *
    1884             :  * Conditionally emit a padding netlink attribute in order to make
    1885             :  * the next attribute we emit have a 64-bit aligned nla_data() area.
    1886             :  * This will only be done in architectures which do not have
    1887             :  * CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS defined.
    1888             :  *
    1889             :  * Returns zero on success or a negative error code.
    1890             :  */
    1891          32 : static inline int nla_align_64bit(struct sk_buff *skb, int padattr)
    1892             : {
    1893          32 :         if (nla_need_padding_for_64bit(skb) &&
    1894             :             !nla_reserve(skb, padattr, 0))
    1895             :                 return -EMSGSIZE;
    1896             : 
    1897          32 :         return 0;
    1898             : }
    1899             : 
    1900             : /**
    1901             :  * nla_total_size_64bit - total length of attribute including padding
    1902             :  * @payload: length of payload
    1903             :  */
    1904        1111 : static inline int nla_total_size_64bit(int payload)
    1905             : {
    1906        1111 :         return NLA_ALIGN(nla_attr_size(payload))
    1907             : #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
    1908             :                 + NLA_ALIGN(nla_attr_size(0))
    1909             : #endif
    1910             :                 ;
    1911             : }
    1912             : 
    1913             : /**
    1914             :  * nla_for_each_attr - iterate over a stream of attributes
    1915             :  * @pos: loop counter, set to current attribute
    1916             :  * @head: head of attribute stream
    1917             :  * @len: length of attribute stream
    1918             :  * @rem: initialized to len, holds bytes currently remaining in stream
    1919             :  */
    1920             : #define nla_for_each_attr(pos, head, len, rem) \
    1921             :         for (pos = head, rem = len; \
    1922             :              nla_ok(pos, rem); \
    1923             :              pos = nla_next(pos, &(rem)))
    1924             : 
    1925             : /**
    1926             :  * nla_for_each_nested - iterate over nested attributes
    1927             :  * @pos: loop counter, set to current attribute
    1928             :  * @nla: attribute containing the nested attributes
    1929             :  * @rem: initialized to len, holds bytes currently remaining in stream
    1930             :  */
    1931             : #define nla_for_each_nested(pos, nla, rem) \
    1932             :         nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem)
    1933             : 
    1934             : /**
    1935             :  * nla_is_last - Test if attribute is last in stream
    1936             :  * @nla: attribute to test
    1937             :  * @rem: bytes remaining in stream
    1938             :  */
    1939             : static inline bool nla_is_last(const struct nlattr *nla, int rem)
    1940             : {
    1941             :         return nla->nla_len == rem;
    1942             : }
    1943             : 
    1944             : void nla_get_range_unsigned(const struct nla_policy *pt,
    1945             :                             struct netlink_range_validation *range);
    1946             : void nla_get_range_signed(const struct nla_policy *pt,
    1947             :                           struct netlink_range_validation_signed *range);
    1948             : 
    1949             : struct netlink_policy_dump_state;
    1950             : 
    1951             : int netlink_policy_dump_add_policy(struct netlink_policy_dump_state **pstate,
    1952             :                                    const struct nla_policy *policy,
    1953             :                                    unsigned int maxtype);
    1954             : int netlink_policy_dump_get_policy_idx(struct netlink_policy_dump_state *state,
    1955             :                                        const struct nla_policy *policy,
    1956             :                                        unsigned int maxtype);
    1957             : bool netlink_policy_dump_loop(struct netlink_policy_dump_state *state);
    1958             : int netlink_policy_dump_write(struct sk_buff *skb,
    1959             :                               struct netlink_policy_dump_state *state);
    1960             : int netlink_policy_dump_attr_size_estimate(const struct nla_policy *pt);
    1961             : int netlink_policy_dump_write_attr(struct sk_buff *skb,
    1962             :                                    const struct nla_policy *pt,
    1963             :                                    int nestattr);
    1964             : void netlink_policy_dump_free(struct netlink_policy_dump_state *state);
    1965             : 
    1966             : #endif

Generated by: LCOV version 1.14