X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ip%2Fipneigh.c;fp=ip%2Fipneigh.c;h=249ee680b036de267ef6e13933b63e4682fa5fdc;hb=fcabec0aee42af28e2846ef3674ed7ba7be72c42;hp=e8ab29121bfd5d61304ce78a9c8ca6660a07a28a;hpb=cb820e861caa85bb3942ab0c673e04b9408be0ad;p=iproute2.git diff --git a/ip/ipneigh.c b/ip/ipneigh.c index e8ab291..249ee68 100644 --- a/ip/ipneigh.c +++ b/ip/ipneigh.c @@ -31,6 +31,7 @@ #include "ip_common.h" #define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY) +#define MAX_ROUNDS 10 static struct { @@ -43,7 +44,6 @@ static struct char *flushb; int flushp; int flushe; - struct rtnl_handle *rth; } filter; static void usage(void) __attribute__((noreturn)); @@ -88,7 +88,7 @@ int nud_state_a2n(unsigned *state, char *arg) static int flush_update(void) { - if (rtnl_send(filter.rth, filter.flushb, filter.flushp) < 0) { + if (rtnl_send(&rth, filter.flushb, filter.flushp) < 0) { perror("Failed to send flush request\n"); return -1; } @@ -99,7 +99,6 @@ static int flush_update(void) static int ipneigh_modify(int cmd, int flags, int argc, char **argv) { - struct rtnl_handle rth; struct { struct nlmsghdr n; struct ndmsg ndm; @@ -166,16 +165,13 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv) addattr_l(&req.n, sizeof(req), NDA_DST, &dst.data, dst.bytelen); if (lla && strcmp(lla, "null")) { - __u8 llabuf[16]; + char llabuf[20]; int l; l = ll_addr_a2n(llabuf, sizeof(llabuf), lla); addattr_l(&req.n, sizeof(req), NDA_LLADDR, llabuf, l); } - if (rtnl_open(&rth, 0) < 0) - exit(1); - ll_init_map(&rth); if ((req.ndm.ndm_ifindex = ll_name_to_index(d)) == 0) { @@ -186,7 +182,7 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv) if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) exit(2); - exit(0); + return 0; } @@ -250,7 +246,7 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) memcpy(fn, n, n->nlmsg_len); fn->nlmsg_type = RTM_DELNEIGH; fn->nlmsg_flags = NLM_F_REQUEST; - fn->nlmsg_seq = ++filter.rth->seq; + fn->nlmsg_seq = ++rth.seq; filter.flushp = (((char*)fn) + n->nlmsg_len) - filter.flushb; filter.flushed++; if (show_stats < 2) @@ -325,7 +321,6 @@ void ipneigh_reset_filter() int do_show_or_flush(int argc, char **argv, int flush) { char *filter_dev = NULL; - struct rtnl_handle rth; int state_given = 0; ipneigh_reset_filter(); @@ -380,9 +375,6 @@ int do_show_or_flush(int argc, char **argv, int flush) argc--; argv++; } - if (rtnl_open(&rth, 0) < 0) - exit(1); - ll_init_map(&rth); if (filter_dev) { @@ -399,10 +391,9 @@ int do_show_or_flush(int argc, char **argv, int flush) filter.flushb = flushb; filter.flushp = 0; filter.flushe = sizeof(flushb); - filter.rth = &rth; filter.state &= ~NUD_FAILED; - for (;;) { + while (round < MAX_ROUNDS) { if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNEIGH) < 0) { perror("Cannot send dump request"); exit(1); @@ -428,6 +419,9 @@ int do_show_or_flush(int argc, char **argv, int flush) fflush(stdout); } } + printf("*** Flush not complete bailing out after %d rounds\n", + MAX_ROUNDS); + return 1; } if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNEIGH) < 0) {