From decbb4378c5fc40a5842a8e67bc218305accb454 Mon Sep 17 00:00:00 2001 From: Jiri Pirko Date: Tue, 6 Jan 2015 17:23:45 +0100 Subject: [PATCH] libnetlink: add parse_rtattr_one_nested helper Sometimes, it is more convenient to get only one specific nested attribute by type. For example for IFLA_AF_SPEC where type is address family (AF_INET6). So add this helper for this purpose. Signed-off-by: Jiri Pirko --- include/libnetlink.h | 4 ++++ lib/libnetlink.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/libnetlink.h b/include/libnetlink.h index db049694..de7c85f3 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -82,11 +82,15 @@ extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int le extern int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta, int len, unsigned short flags); extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len); +extern struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len); extern int __parse_rtattr_nested_compat(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))) +#define parse_rtattr_one_nested(type, rta) \ + (parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta))) + #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ __parse_rtattr_nested_compat(tb, max, rta, len); }) diff --git a/lib/libnetlink.c b/lib/libnetlink.c index 45ff90a0..77e07ef7 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -713,6 +713,18 @@ int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int l return i; } +struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len) +{ + while (RTA_OK(rta, len)) { + if (rta->rta_type == type) + return rta; + rta = RTA_NEXT(rta, len); + } + if (len) + fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len); + return NULL; +} + int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len) {