From: Donald Sharp Date: Sat, 10 Aug 2019 00:18:43 +0000 (-0400) Subject: ip nexthop: Allow flush|list operations to specify a specific protocol X-Git-Tag: v5.4.0~37^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84b9168328bf92f6ecbee4e451b5bc34514be3f9;p=thirdparty%2Fiproute2.git ip nexthop: Allow flush|list operations to specify a specific protocol In the case where we have a large number of nexthops from a specific protocol, allow the flush and list operations to take a protocol to limit the commands scopes. Signed-off-by: Donald Sharp Signed-off-by: David Ahern --- diff --git a/ip/ipnexthop.c b/ip/ipnexthop.c index f35aab52b..bc8ab4311 100644 --- a/ip/ipnexthop.c +++ b/ip/ipnexthop.c @@ -19,6 +19,7 @@ static struct { unsigned int groups; unsigned int ifindex; unsigned int master; + unsigned int proto; } filter; enum { @@ -34,7 +35,7 @@ static void usage(void) __attribute__((noreturn)); static void usage(void) { fprintf(stderr, - "Usage: ip nexthop { list | flush } SELECTOR\n" + "Usage: ip nexthop { list | flush } [ protocol ID ] SELECTOR\n" " ip nexthop { add | replace } id ID NH [ protocol ID ]\n" " ip nexthop { get| del } id ID\n" "SELECTOR := [ id ID ] [ dev DEV ] [ vrf NAME ] [ master DEV ]\n" @@ -109,6 +110,9 @@ static int flush_nexthop(struct nlmsghdr *nlh, void *arg) return -1; } + if (filter.proto && nhm->nh_protocol != filter.proto) + return 0; + parse_rtattr(tb, NHA_MAX, RTM_NHA(nhm), len); if (tb[NHA_ID]) id = rta_getattr_u32(tb[NHA_ID]); @@ -213,6 +217,9 @@ int print_nexthop(struct nlmsghdr *n, void *arg) return -1; } + if (filter.proto && filter.proto != nhm->nh_protocol) + return 0; + parse_rtattr(tb, NHA_MAX, RTM_NHA(nhm), len); open_json_object(NULL); @@ -473,6 +480,13 @@ static int ipnh_list_flush(int argc, char **argv, int action) if (get_unsigned(&id, *argv, 0)) invarg("invalid id value", *argv); return ipnh_get_id(id); + } else if (!matches(*argv, "protocol")) { + __u32 proto; + + NEXT_ARG(); + if (get_unsigned(&proto, *argv, 0)) + invarg("invalid protocol value", *argv); + filter.proto = proto; } else if (matches(*argv, "help") == 0) { usage(); } else {