Commit 52b2ca86 authored by Pavel Emelyanov's avatar Pavel Emelyanov

libnetlink: More helpers

Add more helpers that manage nla blobs (taken from iproute2 tool). Need for veth support.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent b57fb6da
...@@ -4,7 +4,16 @@ ...@@ -4,7 +4,16 @@
#define CR_NLMSG_SEQ 24680 /* arbitrary chosen */ #define CR_NLMSG_SEQ 24680 /* arbitrary chosen */
extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
#define parse_rtattr_nested(tb, max, rta) \
(parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
extern int do_rtnl_req(int nl, void *req, int size, extern int do_rtnl_req(int nl, void *req, int size,
int (*receive_callback)(struct nlmsghdr *h, void *), void *); int (*receive_callback)(struct nlmsghdr *h, void *), void *);
extern int addattr_l(struct nlmsghdr *n, int maxlen, int type,
const void *data, int alen);
#define NLMSG_TAIL(nmsg) \
((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
#endif /* LIBNETLINK_H__ */ #endif /* LIBNETLINK_H__ */
...@@ -113,3 +113,21 @@ err: ...@@ -113,3 +113,21 @@ err:
return -1; return -1;
} }
int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data,
int alen)
{
int len = RTA_LENGTH(alen);
struct rtattr *rta;
if (NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len) > maxlen) {
pr_err("addattr_l ERROR: message exceeded bound of %d\n",maxlen);
return -1;
}
rta = NLMSG_TAIL(n);
rta->rta_type = type;
rta->rta_len = len;
memcpy(RTA_DATA(rta), data, alen);
n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment