netlink: Do not enforce alignment of last Netlink attribute
authorThomas Graf <tgraf@redhat.com>
Mon, 11 Nov 2013 11:11:36 +0000 (12:11 +0100)
committerJesse Gross <jesse@nicira.com>
Wed, 13 Nov 2013 05:52:54 +0000 (21:52 -0800)
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@redhat.com>
Acked-by: Ben Pfaff <blp@nicira.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
lib/netlink.h

index 1a1c0de..f9234da 100644 (file)
@@ -137,14 +137,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
@@ -153,7 +161,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)                               \