git://git.onelab.eu
/
iproute2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sync to iproute2-2.6.16-060323
[iproute2.git]
/
ip
/
ipneigh.c
diff --git
a/ip/ipneigh.c
b/ip/ipneigh.c
index
e8ab291
..
249ee68
100644
(file)
--- 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)
#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
{
static struct
{
@@
-43,7
+44,6
@@
static struct
char *flushb;
int flushp;
int flushe;
char *flushb;
int flushp;
int flushe;
- struct rtnl_handle *rth;
} filter;
static void usage(void) __attribute__((noreturn));
} filter;
static void usage(void) __attribute__((noreturn));
@@
-88,7
+88,7
@@
int nud_state_a2n(unsigned *state, char *arg)
static int flush_update(void)
{
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;
}
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)
{
static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
{
- struct rtnl_handle rth;
struct {
struct nlmsghdr n;
struct ndmsg ndm;
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")) {
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);
}
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) {
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);
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;
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)
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;
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();
int state_given = 0;
ipneigh_reset_filter();
@@
-380,9
+375,6
@@
int do_show_or_flush(int argc, char **argv, int flush)
argc--; argv++;
}
argc--; argv++;
}
- if (rtnl_open(&rth, 0) < 0)
- exit(1);
-
ll_init_map(&rth);
if (filter_dev) {
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.flushb = flushb;
filter.flushp = 0;
filter.flushe = sizeof(flushb);
- filter.rth = &rth;
filter.state &= ~NUD_FAILED;
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);
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);
}
}
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) {
}
if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNEIGH) < 0) {