10 #include <libmnl/libmnl.h>
40 return attr->nla_type & NLA_TYPE_MASK;
65 return attr->nla_len - MNL_ATTR_HDRLEN;
77 return (
void *)attr + MNL_ATTR_HDRLEN;
99 return len >= (int)
sizeof(
struct nlattr) &&
100 attr->nla_len >=
sizeof(
struct nlattr) &&
101 (int)attr->nla_len <= len;
116 return (
struct nlattr *)((
void *)attr + MNL_ALIGN(attr->nla_len));
144 static int __mnl_attr_validate(
const struct nlattr *attr,
145 enum mnl_attr_data_type type,
size_t exp_len)
150 if (attr_len < exp_len) {
161 case MNL_TYPE_NUL_STRING:
166 if (attr_data[attr_len-1] !=
'\0') {
171 case MNL_TYPE_STRING:
177 case MNL_TYPE_NESTED:
182 if (attr_len < MNL_ATTR_HDRLEN) {
191 if (exp_len && attr_len > exp_len) {
198 static const size_t mnl_attr_data_type_len[MNL_TYPE_MAX] = {
199 [MNL_TYPE_U8] =
sizeof(uint8_t),
200 [MNL_TYPE_U16] =
sizeof(uint16_t),
201 [MNL_TYPE_U32] =
sizeof(uint32_t),
202 [MNL_TYPE_U64] =
sizeof(uint64_t),
218 if (type >= MNL_TYPE_MAX) {
222 exp_len = mnl_attr_data_type_len[type];
223 return __mnl_attr_validate(attr, type, exp_len);
241 if (type >= MNL_TYPE_MAX) {
245 return __mnl_attr_validate(attr, type, exp_len);
266 mnl_attr_cb_t cb,
void *data)
269 const struct nlattr *attr;
271 mnl_attr_for_each(attr, nlh, offset)
272 if ((ret = cb(attr, data)) <= MNL_CB_STOP)
297 const struct nlattr *attr;
299 mnl_attr_for_each_nested(attr, nested)
300 if ((ret = cb(attr, data)) <= MNL_CB_STOP)
327 mnl_attr_cb_t cb,
void *data)
330 const struct nlattr *attr;
332 mnl_attr_for_each_payload(payload, payload_len)
333 if ((ret = cb(attr, data)) <= MNL_CB_STOP)
414 mnl_attr_put(
struct nlmsghdr *nlh, uint16_t type,
size_t len,
const void *data)
417 uint16_t payload_len = MNL_ALIGN(
sizeof(
struct nlattr)) + len;
419 attr->nla_type = type;
420 attr->nla_len = payload_len;
422 nlh->nlmsg_len += MNL_ALIGN(payload_len);
534 start->nla_type = NLA_F_NESTED | type;
535 nlh->nlmsg_len += MNL_ALIGN(
sizeof(
struct nlattr));
557 uint16_t type,
size_t len,
const void *data)
559 if (nlh->nlmsg_len + MNL_ATTR_HDRLEN + MNL_ALIGN(len) > buflen)
582 uint16_t type, uint8_t data)
605 uint16_t type, uint16_t data)
628 uint16_t type, uint32_t data)
651 uint16_t type, uint64_t data)
674 uint16_t type,
const char *data)
698 uint16_t type,
const char *data)
717 if (nlh->nlmsg_len + MNL_ATTR_HDRLEN > buflen)
bool mnl_attr_ok(const struct nlattr *attr, int len)
int mnl_attr_validate2(const struct nlattr *attr, enum mnl_attr_data_type type, size_t exp_len)
int mnl_attr_parse(const struct nlmsghdr *nlh, unsigned int offset, mnl_attr_cb_t cb, void *data)
uint16_t mnl_attr_get_type(const struct nlattr *attr)
bool mnl_attr_put_strz_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, const char *data)
struct nlattr * mnl_attr_next(const struct nlattr *attr)
bool mnl_attr_put_u16_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, uint16_t data)
void mnl_attr_nest_end(struct nlmsghdr *nlh, struct nlattr *start)
void mnl_attr_put(struct nlmsghdr *nlh, uint16_t type, size_t len, const void *data)
void * mnl_attr_get_payload(const struct nlattr *attr)
uint16_t mnl_attr_get_u16(const struct nlattr *attr)
uint16_t mnl_attr_get_len(const struct nlattr *attr)
int mnl_attr_parse_nested(const struct nlattr *nested, mnl_attr_cb_t cb, void *data)
bool mnl_attr_put_str_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, const char *data)
void mnl_attr_put_u8(struct nlmsghdr *nlh, uint16_t type, uint8_t data)
uint16_t mnl_attr_get_payload_len(const struct nlattr *attr)
bool mnl_attr_put_u8_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, uint8_t data)
void * mnl_nlmsg_get_payload_tail(const struct nlmsghdr *nlh)
bool mnl_attr_put_u32_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, uint32_t data)
bool mnl_attr_put_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, size_t len, const void *data)
int mnl_attr_type_valid(const struct nlattr *attr, uint16_t max)
void mnl_attr_nest_cancel(struct nlmsghdr *nlh, struct nlattr *start)
uint8_t mnl_attr_get_u8(const struct nlattr *attr)
int mnl_attr_parse_payload(const void *payload, size_t payload_len, mnl_attr_cb_t cb, void *data)
uint64_t mnl_attr_get_u64(const struct nlattr *attr)
void mnl_attr_put_u64(struct nlmsghdr *nlh, uint16_t type, uint64_t data)
const char * mnl_attr_get_str(const struct nlattr *attr)
struct nlattr * mnl_attr_nest_start_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type)
void mnl_attr_put_u32(struct nlmsghdr *nlh, uint16_t type, uint32_t data)
struct nlattr * mnl_attr_nest_start(struct nlmsghdr *nlh, uint16_t type)
uint32_t mnl_attr_get_u32(const struct nlattr *attr)
int mnl_attr_validate(const struct nlattr *attr, enum mnl_attr_data_type type)
bool mnl_attr_put_u64_check(struct nlmsghdr *nlh, size_t buflen, uint16_t type, uint64_t data)
void mnl_attr_put_u16(struct nlmsghdr *nlh, uint16_t type, uint16_t data)
void mnl_attr_put_strz(struct nlmsghdr *nlh, uint16_t type, const char *data)
void mnl_attr_put_str(struct nlmsghdr *nlh, uint16_t type, const char *data)