From: Jiri Pirko Date: Tue, 6 Jan 2015 16:23:45 +0000 (+0100) Subject: libnetlink: add parse_rtattr_one_nested helper X-Git-Tag: v3.19.0~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=decbb4378c5fc40a5842a8e67bc218305accb454;p=thirdparty%2Fiproute2.git 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 --- diff --git a/include/libnetlink.h b/include/libnetlink.h index db0496945..de7c85f37 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 45ff90a07..77e07ef7c 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) {