From: David Ahern Date: Wed, 3 Oct 2018 02:08:15 +0000 (-0700) Subject: ip route: Remove rtnl_rtcache_request X-Git-Tag: v5.0.0~36^2~5^2~8 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=43fd93ae46ad223dd558e00169a05c9b5b617b64;p=mirror_iproute2.git ip route: Remove rtnl_rtcache_request Add a filter option to rtnl_routedump_req and use it to set rtm_flags removing the need for rtnl_rtcache_request for dump requests. Signed-off-by: David Ahern --- diff --git a/include/libnetlink.h b/include/libnetlink.h index 138840d5..b0051f39 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -47,11 +47,14 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions, void rtnl_close(struct rtnl_handle *rth); +typedef int (*req_filter_fn_t)(struct nlmsghdr *nlh, int reqlen); + int rtnl_addrdump_req(struct rtnl_handle *rth, int family) __attribute__((warn_unused_result)); int rtnl_addrlbldump_req(struct rtnl_handle *rth, int family) __attribute__((warn_unused_result)); -int rtnl_routedump_req(struct rtnl_handle *rth, int family) +int rtnl_routedump_req(struct rtnl_handle *rth, int family, + req_filter_fn_t filter_fn) __attribute__((warn_unused_result)); int rtnl_ruledump_req(struct rtnl_handle *rth, int family) __attribute__((warn_unused_result)); @@ -71,8 +74,6 @@ int rtnl_linkdump_req(struct rtnl_handle *rth, int fam) int rtnl_linkdump_req_filter(struct rtnl_handle *rth, int fam, __u32 filt_mask) __attribute__((warn_unused_result)); -typedef int (*req_filter_fn_t)(struct nlmsghdr *nlh, int reqlen); - int rtnl_linkdump_req_filter_fn(struct rtnl_handle *rth, int fam, req_filter_fn_t fn) __attribute__((warn_unused_result)); diff --git a/ip/ipmroute.c b/ip/ipmroute.c index 4d8867d3..de7a035f 100644 --- a/ip/ipmroute.c +++ b/ip/ipmroute.c @@ -283,7 +283,7 @@ static int mroute_list(int argc, char **argv) filter.iif = idx; } - if (rtnl_routedump_req(&rth, filter.af) < 0) { + if (rtnl_routedump_req(&rth, filter.af, NULL) < 0) { perror("Cannot send dump request"); return 1; } diff --git a/ip/iproute.c b/ip/iproute.c index d3472469..3c0be0a9 100644 --- a/ip/iproute.c +++ b/ip/iproute.c @@ -1535,24 +1535,6 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv) return 0; } -static int rtnl_rtcache_request(struct rtnl_handle *rth, int family) -{ - struct { - struct nlmsghdr nlh; - struct rtmsg rtm; - } req = { - .nlh.nlmsg_len = sizeof(req), - .nlh.nlmsg_type = RTM_GETROUTE, - .nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST, - .nlh.nlmsg_seq = rth->dump = ++rth->seq, - .rtm.rtm_family = family, - .rtm.rtm_flags = RTM_F_CLONED, - }; - struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK }; - - return sendto(rth->fd, (void *)&req, sizeof(req), 0, (struct sockaddr *)&nladdr, sizeof(nladdr)); -} - static int iproute_flush_cache(void) { #define ROUTE_FLUSH_PATH "/proc/sys/net/ipv4/route/flush" @@ -1644,7 +1626,7 @@ static int iproute_flush(int do_ipv6, rtnl_filter_t filter_fn) filter.flushe = sizeof(flushb); for (;;) { - if (rtnl_routedump_req(&rth, do_ipv6) < 0) { + if (rtnl_routedump_req(&rth, do_ipv6, NULL) < 0) { perror("Cannot send dump request"); return -2; } @@ -1684,6 +1666,16 @@ static int iproute_flush(int do_ipv6, rtnl_filter_t filter_fn) } } +static int iproute_dump_filter(struct nlmsghdr *nlh, int reqlen) +{ + struct rtmsg *rtm = NLMSG_DATA(nlh); + + if (filter.cloned) + rtm->rtm_flags |= RTM_F_CLONED; + + return 0; +} + static int iproute_list_flush_or_save(int argc, char **argv, int action) { int do_ipv6 = preferred_family; @@ -1889,16 +1881,9 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action) if (action == IPROUTE_FLUSH) return iproute_flush(do_ipv6, filter_fn); - if (!filter.cloned) { - if (rtnl_routedump_req(&rth, do_ipv6) < 0) { - perror("Cannot send dump request"); - return -2; - } - } else { - if (rtnl_rtcache_request(&rth, do_ipv6) < 0) { - perror("Cannot send dump request"); - return -2; - } + if (rtnl_routedump_req(&rth, do_ipv6, iproute_dump_filter) < 0) { + perror("Cannot send dump request"); + return -2; } new_json_obj(json); diff --git a/lib/libnetlink.c b/lib/libnetlink.c index b9c37fd3..56a1cade 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -266,11 +266,13 @@ int rtnl_addrlbldump_req(struct rtnl_handle *rth, int family) return send(rth->fd, &req, sizeof(req), 0); } -int rtnl_routedump_req(struct rtnl_handle *rth, int family) +int rtnl_routedump_req(struct rtnl_handle *rth, int family, + req_filter_fn_t filter_fn) { struct { struct nlmsghdr nlh; struct rtmsg rtm; + char buf[128]; } req = { .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)), .nlh.nlmsg_type = RTM_GETROUTE, @@ -279,6 +281,14 @@ int rtnl_routedump_req(struct rtnl_handle *rth, int family) .rtm.rtm_family = family, }; + if (filter_fn) { + int err; + + err = filter_fn(&req.nlh, sizeof(req)); + if (err) + return err; + } + return send(rth->fd, &req, sizeof(req), 0); }