netlink: New function nl_attr_type().
authorBen Pfaff <blp@nicira.com>
Tue, 7 Dec 2010 17:37:59 +0000 (09:37 -0800)
committerBen Pfaff <blp@nicira.com>
Fri, 10 Dec 2010 19:13:31 +0000 (11:13 -0800)
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 <jesse@nicira.com>
lib/netlink-protocol.h
lib/netlink.c
lib/netlink.h

index 77f5c8965f796fd229135e41aefb897514956c2f..6281fb2c3af2678ec86587a55d71ecad60efbc78 100644 (file)
@@ -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 */
index 3ed2f53a9e8c6a2b14e59e3ee2e6b0f30f430df8..f1234ad4840dad8db21f3899a65415314f9bd50c 100644 (file)
@@ -358,6 +358,14 @@ nl_msg_next(struct ofpbuf *buffer, struct ofpbuf *msg)
 \f
 /* 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;
index 3d5a849f71c1caccac31d34039f9895d2e9c31ac..77360fefe17ae31d24ddc007356f1f59de96b97d 100644 (file)
@@ -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);