[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