1 #ifndef __NET_NETLINK_WRAPPER_H
2 #define __NET_NETLINK_WRAPPER_H 1
4 #include <linux/version.h>
5 #include_next <net/netlink.h>
7 #ifndef HAVE_NLA_NUL_STRING
8 static inline int VERIFY_NUL_STRING(struct nlattr *attr, int maxlen)
20 if (s[len - 1] != '\0')
26 static inline int VERIFY_NUL_STRING(struct nlattr *attr, int maxlen)
30 #endif /* !HAVE_NLA_NUL_STRING */
33 #define NLA_PUT_BE16(skb, attrtype, value) \
34 NLA_PUT_TYPE(skb, __be16, attrtype, value)
35 #endif /* !NLA_PUT_BE16 */
38 #define NLA_PUT_BE32(skb, attrtype, value) \
39 NLA_PUT_TYPE(skb, __be32, attrtype, value)
40 #endif /* !NLA_PUT_BE32 */
43 #define NLA_PUT_BE64(skb, attrtype, value) \
44 NLA_PUT_TYPE(skb, __be64, attrtype, value)
45 #endif /* !NLA_PUT_BE64 */
47 #ifndef HAVE_NLA_GET_BE16
49 * nla_get_be16 - return payload of __be16 attribute
50 * @nla: __be16 netlink attribute
52 static inline __be16 nla_get_be16(const struct nlattr *nla)
54 return *(__be16 *) nla_data(nla);
56 #endif /* !HAVE_NLA_GET_BE16 */
58 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
60 * nla_get_be32 - return payload of __be32 attribute
61 * @nla: __be32 netlink attribute
63 static inline __be32 nla_get_be32(const struct nlattr *nla)
65 return *(__be32 *) nla_data(nla);
69 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
70 /* These functions' nlattr source arguments weren't "const" before 2.6.29, so
71 * cast their arguments to the non-"const" versions. Using macros for this
72 * isn't exactly a brilliant idea, but it seems less error-prone than copying
73 * the definitions of all umpteen functions. */
74 #define nla_get_u64(nla) (nla_get_u64) ((struct nlattr *) (nla))
75 #define nla_get_u32(nla) (nla_get_u32) ((struct nlattr *) (nla))
76 #define nla_get_u16(nla) (nla_get_u16) ((struct nlattr *) (nla))
77 #define nla_get_u8(nla) (nla_get_u8) ((struct nlattr *) (nla))
78 /* nla_get_be64 is handled separately below. */
79 #define nla_get_be32(nla) (nla_get_be32) ((struct nlattr *) (nla))
80 #define nla_get_be16(nla) (nla_get_be16) ((struct nlattr *) (nla))
81 #define nla_get_be8(nla) (nla_get_be8) ((struct nlattr *) (nla))
82 #define nla_get_flag(nla) (nla_get_flag) ((struct nlattr *) (nla))
83 #define nla_get_msecs(nla) (nla_get_msecs)((struct nlattr *) (nla))
84 #define nla_memcpy(dst, src, count) \
85 (nla_memcpy)(dst, (struct nlattr *)(src), count)
88 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
89 /* This function was introduced in 2.6.31, but initially it performed an
90 * unaligned access, so we replace it up to 2.6.34 where it was fixed. */
91 #define nla_get_be64 rpl_nla_get_be64
92 static inline __be64 nla_get_be64(const struct nlattr *nla)
96 /* The additional cast is necessary because */
97 nla_memcpy(&tmp, (struct nlattr *) nla, sizeof(tmp));
103 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
105 * nla_type - attribute type
106 * @nla: netlink attribute
108 static inline int nla_type(const struct nlattr *nla)
110 return nla->nla_type & NLA_TYPE_MASK;
114 /* The following nla_put_be{16,32,64} functions are not in any version of Linux
115 * (although NLA_PUT_BE{16,32,64} are), so we will probably want to add them
116 * as part of the patch series when we submit Open vSwitch upstream. */
119 * nla_put_be16 - Add a be16 netlink attribute to a socket buffer
120 * @skb: socket buffer to add attribute to
121 * @attrtype: attribute type
122 * @value: numeric value
124 static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
126 return nla_put(skb, attrtype, sizeof(__be16), &value);
130 * nla_put_be32 - Add a be32 netlink attribute to a socket buffer
131 * @skb: socket buffer to add attribute to
132 * @attrtype: attribute type
133 * @value: numeric value
135 static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
137 return nla_put(skb, attrtype, sizeof(__be32), &value);
141 * nla_put_64 - Add a be64 netlink attribute to a socket buffer
142 * @skb: socket buffer to add attribute to
143 * @attrtype: attribute type
144 * @value: numeric value
146 static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value)
148 return nla_put(skb, attrtype, sizeof(__be64), &value);
151 #endif /* net/netlink.h */