static int do_add(int cmd, int argc, char **argv) { struct ip_tunnel_parm p; if (parse_args(argc, argv, cmd, &p) < 0) return -1; if (p.iph.ttl && p.iph.frag_off == 0) { fprintf(stderr, "ttl != 0 and nopmtudisc are incompatible\n"); return -1; } switch (p.iph.protocol) { case IPPROTO_IPIP: if (p.i_flags & VTI_ISVTI) return tnl_add_ioctl(cmd, "ip_vti0", p.name, &p); else return tnl_add_ioctl(cmd, "tunl0", p.name, &p); case IPPROTO_GRE: return tnl_add_ioctl(cmd, "gre0", p.name, &p); case IPPROTO_IPV6: return tnl_add_ioctl(cmd, "sit0", p.name, &p); default: fprintf(stderr, "cannot determine tunnel mode (ipip, gre, vti or sit)\n"); return -1; } return -1; }
static int do_add(int cmd, int argc, char **argv) { struct ip6_tnl_parm2 p; ip6_tnl_parm_init(&p, 1); if (parse_args(argc, argv, cmd, &p) < 0) return -1; switch (p.proto) { case IPPROTO_IPIP: case IPPROTO_IPV6: 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 or gre)\n"); } return -1; }
static int do_add(int cmd, int argc, char **argv) { struct ip6_tnl_parm p; ip6_tnl_parm_init(&p, 1); if (parse_args(argc, argv, cmd, &p) < 0) return -1; return tnl_add_ioctl(cmd, cmd == SIOCCHGTUNNEL && p.name[0] ? p.name : "ip6tnl0", p.name, &p); }
static int do_add(int cmd, int argc, char **argv) { struct ip6_tnl_parm2 p; const char *basedev = "ip6tnl0"; ip6_tnl_parm_init(&p, 1); if (parse_args(argc, argv, cmd, &p) < 0) return -1; if (p.proto == IPPROTO_GRE) basedev = "ip6gre0"; else if (p.i_flags & VTI_ISVTI) basedev = "ip6_vti0"; return tnl_add_ioctl(cmd, basedev, p.name, &p); }
static int do_add(int cmd, int argc, char **argv) { struct ip_tunnel_parm p; const char *basedev; if (parse_args(argc, argv, cmd, &p) < 0) return -1; if (p.iph.ttl && p.iph.frag_off == 0) { fprintf(stderr, "ttl != 0 and nopmtudisc are incompatible\n"); return -1; } basedev = tnl_defname(&p); if (!basedev) { fprintf(stderr, "cannot determine tunnel mode (ipip, gre, vti or sit)\n"); return -1; } return tnl_add_ioctl(cmd, basedev, p.name, &p); }