netlink: Add functions for handling nested attributes.
authorBen Pfaff <blp@nicira.com>
Thu, 20 May 2010 22:57:56 +0000 (15:57 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 17 Jun 2010 17:30:18 +0000 (10:30 -0700)
lib/netlink.c
lib/netlink.h

index 334e45af993553b643bd1d98bfbab1b57648cd77..24ea290de7479c6a70f6c6f6861b1dffc01d2cc6 100644 (file)
@@ -770,6 +770,15 @@ nl_attr_get_string(const struct nlattr *nla)
     return nl_attr_get(nla);
 }
 
+/* Initializes 'nested' to the payload of 'nla'.  Doesn't initialize every
+ * field in 'nested', but enough to poke around with it in a read-only way. */
+void
+nl_attr_get_nested(const struct nlattr *nla, struct ofpbuf *nested)
+{
+    nested->data = (void *) nl_attr_get(nla);
+    nested->size = nl_attr_get_size(nla);
+}
+
 /* Default minimum and maximum payload sizes for each type of attribute. */
 static const size_t attr_len_range[][2] = {
     [0 ... N_NL_ATTR_TYPES - 1] = { 0, SIZE_MAX },
@@ -881,6 +890,20 @@ nl_policy_parse(const struct ofpbuf *msg, size_t nla_offset,
     }
     return true;
 }
+
+/* Parses the Netlink attributes within 'nla'.  'policy[i]', for 0 <= i <
+ * n_attrs, specifies how the attribute with nla_type == i is parsed; a pointer
+ * to attribute i is stored in attrs[i].  Returns true if successful, false on
+ * failure. */
+bool
+nl_parse_nested(const struct nlattr *nla, const struct nl_policy policy[],
+                struct nlattr *attrs[], size_t n_attrs)
+{
+    struct ofpbuf buf;
+
+    nl_attr_get_nested(nla, &buf);
+    return nl_policy_parse(&buf, 0, policy, attrs, n_attrs);
+}
 \f
 /* Miscellaneous.  */
 
index dc68921ffc16f7abe274781b409b5d5a8d8a6631..dba7f02ea70e9ba86b22e81b66bbcd9d481dcbd9 100644 (file)
@@ -103,6 +103,7 @@ uint16_t nl_attr_get_u16(const struct nlattr *);
 uint32_t nl_attr_get_u32(const struct nlattr *);
 uint64_t nl_attr_get_u64(const struct nlattr *);
 const char *nl_attr_get_string(const struct nlattr *);
+void nl_attr_get_nested(const struct nlattr *, struct ofpbuf *);
 
 /* Netlink attribute policy.
  *
@@ -118,6 +119,8 @@ struct nl_policy
 bool nl_policy_parse(const struct ofpbuf *, size_t offset,
                      const struct nl_policy[],
                      struct nlattr *[], size_t n_attrs);
+bool nl_parse_nested(const struct nlattr *, const struct nl_policy[],
+                     struct nlattr *[], size_t n_attrs);
 \f
 /* Miscellaneous. */