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 <greearb@candelatech.com>
This commit is contained in:
Ben Greear 2010-12-01 11:13:51 -08:00 committed by Stephen Hemminger
parent 3f0a7b4c4f
commit 64c7956061
4 changed files with 20 additions and 4 deletions

View File

@ -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

11
ip/ip.c
View File

@ -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)

View File

@ -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;
}

View File

@ -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: