iproute2: ip6_tunnel mode bugfixes: any,vti6
- any ipv6 tunnel mode (proto == 0) could not be set due to incomplete set of cases in do_add, do_del. - vti6 logic was inverted: it was using "ip6_vti0" basedev UNLESS mode is set to vti6. We don't need a switch by p.proto in do_add()/do_del(): it already exists in parse_args(). So if parse_args() call was successful, no need to check tunnel mode again. Signed-off-by: Alexey Andriyanov <alan@al-an.info>
This commit is contained in:
parent
eeb669a740
commit
a0638e18b2
|
|
@ -453,49 +453,37 @@ static int do_show(int argc, char **argv)
|
||||||
static int do_add(int cmd, int argc, char **argv)
|
static int do_add(int cmd, int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ip6_tnl_parm2 p;
|
struct ip6_tnl_parm2 p;
|
||||||
|
const char *basedev = "ip6tnl0";
|
||||||
|
|
||||||
ip6_tnl_parm_init(&p, 1);
|
ip6_tnl_parm_init(&p, 1);
|
||||||
|
|
||||||
if (parse_args(argc, argv, cmd, &p) < 0)
|
if (parse_args(argc, argv, cmd, &p) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
switch (p.proto) {
|
if (p.proto == IPPROTO_GRE)
|
||||||
case IPPROTO_IPIP:
|
basedev = "ip6gre0";
|
||||||
case IPPROTO_IPV6:
|
else if (p.i_flags & VTI_ISVTI)
|
||||||
if (p.i_flags != VTI_ISVTI)
|
basedev = "ip6_vti0";
|
||||||
return tnl_add_ioctl(cmd, "ip6_vti0", p.name, &p);
|
|
||||||
else
|
return tnl_add_ioctl(cmd, basedev, p.name, &p);
|
||||||
return tnl_add_ioctl(cmd, "ip6tnl0", p.name, &p);
|
|
||||||
case IPPROTO_GRE:
|
|
||||||
return tnl_add_ioctl(cmd, "ip6gre0", p.name, &p);
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "cannot determine tunnel mode (ip6ip6, ipip6, vti6 or gre)\n");
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_del(int argc, char **argv)
|
static int do_del(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ip6_tnl_parm2 p;
|
struct ip6_tnl_parm2 p;
|
||||||
|
const char *basedev = "ip6tnl0";
|
||||||
|
|
||||||
ip6_tnl_parm_init(&p, 1);
|
ip6_tnl_parm_init(&p, 1);
|
||||||
|
|
||||||
if (parse_args(argc, argv, SIOCDELTUNNEL, &p) < 0)
|
if (parse_args(argc, argv, SIOCDELTUNNEL, &p) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
switch (p.proto) {
|
if (p.proto == IPPROTO_GRE)
|
||||||
case IPPROTO_IPIP:
|
basedev = "ip6gre0";
|
||||||
case IPPROTO_IPV6:
|
else if (p.i_flags & VTI_ISVTI)
|
||||||
if (p.i_flags != VTI_ISVTI)
|
basedev = "ip6_vti0";
|
||||||
return tnl_del_ioctl("ip6_vti0", p.name, &p);
|
|
||||||
else
|
return tnl_del_ioctl(basedev, p.name, &p);
|
||||||
return tnl_del_ioctl("ip6tnl0", p.name, &p);
|
|
||||||
case IPPROTO_GRE:
|
|
||||||
return tnl_del_ioctl("ip6gre0", p.name, &p);
|
|
||||||
default:
|
|
||||||
return tnl_del_ioctl(p.name, p.name, &p);
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_ip6tunnel(int argc, char **argv)
|
int do_ip6tunnel(int argc, char **argv)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue