Commit 64c79560 authored by Ben Greear's avatar Ben Greear Committed by Stephen Hemminger

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: default avatarBen Greear <greearb@candelatech.com>
parent 3f0a7b4c
...@@ -17,6 +17,7 @@ extern int resolve_hosts; ...@@ -17,6 +17,7 @@ extern int resolve_hosts;
extern int oneline; extern int oneline;
extern int timestamp; extern int timestamp;
extern char * _SL_; extern char * _SL_;
extern int max_flush_loops;
#ifndef IPPROTO_ESP #ifndef IPPROTO_ESP
#define IPPROTO_ESP 50 #define IPPROTO_ESP 50
......
...@@ -32,6 +32,8 @@ int timestamp = 0; ...@@ -32,6 +32,8 @@ int timestamp = 0;
char * _SL_ = NULL; char * _SL_ = NULL;
char *batch_file = NULL; char *batch_file = NULL;
int force = 0; int force = 0;
int max_flush_loops = 10;
struct rtnl_handle rth = { .fd = -1 }; struct rtnl_handle rth = { .fd = -1 };
static void usage(void) __attribute__((noreturn)); static void usage(void) __attribute__((noreturn));
...@@ -45,6 +47,7 @@ static void usage(void) ...@@ -45,6 +47,7 @@ static void usage(void)
" tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm }\n" " tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm }\n"
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n" " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
" -f[amily] { inet | inet6 | ipx | dnet | link } |\n" " -f[amily] { inet | inet6 | ipx | dnet | link } |\n"
" -l[oops] { maximum-addr-flush-attempts } |\n"
" -o[neline] | -t[imestamp] | -b[atch] [filename] |\n" " -o[neline] | -t[imestamp] | -b[atch] [filename] |\n"
" -rc[vbuf] [size]}\n"); " -rc[vbuf] [size]}\n");
exit(-1); exit(-1);
...@@ -157,7 +160,13 @@ int main(int argc, char **argv) ...@@ -157,7 +160,13 @@ int main(int argc, char **argv)
break; break;
if (opt[1] == '-') if (opt[1] == '-')
opt++; 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--; argc--;
argv++; argv++;
if (argc <= 1) if (argc <= 1)
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include "ll_map.h" #include "ll_map.h"
#include "ip_common.h" #include "ip_common.h"
#define MAX_ROUNDS 10
static struct static struct
{ {
...@@ -819,7 +818,7 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush) ...@@ -819,7 +818,7 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
filter.flushp = 0; filter.flushp = 0;
filter.flushe = sizeof(flushb); 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] = { const struct rtnl_dump_filter_arg a[3] = {
{ {
.filter = print_addrinfo_secondary, .filter = print_addrinfo_secondary,
...@@ -877,7 +876,8 @@ flush_done: ...@@ -877,7 +876,8 @@ flush_done:
if (!(filter.flags & IFA_F_SECONDARY) && (filter.flagmask & IFA_F_SECONDARY)) if (!(filter.flags & IFA_F_SECONDARY) && (filter.flagmask & IFA_F_SECONDARY))
goto flush_done; 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; return 1;
} }
......
...@@ -735,6 +735,12 @@ output more information. If the option ...@@ -735,6 +735,12 @@ output more information. If the option
appears twice or more, the amount of information increases. appears twice or more, the amount of information increases.
As a rule, the information is statistics or some time values. 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 .TP
.BR "\-f" , " \-family" .BR "\-f" , " \-family"
followed by protocol family identifier: followed by protocol family identifier:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment