ip/tunnel: Use get_addr() instead of get_prefix() for local/remote endpoints
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>
This commit is contained in:
parent
57daab1e70
commit
9aceaad71b
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue