[ovs-dev] [QoS v2 11/17] netlink: Add functions for handling nested attributes.

Ben Pfaff blp at nicira.com
Tue Jun 8 20:41:31 UTC 2010


---
 lib/netlink.c |   23 +++++++++++++++++++++++
 lib/netlink.h |    3 +++
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/lib/netlink.c b/lib/netlink.c
index 12f1898..050fad9 100644
--- a/lib/netlink.c
+++ b/lib/netlink.c
@@ -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);
+}
 
 /* Miscellaneous.  */
 
diff --git a/lib/netlink.h b/lib/netlink.h
index dc68921..dba7f02 100644
--- a/lib/netlink.h
+++ b/lib/netlink.h
@@ -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);
 
 /* Miscellaneous. */
 
-- 
1.7.1





More information about the dev mailing list