]>
git.proxmox.com Git - mirror_ovs.git/blob - datapath/linux/compat/include/net/netlink.h
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 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
8 /* Before v2.6.29, a NLA_NESTED attribute, if it was present, was not allowed
9 * to be empty. However, OVS depends on the ability to accept empty
10 * attributes. For example, a present but empty ODP_FLOW_ATTR_ACTIONS on
11 * ODP_FLOW_CMD_SET replaces the existing set of actions by an empty "drop"
12 * action, whereas a missing ODP_FLOW_ATTR_ACTIONS leaves the existing
13 * actions, if any, unchanged.
15 * NLA_NESTED is different from NLA_UNSPEC in only two ways:
17 * - If the size of the nested attributes is zero, no further size checks
20 * - If the size of the nested attributes is not zero and no length
21 * parameter is specified the minimum size of nested attributes is
24 * nla_parse_nested() validates that there is at least enough space for
25 * NLA_HDRLEN, so neither of these conditions are important, and we might
26 * as well use NLA_UNSPEC with old kernels.
29 #define NLA_NESTED NLA_UNSPEC
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 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
115 #define nla_parse_nested(tb, maxtype, nla, policy) \
116 nla_parse_nested(tb, maxtype, (struct nlattr *)(nla), (struct nla_policy *)(policy))
117 #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
118 #define nla_parse_nested(tb, maxtype, nla, policy) \
119 nla_parse_nested(tb, maxtype, (struct nlattr *)(nla), policy)
122 #ifndef nla_for_each_nested
123 #define nla_for_each_nested(pos, nla, rem) \
124 nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem)
127 #ifndef HAVE_NLA_FIND_NESTED
128 static inline struct nlattr
*nla_find_nested(struct nlattr
*nla
, int attrtype
)
130 return nla_find(nla_data(nla
), nla_len(nla
), attrtype
);
134 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
136 * nlmsg_report - need to report back to application?
137 * @nlh: netlink message header
139 * Returns 1 if a report back to the application is requested.
141 static inline int nlmsg_report(const struct nlmsghdr
*nlh
)
143 return !!(nlh
->nlmsg_flags
& NLM_F_ECHO
);
146 extern int nlmsg_notify(struct sock
*sk
, struct sk_buff
*skb
,
147 u32 pid
, unsigned int group
, int report
,
149 #endif /* linux kernel < 2.6.19 */
151 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
152 /* Before 2.6.19 the 'flags' parameter was missing, so replace it. We have to
153 * #include <net/genetlink.h> first because the 2.6.18 version of that header
154 * has an inline call to nlmsg_multicast() without, of course, any 'flags'
156 #define nlmsg_multicast rpl_nlmsg_multicast
157 static inline int nlmsg_multicast(struct sock
*sk
, struct sk_buff
*skb
,
158 u32 pid
, unsigned int group
, gfp_t flags
)
162 NETLINK_CB(skb
).dst_group
= group
;
164 err
= netlink_broadcast(sk
, skb
, pid
, group
, flags
);
170 #endif /* linux kernel < 2.6.19 */
172 #endif /* net/netlink.h */