[ovs-dev] [PATCH] netlink: Do not enforce alignment of last Netlink attribute
Thomas Graf
tgraf at redhat.com
Mon Nov 11 11:11:36 UTC 2013
There is no reason to enforce padding after the last attribute.
Dropping this enforcement will ease efforts to implement zerocopy
upcall.
Signed-off-by: Thomas Graf <tgraf at redhat.com>
---
lib/netlink.h | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/lib/netlink.h b/lib/netlink.h
index 21d49d3..d75729b 100644
--- a/lib/netlink.h
+++ b/lib/netlink.h
@@ -136,14 +136,22 @@ nl_attr_is_valid(const struct nlattr *nla, size_t maxlen)
{
return (maxlen >= sizeof *nla
&& nla->nla_len >= sizeof *nla
- && NLA_ALIGN(nla->nla_len) <= maxlen);
+ && nla->nla_len <= maxlen);
+}
+
+static inline size_t
+nl_attr_len_pad(const struct nlattr *nla, size_t maxlen)
+{
+ size_t len = NLA_ALIGN(nla->nla_len);
+
+ return len <= maxlen ? len : nla->nla_len;
}
/* This macro is careful to check for attributes with bad lengths. */
#define NL_ATTR_FOR_EACH(ITER, LEFT, ATTRS, ATTRS_LEN) \
for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \
nl_attr_is_valid(ITER, LEFT); \
- (LEFT) -= NLA_ALIGN((ITER)->nla_len), (ITER) = nl_attr_next(ITER))
+ (LEFT) -= nl_attr_len_pad(ITER, LEFT), (ITER) = nl_attr_next(ITER))
/* This macro does not check for attributes with bad lengths. It should only
@@ -152,7 +160,7 @@ nl_attr_is_valid(const struct nlattr *nla, size_t maxlen)
#define NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, ATTRS, ATTRS_LEN) \
for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \
(LEFT) > 0; \
- (LEFT) -= NLA_ALIGN((ITER)->nla_len), (ITER) = nl_attr_next(ITER))
+ (LEFT) -= nl_attr_len_pad(ITER, LEFT), (ITER) = nl_attr_next(ITER))
/* These variants are convenient for iterating nested attributes. */
#define NL_NESTED_FOR_EACH(ITER, LEFT, A) \
--
1.8.3.1
More information about the dev
mailing list