From ae7cf70848d837d2ed85a21f6d7cbdf4c6ee6e4e Mon Sep 17 00:00:00 2001 From: Andrea Claudi Date: Mon, 10 Jun 2019 14:25:21 +0200 Subject: [PATCH] libnetlink: Convert GETADDR dumps to use rtnl_addrdump_req Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1716772 Upstream Status: iproute2.git commit 46917d0895fb0 commit 46917d0895fb0fb1df9b3c1575ccd467b4a1f860 Author: David Ahern Date: Sat Sep 29 08:41:46 2018 -0700 libnetlink: Convert GETADDR dumps to use rtnl_addrdump_req Add rtnl_addrdump_req for address dumps using the proper ifaddrmsg as the header. Convert existing RTM_GETADDR dumps to use it. Signed-off-by: David Ahern --- include/libnetlink.h | 4 ++++ ip/ipaddress.c | 6 +++--- lib/libnetlink.c | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/libnetlink.h b/include/libnetlink.h index 9d9249e634dc3..2d9f6190230c1 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -46,6 +46,10 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions, __attribute__((warn_unused_result)); void rtnl_close(struct rtnl_handle *rth); + +int rtnl_addrdump_req(struct rtnl_handle *rth, int family) + __attribute__((warn_unused_result)); + int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type) __attribute__((warn_unused_result)); int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type, diff --git a/ip/ipaddress.c b/ip/ipaddress.c index f315a815e945d..4714bce60db1b 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -1672,7 +1672,7 @@ static int ipaddr_flush(void) filter.flushe = sizeof(flushb); while ((max_flush_loops == 0) || (round < max_flush_loops)) { - if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) { + if (rtnl_addrdump_req(&rth, filter.family) < 0) { perror("Cannot send dump request"); exit(1); } @@ -1764,7 +1764,7 @@ int ip_linkaddr_list(int family, req_filter_fn_t filter_fn, } if (ainfo) { - if (rtnl_wilddump_request(&rth, family, RTM_GETADDR) < 0) { + if (rtnl_addrdump_req(&rth, family) < 0) { perror("Cannot send dump request"); return 1; } @@ -1889,7 +1889,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action) if (ipadd_save_prep()) exit(1); - if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETADDR) < 0) { + if (rtnl_addrdump_req(&rth, preferred_family) < 0) { perror("Cannot send dump request"); exit(1); } diff --git a/lib/libnetlink.c b/lib/libnetlink.c index a9932d423126e..db625b9bd18ca 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -199,6 +199,22 @@ int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions) return rtnl_open_byproto(rth, subscriptions, NETLINK_ROUTE); } +int rtnl_addrdump_req(struct rtnl_handle *rth, int family) +{ + struct { + struct nlmsghdr nlh; + struct ifaddrmsg ifm; + } req = { + .nlh.nlmsg_len = sizeof(req), + .nlh.nlmsg_type = RTM_GETADDR, + .nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .nlh.nlmsg_seq = rth->dump = ++rth->seq, + .ifm.ifa_family = family, + }; + + return send(rth->fd, &req, sizeof(req), 0); +} + int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type) { return rtnl_wilddump_req_filter(rth, family, type, RTEXT_FILTER_VF); -- 2.20.1