X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetlink.h;h=a5c129ab296836aee2e9ecd9e48916301a1b26a0;hb=eb857b4824d2a62e1cc1b85c30a3da007d4942c9;hp=2d3457167a819f10b5111b7769069c90cd5ab1f7;hpb=6d23c6f42206809f985d3fc7d95fca0589522836;p=sliver-openvswitch.git diff --git a/lib/netlink.h b/lib/netlink.h index 2d3457167..a5c129ab2 100644 --- a/lib/netlink.h +++ b/lib/netlink.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,7 @@ struct genlmsghdr *nl_msg_genlmsghdr(const struct ofpbuf *); bool nl_msg_nlmsgerr(const struct ofpbuf *, int *error); void nl_msg_reserve(struct ofpbuf *, size_t); -/* Appending headers and raw data. */ +/* Appending and prepending headers and raw data. */ void nl_msg_put_nlmsghdr(struct ofpbuf *, size_t expected_payload, uint32_t type, uint32_t flags); void nl_msg_put_genlmsghdr(struct ofpbuf *, size_t expected_payload, @@ -54,6 +54,8 @@ void nl_msg_put_genlmsghdr(struct ofpbuf *, size_t expected_payload, uint8_t cmd, uint8_t version); void nl_msg_put(struct ofpbuf *, const void *, size_t); void *nl_msg_put_uninit(struct ofpbuf *, size_t); +void nl_msg_push(struct ofpbuf *, const void *, size_t); +void *nl_msg_push_uninit(struct ofpbuf *, size_t); /* Appending attributes. */ void *nl_msg_put_unspec_uninit(struct ofpbuf *, uint16_t type, size_t); @@ -73,8 +75,33 @@ void nl_msg_end_nested(struct ofpbuf *, size_t offset); void nl_msg_put_nested(struct ofpbuf *, uint16_t type, const void *data, size_t size); +/* Prepending attributes. */ +void *nl_msg_push_unspec_uninit(struct ofpbuf *, uint16_t type, size_t); +void nl_msg_push_unspec(struct ofpbuf *, uint16_t type, const void *, size_t); +void nl_msg_push_flag(struct ofpbuf *, uint16_t type); +void nl_msg_push_u8(struct ofpbuf *, uint16_t type, uint8_t value); +void nl_msg_push_u16(struct ofpbuf *, uint16_t type, uint16_t value); +void nl_msg_push_u32(struct ofpbuf *, uint16_t type, uint32_t value); +void nl_msg_push_u64(struct ofpbuf *, uint16_t type, uint64_t value); +void nl_msg_push_be16(struct ofpbuf *, uint16_t type, ovs_be16 value); +void nl_msg_push_be32(struct ofpbuf *, uint16_t type, ovs_be32 value); +void nl_msg_push_be64(struct ofpbuf *, uint16_t type, ovs_be64 value); +void nl_msg_push_string(struct ofpbuf *, uint16_t type, const char *value); + /* Separating buffers into individual messages. */ struct nlmsghdr *nl_msg_next(struct ofpbuf *buffer, struct ofpbuf *msg); + +/* Sizes of various attribute types, in bytes, including the attribute header + * and padding. */ +#define NL_ATTR_SIZE(PAYLOAD_SIZE) (NLA_HDRLEN + NLA_ALIGN(PAYLOAD_SIZE)) +#define NL_A_U8_SIZE NL_ATTR_SIZE(sizeof(uint8_t)) +#define NL_A_U16_SIZE NL_ATTR_SIZE(sizeof(uint16_t)) +#define NL_A_U32_SIZE NL_ATTR_SIZE(sizeof(uint32_t)) +#define NL_A_U64_SIZE NL_ATTR_SIZE(sizeof(uint64_t)) +#define NL_A_BE16_SIZE NL_ATTR_SIZE(sizeof(ovs_be16)) +#define NL_A_BE32_SIZE NL_ATTR_SIZE(sizeof(ovs_be32)) +#define NL_A_BE64_SIZE NL_ATTR_SIZE(sizeof(ovs_be64)) +#define NL_A_FLAG_SIZE NL_ATTR_SIZE(0) /* Netlink attribute types. */ enum nl_attr_type @@ -157,6 +184,11 @@ struct nl_policy bool optional; }; +#define NL_POLICY_FOR(TYPE) \ + .type = NL_A_UNSPEC, .min_len = sizeof(TYPE), .max_len = sizeof(TYPE) + +bool nl_attr_validate(const struct nlattr *, const struct nl_policy *); + bool nl_policy_parse(const struct ofpbuf *, size_t offset, const struct nl_policy[], struct nlattr *[], size_t n_attrs);