ip neigh: device is optional for proxy entries

Though dumping such entries crashes present kernels.

Signed-off-by: Konstantin Khlebnikov <koct9i@gmail.com>
This commit is contained in:
Konstantin Khlebnikov 2015-12-01 01:17:06 +03:00 committed by Stephen Hemminger
parent 5866bddd9a
commit e834eb8eba

View File

@ -100,8 +100,9 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
struct ndmsg ndm; struct ndmsg ndm;
char buf[256]; char buf[256];
} req; } req;
char *d = NULL; char *dev = NULL;
int dst_ok = 0; int dst_ok = 0;
int dev_ok = 0;
int lladdr_ok = 0; int lladdr_ok = 0;
char * lla = NULL; char * lla = NULL;
inet_prefix dst; inet_prefix dst;
@ -135,10 +136,12 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
duparg("address", *argv); duparg("address", *argv);
get_addr(&dst, *argv, preferred_family); get_addr(&dst, *argv, preferred_family);
dst_ok = 1; dst_ok = 1;
dev_ok = 1;
req.ndm.ndm_flags |= NTF_PROXY; req.ndm.ndm_flags |= NTF_PROXY;
} else if (strcmp(*argv, "dev") == 0) { } else if (strcmp(*argv, "dev") == 0) {
NEXT_ARG(); NEXT_ARG();
d = *argv; dev = *argv;
dev_ok = 1;
} else { } else {
if (strcmp(*argv, "to") == 0) { if (strcmp(*argv, "to") == 0) {
NEXT_ARG(); NEXT_ARG();
@ -153,7 +156,7 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
} }
argc--; argv++; argc--; argv++;
} }
if (d == NULL || !dst_ok || dst.family == AF_UNSPEC) { if (!dev_ok || !dst_ok || dst.family == AF_UNSPEC) {
fprintf(stderr, "Device and destination are required arguments.\n"); fprintf(stderr, "Device and destination are required arguments.\n");
exit(-1); exit(-1);
} }
@ -175,8 +178,8 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv)
ll_init_map(&rth); ll_init_map(&rth);
if ((req.ndm.ndm_ifindex = ll_name_to_index(d)) == 0) { if (dev && (req.ndm.ndm_ifindex = ll_name_to_index(dev)) == 0) {
fprintf(stderr, "Cannot find device \"%s\"\n", d); fprintf(stderr, "Cannot find device \"%s\"\n", dev);
return -1; return -1;
} }