• Konstantin Shemyak's avatar
    ip_tunnel: determine tunnel address family from the tunnel type · cc9c1dfa
    Konstantin Shemyak authored
    On 24.11.2015 02:26, Stephen Hemminger wrote:
    > On Thu, 12 Nov 2015 21:10:08 +0000
    > Konstantin Shemyak <konstantin@shemyak.com> wrote:
    >
    >> When creating an IP tunnel over IPv6, the address family must be passed in
    >> the option, e.g.
    >>
    >> ip -6 tunnel add mode ip6gre local 1::1 remote 2::2
    >>
    >> This makes it impossible to create both IPv4 and IPv6 tunnels in one batch.
    >>
    >> In fact the address family option is redundant here, as each tunnel mode is
    >> relevant for only one address family.
    >> The patch determines whether the applicable address family is AF_INET6
    >> instead of the default AF_INET and makes the "-6" option unnecessary for
    >> "ip tunnel add".
    >>
    >> Signed-off-by: Konstantin Shemyak <konstantin@shemyak.com>
    >> ---
    >>   ip/iptunnel.c                          | 26 ++++++++++++++++++++++++++
    >>   testsuite/tests/ip/tunnel/add_tunnel.t | 14 ++++++++++++++
    >>   2 files changed, 40 insertions(+)
    >>   create mode 100755 testsuite/tests/ip/tunnel/add_tunnel.t
    >>
    >> diff --git a/ip/iptunnel.c b/ip/iptunnel.c
    >> index 78fa988..7826a37 100644
    >> --- a/ip/iptunnel.c
    >> +++ b/ip/iptunnel.c
    >> @@ -629,8 +629,34 @@ static int do_6rd(int argc, char **argv)
    >>          return tnl_6rd_ioctl(cmd, medium, &ip6rd);
    >>   }
    >>
    >> +static int tunnel_mode_is_ipv6(char *tunnel_mode) {
    >> +       char *ipv6_modes[] = {
    >> +               "ipv6/ipv6", "ip6ip6",
    >> +               "vti6",
    >> +               "ip/ipv6", "ipv4/ipv6", "ipip6", "ip4ip6",
    >> +               "ip6gre", "gre/ipv6",
    >> +               "any/ipv6", "any"
    >> +       };
    >> +       int i;
    >> +
    >> +       for (i = 0; i < sizeof(ipv6_modes) / sizeof(char *); i++) {
    >> +               if (strcmp(ipv6_modes[i], tunnel_mode) == 0)
    >> +                       return 1;
    >> +       }
    >> +       return 0;
    >> +}
    >> +
    >
    > The ipv6_modes table should be static const.
    
    Thank you for the note! attached the corrected patch.
    
    > Also is it possible to use strstr for ipv6 and ip6 or even strchr(tunnel_mode, '6')
    > to simplify this?
    
    There is IPv6 tunnel mode 'any', and IPv4 tunnel mode 'ipv6/ip' (aka
    'sit'). It looks to me that attempts to find some substring match
    would not make the code much shorter, but definitely less readable.
    
    Konstantin Shemyak.
    
    >From 42d27db0055c3a114fe6eb86d680bef9ec098ad4 Mon Sep 17 00:00:00 2001
    From: Konstantin Shemyak <konstantin@shemyak.com>
    Date: Thu, 12 Nov 2015 20:52:02 +0200
    Subject: [PATCH] Tunnel address family is determined from the tunnel mode
    
    When the tunnel mode already tells the IP address family, "ip tunnel"
    command determines it and does not require option "-4"/"-6" to be passed.
    
    This makes possible creating both IPv4 and IPv6 tunnels in one batch.
    Signed-off-by: default avatarKonstantin Shemyak <konstantin@shemyak.com>
    cc9c1dfa
add_tunnel.t 449 Bytes