From 57daab1e701e5853870bb43e0ff7c151dbddfe9f Mon Sep 17 00:00:00 2001 From: Serhey Popovych Date: Wed, 13 Dec 2017 21:36:00 +0200 Subject: [PATCH] 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 --- ip/iptunnel.c | 10 ++-------- ip/link_gre.c | 6 ++---- ip/link_iptnl.c | 10 ++-------- ip/link_vti.c | 14 ++------------ ip/link_vti6.c | 26 ++++++++------------------ 5 files changed, 16 insertions(+), 50 deletions(-) diff --git a/ip/iptunnel.c b/ip/iptunnel.c index 208a1f06..ce610f84 100644 --- a/ip/iptunnel.c +++ b/ip/iptunnel.c @@ -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); } else if (strcmp(*argv, "remote") == 0) { NEXT_ARG(); - if (strcmp(*argv, "any")) - p->iph.daddr = get_addr32(*argv); - else - p->iph.daddr = htonl(INADDR_ANY); + p->iph.daddr = get_addr32(*argv); } else if (strcmp(*argv, "local") == 0) { NEXT_ARG(); - if (strcmp(*argv, "any")) - p->iph.saddr = get_addr32(*argv); - else - p->iph.saddr = htonl(INADDR_ANY); + p->iph.saddr = get_addr32(*argv); } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); medium = *argv; diff --git a/ip/link_gre.c b/ip/link_gre.c index 43cb1af6..6f82fb4e 100644 --- a/ip/link_gre.c +++ b/ip/link_gre.c @@ -251,12 +251,10 @@ get_failed: pmtudisc = 1; } else if (!matches(*argv, "remote")) { NEXT_ARG(); - if (strcmp(*argv, "any")) - daddr = get_addr32(*argv); + daddr = get_addr32(*argv); } else if (!matches(*argv, "local")) { NEXT_ARG(); - if (strcmp(*argv, "any")) - saddr = get_addr32(*argv); + saddr = get_addr32(*argv); } else if (!matches(*argv, "dev")) { NEXT_ARG(); link = if_nametoindex(*argv); diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c index 2804b8f4..5e4dffa6 100644 --- a/ip/link_iptnl.c +++ b/ip/link_iptnl.c @@ -195,16 +195,10 @@ get_failed: while (argc > 0) { if (strcmp(*argv, "remote") == 0) { NEXT_ARG(); - if (strcmp(*argv, "any")) - raddr = get_addr32(*argv); - else - raddr = 0; + raddr = get_addr32(*argv); } else if (strcmp(*argv, "local") == 0) { NEXT_ARG(); - if (strcmp(*argv, "any")) - laddr = get_addr32(*argv); - else - laddr = 0; + laddr = get_addr32(*argv); } else if (matches(*argv, "dev") == 0) { NEXT_ARG(); link = if_nametoindex(*argv); diff --git a/ip/link_vti.c b/ip/link_vti.c index 07ac94e7..05aefa32 100644 --- a/ip/link_vti.c +++ b/ip/link_vti.c @@ -167,20 +167,10 @@ get_failed: okey = uval; } else if (!matches(*argv, "remote")) { NEXT_ARG(); - if (!strcmp(*argv, "any")) { - fprintf(stderr, "invalid value for \"remote\": \"%s\"\n", *argv); - exit(-1); - } else { - daddr = get_addr32(*argv); - } + daddr = get_addr32(*argv); } else if (!matches(*argv, "local")) { NEXT_ARG(); - if (!strcmp(*argv, "any")) { - fprintf(stderr, "invalid value for \"local\": \"%s\"\n", *argv); - exit(-1); - } else { - saddr = get_addr32(*argv); - } + saddr = get_addr32(*argv); } else if (!matches(*argv, "dev")) { NEXT_ARG(); link = if_nametoindex(*argv); diff --git a/ip/link_vti6.c b/ip/link_vti6.c index 6d08bfe0..f665520f 100644 --- a/ip/link_vti6.c +++ b/ip/link_vti6.c @@ -161,27 +161,17 @@ get_failed: } okey = uval; } else if (!matches(*argv, "remote")) { - NEXT_ARG(); - if (!strcmp(*argv, "any")) { - fprintf(stderr, "invalid value for \"remote\": \"%s\"\n", *argv); - exit(-1); - } else { - inet_prefix addr; + inet_prefix addr; - get_prefix(&addr, *argv, AF_INET6); - memcpy(&daddr, addr.data, addr.bytelen); - } - } else if (!matches(*argv, "local")) { NEXT_ARG(); - 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); + memcpy(&daddr, addr.data, addr.bytelen); + } else if (!matches(*argv, "local")) { + inet_prefix addr; - get_prefix(&addr, *argv, AF_INET6); - memcpy(&saddr, addr.data, addr.bytelen); - } + NEXT_ARG(); + get_prefix(&addr, *argv, AF_INET6); + memcpy(&saddr, addr.data, addr.bytelen); } else if (!matches(*argv, "dev")) { NEXT_ARG(); link = if_nametoindex(*argv); -- 2.39.2