ip/tunnel: Unify setup and accept zero address for local/remote endpoints

It is fully legal to submit zero (INADDR_ANY/IN6ADDR_ANY_INIT)
value for local and/or remote endpoints for all tunnel drivers:
no need additionally check this in userspace.

Note that all tunnel specific code already can pass zero address
to the kernel.

Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
This commit is contained in:
Serhey Popovych 2017-12-13 21:36:00 +02:00 committed by Stephen Hemminger
parent 1eccc57341
commit 57daab1e70
5 changed files with 16 additions and 50 deletions

View File

@ -127,16 +127,10 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
p->iph.frag_off = htons(IP_DF); p->iph.frag_off = htons(IP_DF);
} else if (strcmp(*argv, "remote") == 0) { } else if (strcmp(*argv, "remote") == 0) {
NEXT_ARG(); NEXT_ARG();
if (strcmp(*argv, "any")) p->iph.daddr = get_addr32(*argv);
p->iph.daddr = get_addr32(*argv);
else
p->iph.daddr = htonl(INADDR_ANY);
} else if (strcmp(*argv, "local") == 0) { } else if (strcmp(*argv, "local") == 0) {
NEXT_ARG(); NEXT_ARG();
if (strcmp(*argv, "any")) p->iph.saddr = get_addr32(*argv);
p->iph.saddr = get_addr32(*argv);
else
p->iph.saddr = htonl(INADDR_ANY);
} else if (strcmp(*argv, "dev") == 0) { } else if (strcmp(*argv, "dev") == 0) {
NEXT_ARG(); NEXT_ARG();
medium = *argv; medium = *argv;

View File

@ -251,12 +251,10 @@ get_failed:
pmtudisc = 1; pmtudisc = 1;
} else if (!matches(*argv, "remote")) { } else if (!matches(*argv, "remote")) {
NEXT_ARG(); NEXT_ARG();
if (strcmp(*argv, "any")) daddr = get_addr32(*argv);
daddr = get_addr32(*argv);
} else if (!matches(*argv, "local")) { } else if (!matches(*argv, "local")) {
NEXT_ARG(); NEXT_ARG();
if (strcmp(*argv, "any")) saddr = get_addr32(*argv);
saddr = get_addr32(*argv);
} else if (!matches(*argv, "dev")) { } else if (!matches(*argv, "dev")) {
NEXT_ARG(); NEXT_ARG();
link = if_nametoindex(*argv); link = if_nametoindex(*argv);

View File

@ -195,16 +195,10 @@ get_failed:
while (argc > 0) { while (argc > 0) {
if (strcmp(*argv, "remote") == 0) { if (strcmp(*argv, "remote") == 0) {
NEXT_ARG(); NEXT_ARG();
if (strcmp(*argv, "any")) raddr = get_addr32(*argv);
raddr = get_addr32(*argv);
else
raddr = 0;
} else if (strcmp(*argv, "local") == 0) { } else if (strcmp(*argv, "local") == 0) {
NEXT_ARG(); NEXT_ARG();
if (strcmp(*argv, "any")) laddr = get_addr32(*argv);
laddr = get_addr32(*argv);
else
laddr = 0;
} else if (matches(*argv, "dev") == 0) { } else if (matches(*argv, "dev") == 0) {
NEXT_ARG(); NEXT_ARG();
link = if_nametoindex(*argv); link = if_nametoindex(*argv);

View File

@ -167,20 +167,10 @@ get_failed:
okey = uval; okey = uval;
} else if (!matches(*argv, "remote")) { } else if (!matches(*argv, "remote")) {
NEXT_ARG(); NEXT_ARG();
if (!strcmp(*argv, "any")) { daddr = get_addr32(*argv);
fprintf(stderr, "invalid value for \"remote\": \"%s\"\n", *argv);
exit(-1);
} else {
daddr = get_addr32(*argv);
}
} else if (!matches(*argv, "local")) { } else if (!matches(*argv, "local")) {
NEXT_ARG(); NEXT_ARG();
if (!strcmp(*argv, "any")) { saddr = get_addr32(*argv);
fprintf(stderr, "invalid value for \"local\": \"%s\"\n", *argv);
exit(-1);
} else {
saddr = get_addr32(*argv);
}
} else if (!matches(*argv, "dev")) { } else if (!matches(*argv, "dev")) {
NEXT_ARG(); NEXT_ARG();
link = if_nametoindex(*argv); link = if_nametoindex(*argv);

View File

@ -161,27 +161,17 @@ get_failed:
} }
okey = uval; okey = uval;
} else if (!matches(*argv, "remote")) { } else if (!matches(*argv, "remote")) {
NEXT_ARG(); inet_prefix addr;
if (!strcmp(*argv, "any")) {
fprintf(stderr, "invalid value for \"remote\": \"%s\"\n", *argv);
exit(-1);
} else {
inet_prefix addr;
get_prefix(&addr, *argv, AF_INET6); NEXT_ARG();
memcpy(&daddr, addr.data, addr.bytelen); get_prefix(&addr, *argv, AF_INET6);
} memcpy(&daddr, addr.data, addr.bytelen);
} else if (!matches(*argv, "local")) { } else if (!matches(*argv, "local")) {
NEXT_ARG(); inet_prefix addr;
if (!strcmp(*argv, "any")) {
fprintf(stderr, "invalid value for \"local\": \"%s\"\n", *argv);
exit(-1);
} else {
inet_prefix addr;
get_prefix(&addr, *argv, AF_INET6); NEXT_ARG();
memcpy(&saddr, addr.data, addr.bytelen); get_prefix(&addr, *argv, AF_INET6);
} memcpy(&saddr, addr.data, addr.bytelen);
} else if (!matches(*argv, "dev")) { } else if (!matches(*argv, "dev")) {
NEXT_ARG(); NEXT_ARG();
link = if_nametoindex(*argv); link = if_nametoindex(*argv);