From 7c6244783982509fddd62b3296bc627943bb7a1a Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 7 Dec 2010 09:37:59 -0800 Subject: [PATCH] netlink: New function nl_attr_type(). Linux since v2.6.24 has a couple of couple of bits at the top of nla_type that one is apparently supposed to ignore. This commit starts doing that in Open vSwitch userspace. Acked-by: Jesse Gross --- lib/netlink-protocol.h | 7 +++++++ lib/netlink.c | 12 ++++++++++-- lib/netlink.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/netlink-protocol.h b/lib/netlink-protocol.h index 77f5c8965..6281fb2c3 100644 --- a/lib/netlink-protocol.h +++ b/lib/netlink-protocol.h @@ -150,4 +150,11 @@ enum { #define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1) #endif /* !HAVE_NETLINK */ +/* These were introduced all together in 2.6.24. */ +#ifndef NLA_TYPE_MASK +#define NLA_F_NESTED (1 << 15) +#define NLA_F_NET_BYTEORDER (1 << 14) +#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) +#endif + #endif /* netlink-protocol.h */ diff --git a/lib/netlink.c b/lib/netlink.c index 3ed2f53a9..f1234ad48 100644 --- a/lib/netlink.c +++ b/lib/netlink.c @@ -358,6 +358,14 @@ nl_msg_next(struct ofpbuf *buffer, struct ofpbuf *msg) /* Attributes. */ +/* Returns the bits of 'nla->nla_type' that are significant for determining its + * type. */ +int +nl_attr_type(const struct nlattr *nla) +{ + return nla->nla_type & NLA_TYPE_MASK; +} + /* Returns the first byte in the payload of attribute 'nla'. */ const void * nl_attr_get(const struct nlattr *nla) @@ -539,12 +547,12 @@ nl_policy_parse(const struct ofpbuf *msg, size_t nla_offset, if (aligned_len > (char*)tail - (char*)p) { VLOG_DBG_RL(&rl, "%zu: attr %"PRIu16" aligned data len (%zu) " "> bytes left (%tu)", - offset, nla->nla_type, aligned_len, + offset, nl_attr_type(nla), aligned_len, (char*)tail - (char*)p); return false; } - type = nla->nla_type; + type = nl_attr_type(nla); if (type < n_attrs && policy[type].type != NL_A_NO_ATTR) { const struct nl_policy *e = &policy[type]; size_t min_len, max_len; diff --git a/lib/netlink.h b/lib/netlink.h index 3d5a849f7..77360fefe 100644 --- a/lib/netlink.h +++ b/lib/netlink.h @@ -90,6 +90,7 @@ enum nl_attr_type }; /* Netlink attribute parsing. */ +int nl_attr_type(const struct nlattr *); const void *nl_attr_get(const struct nlattr *); size_t nl_attr_get_size(const struct nlattr *); const void *nl_attr_get_unspec(const struct nlattr *, size_t size); -- 2.43.0