From: Ben Pfaff Date: Thu, 20 May 2010 22:57:56 +0000 (-0700) Subject: netlink: Add functions for handling nested attributes. X-Git-Tag: v1.1.0pre1~268 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=25eeae6a1e12445c6d17b27d092f5936a6150892;p=sliver-openvswitch.git netlink: Add functions for handling nested attributes. --- diff --git a/lib/netlink.c b/lib/netlink.c index 334e45af9..24ea290de 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 dc68921ff..dba7f02ea 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. */