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)