Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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