]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ip/tunnel: Use get_addr() instead of get_prefix() for local/remote endpoints
authorSerhey Popovych <serhe.popovych@gmail.com>
Wed, 13 Dec 2017 19:36:01 +0000 (21:36 +0200)
committerStephen Hemminger <stephen@networkplumber.org>
Sat, 16 Dec 2017 18:08:54 +0000 (10:08 -0800)
Manual page ip-link(8) states that both local and remote accept
IPADDR not PREFIX. Use get_addr() instead of get_prefix() to
parse local/remote endpoint address correctly.

Force corresponding address family instead of using preferred_family
to catch weired cases as shown below.

Before this patch it is possible to create tunnel with commands:

  ip    li add dev ip6gre2 type ip6gre local fe80::1/64 remote fe80::2/64
  ip -4 li add dev ip6gre2 type ip6gre local 10.0.0.1/24 remote 10.0.0.2/24

Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
ip/ip6tunnel.c
ip/link_gre6.c
ip/link_ip6tnl.c
ip/link_vti6.c

index 4563e1e0f73b1ed4bd1766dcbfbac96b5b2f1b70..b8db49c979abc8ed9f9277a40ba87ff2589b163f 100644 (file)
@@ -170,17 +170,13 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
                        inet_prefix raddr;
 
                        NEXT_ARG();
-                       get_prefix(&raddr, *argv, preferred_family);
-                       if (raddr.family == AF_UNSPEC)
-                               invarg("\"remote\" address family is AF_UNSPEC", *argv);
+                       get_addr(&raddr, *argv, AF_INET6);
                        memcpy(&p->raddr, &raddr.data, sizeof(p->raddr));
                } else if (strcmp(*argv, "local") == 0) {
                        inet_prefix laddr;
 
                        NEXT_ARG();
-                       get_prefix(&laddr, *argv, preferred_family);
-                       if (laddr.family == AF_UNSPEC)
-                               invarg("\"local\" address family is AF_UNSPEC", *argv);
+                       get_addr(&laddr, *argv, AF_INET6);
                        memcpy(&p->laddr, &laddr.data, sizeof(p->laddr));
                } else if (strcmp(*argv, "dev") == 0) {
                        NEXT_ARG();
index 0a82eaecf2cdd861b6b2401cbca3f36a293e8f00..c22fdedbb8899d7d44c32bbb21ae2ecec662bb75 100644 (file)
@@ -257,17 +257,13 @@ get_failed:
                        inet_prefix addr;
 
                        NEXT_ARG();
-                       get_prefix(&addr, *argv, preferred_family);
-                       if (addr.family == AF_UNSPEC)
-                               invarg("\"remote\" address family is AF_UNSPEC", *argv);
+                       get_addr(&addr, *argv, AF_INET6);
                        memcpy(&raddr, &addr.data, sizeof(raddr));
                } else if (!matches(*argv, "local")) {
                        inet_prefix addr;
 
                        NEXT_ARG();
-                       get_prefix(&addr, *argv, preferred_family);
-                       if (addr.family == AF_UNSPEC)
-                               invarg("\"local\" address family is AF_UNSPEC", *argv);
+                       get_addr(&addr, *argv, AF_INET6);
                        memcpy(&laddr, &addr.data, sizeof(laddr));
                } else if (!matches(*argv, "dev")) {
                        NEXT_ARG();
index af796c308f13023faa3e30c3fcf5abd283babe4a..83a432030ab85982539c30a0cc8d3963543c3e30 100644 (file)
@@ -184,18 +184,14 @@ get_failed:
                        inet_prefix addr;
 
                        NEXT_ARG();
-                       get_prefix(&addr, *argv, preferred_family);
-                       if (addr.family == AF_UNSPEC)
-                               invarg("\"remote\" address family is AF_UNSPEC", *argv);
-                       memcpy(&raddr, addr.data, addr.bytelen);
+                       get_addr(&addr, *argv, AF_INET6);
+                       memcpy(&raddr, addr.data, sizeof(raddr));
                } else if (strcmp(*argv, "local") == 0) {
                        inet_prefix addr;
 
                        NEXT_ARG();
-                       get_prefix(&addr, *argv, preferred_family);
-                       if (addr.family == AF_UNSPEC)
-                               invarg("\"local\" address family is AF_UNSPEC", *argv);
-                       memcpy(&laddr, addr.data, addr.bytelen);
+                       get_addr(&addr, *argv, AF_INET6);
+                       memcpy(&laddr, addr.data, sizeof(laddr));
                } else if (matches(*argv, "dev") == 0) {
                        NEXT_ARG();
                        link = if_nametoindex(*argv);
index f665520f9f8de16d3feb06ab952cd2f0bd777d79..84824a5d9921aa4a77ca51cc0879e57037aa2742 100644 (file)
@@ -164,14 +164,14 @@ get_failed:
                        inet_prefix addr;
 
                        NEXT_ARG();
-                       get_prefix(&addr, *argv, AF_INET6);
-                       memcpy(&daddr, addr.data, addr.bytelen);
+                       get_addr(&addr, *argv, AF_INET6);
+                       memcpy(&daddr, addr.data, sizeof(daddr));
                } else if (!matches(*argv, "local")) {
                        inet_prefix addr;
 
                        NEXT_ARG();
-                       get_prefix(&addr, *argv, AF_INET6);
-                       memcpy(&saddr, addr.data, addr.bytelen);
+                       get_addr(&addr, *argv, AF_INET6);
+                       memcpy(&saddr, addr.data, sizeof(saddr));
                } else if (!matches(*argv, "dev")) {
                        NEXT_ARG();
                        link = if_nametoindex(*argv);