^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