From: Ben Greear Date: Wed, 1 Dec 2010 19:13:51 +0000 (-0800) Subject: Allow 'ip addr flush' to loop more than 10 times X-Git-Tag: v2.6.37~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64c7956061500611061910067d76512afcd2ddb4;p=thirdparty%2Fiproute2.git Allow 'ip addr flush' to loop more than 10 times The default remains at 10 for backwards compatibility. For instance: # ip addr flush dev eth2 *** Flush remains incomplete after 10 rounds. *** # ip -l 20 addr flush dev eth2 *** Flush remains incomplete after 20 rounds. *** # ip -loops 0 addr flush dev eth2 # This is useful for getting rid of large numbers of IP addresses in scripts. Signed-off-by: Ben Greear --- diff --git a/include/utils.h b/include/utils.h index f7ef939b3..3da699858 100644 --- a/include/utils.h +++ b/include/utils.h @@ -17,6 +17,7 @@ extern int resolve_hosts; extern int oneline; extern int timestamp; extern char * _SL_; +extern int max_flush_loops; #ifndef IPPROTO_ESP #define IPPROTO_ESP 50 diff --git a/ip/ip.c b/ip/ip.c index 9f295334d..b127d5708 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -32,6 +32,8 @@ int timestamp = 0; char * _SL_ = NULL; char *batch_file = NULL; int force = 0; +int max_flush_loops = 10; + struct rtnl_handle rth = { .fd = -1 }; static void usage(void) __attribute__((noreturn)); @@ -45,6 +47,7 @@ static void usage(void) " tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm }\n" " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n" " -f[amily] { inet | inet6 | ipx | dnet | link } |\n" +" -l[oops] { maximum-addr-flush-attempts } |\n" " -o[neline] | -t[imestamp] | -b[atch] [filename] |\n" " -rc[vbuf] [size]}\n"); exit(-1); @@ -157,7 +160,13 @@ int main(int argc, char **argv) break; if (opt[1] == '-') opt++; - if (matches(opt, "-family") == 0) { + if (matches(opt, "-loops") == 0) { + argc--; + argv++; + if (argc <= 1) + usage(); + max_flush_loops = atoi(argv[1]); + } else if (matches(opt, "-family") == 0) { argc--; argv++; if (argc <= 1) diff --git a/ip/ipaddress.c b/ip/ipaddress.c index fc306e65d..a775ecd38 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -33,7 +33,6 @@ #include "ll_map.h" #include "ip_common.h" -#define MAX_ROUNDS 10 static struct { @@ -819,7 +818,7 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush) filter.flushp = 0; filter.flushe = sizeof(flushb); - while (round < MAX_ROUNDS) { + while ((max_flush_loops == 0) || (round < max_flush_loops)) { const struct rtnl_dump_filter_arg a[3] = { { .filter = print_addrinfo_secondary, @@ -877,7 +876,8 @@ flush_done: if (!(filter.flags & IFA_F_SECONDARY) && (filter.flagmask & IFA_F_SECONDARY)) goto flush_done; } - fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", MAX_ROUNDS); fflush(stderr); + fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", max_flush_loops); + fflush(stderr); return 1; } diff --git a/man/man8/ip.8 b/man/man8/ip.8 index c1e03f3fc..d8044724a 100644 --- a/man/man8/ip.8 +++ b/man/man8/ip.8 @@ -735,6 +735,12 @@ output more information. If the option appears twice or more, the amount of information increases. As a rule, the information is statistics or some time values. +.TP +.BR "\-l" , " \-loops" +Specify maximum number of loops the 'ip addr flush' logic +will attempt before giving up. The default is 10. +Zero (0) means loop until all addresses are removed. + .TP .BR "\-f" , " \-family" followed by protocol family identifier: