2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-29 15:28:56 +00:00

netlink: Add functions for handling nested attributes.

This commit is contained in:
Ben Pfaff
2010-05-20 15:57:56 -07:00
parent a35fbea5bb
commit 25eeae6a1e
2 changed files with 26 additions and 0 deletions

View File

@@ -770,6 +770,15 @@ nl_attr_get_string(const struct nlattr *nla)
return nl_attr_get(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. */ /* Default minimum and maximum payload sizes for each type of attribute. */
static const size_t attr_len_range[][2] = { static const size_t attr_len_range[][2] = {
[0 ... N_NL_ATTR_TYPES - 1] = { 0, SIZE_MAX }, [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; 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. */ /* Miscellaneous. */

View File

@@ -103,6 +103,7 @@ uint16_t nl_attr_get_u16(const struct nlattr *);
uint32_t nl_attr_get_u32(const struct nlattr *); uint32_t nl_attr_get_u32(const struct nlattr *);
uint64_t nl_attr_get_u64(const struct nlattr *); uint64_t nl_attr_get_u64(const struct nlattr *);
const char *nl_attr_get_string(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. /* Netlink attribute policy.
* *
@@ -118,6 +119,8 @@ struct nl_policy
bool nl_policy_parse(const struct ofpbuf *, size_t offset, bool nl_policy_parse(const struct ofpbuf *, size_t offset,
const struct nl_policy[], const struct nl_policy[],
struct nlattr *[], size_t n_attrs); struct nlattr *[], size_t n_attrs);
bool nl_parse_nested(const struct nlattr *, const struct nl_policy[],
struct nlattr *[], size_t n_attrs);
/* Miscellaneous. */ /* Miscellaneous. */