Message ID | 20190507170020.4952-2-nivedita.singhvi@canonical.com |
---|---|
State | New |
Headers | show |
Series | geneve: correctly handle ipv6.disable module parameter | expand |
On 5/7/19 7:00 PM, Nivedita Singhvi wrote: > From: Jiri Benc <jbenc@redhat.com> > > BugLink: https://bugs.launchpad.net/bugs/1794232 > > When IPv6 is compiled but disabled at runtime, geneve_sock_add returns > -EAFNOSUPPORT. For metadata based tunnels, this causes failure of the whole > operation of bringing up the tunnel. > > Ignore failure of IPv6 socket creation for metadata based tunnels caused by > IPv6 not being available. > > This is the same fix as what commit d074bf960044 ("vxlan: correctly handle > ipv6.disable module parameter") is doing for vxlan. > > Note there's also commit c0a47e44c098 ("geneve: should not call rt6_lookup() > when ipv6 was disabled") which fixes a similar issue but for regular > tunnels, while this patch is needed for metadata based tunnels. > > Signed-off-by: Jiri Benc <jbenc@redhat.com> > Signed-off-by: David S. Miller <davem@davemloft.net> > (cherry picked from commit cf1c9ccba7308e48a68fa77f476287d9d614e4c7) > Signed-off-by: Nivedita Singhvi <nivedita.singhvi@canonical.com> Hi Nivedita, Thanks for re-sending it. Clean cherry-pick, testcase well documented and low regression risk. Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> > --- > drivers/net/geneve.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c > index 8bb5bd72342a..62e62cab6739 100644 > --- a/drivers/net/geneve.c > +++ b/drivers/net/geneve.c > @@ -632,15 +632,20 @@ static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6) > static int geneve_open(struct net_device *dev) > { > struct geneve_dev *geneve = netdev_priv(dev); > - bool ipv6 = !!(geneve->info.mode & IP_TUNNEL_INFO_IPV6); > bool metadata = geneve->collect_md; > + bool ipv4, ipv6; > int ret = 0; > > + ipv6 = geneve->info.mode & IP_TUNNEL_INFO_IPV6 || metadata; > + ipv4 = !ipv6 || metadata; > #if IS_ENABLED(CONFIG_IPV6) > - if (ipv6 || metadata) > + if (ipv6) { > ret = geneve_sock_add(geneve, true); > + if (ret < 0 && ret != -EAFNOSUPPORT) > + ipv4 = false; > + } > #endif > - if (!ret && (!ipv6 || metadata)) > + if (ipv4) > ret = geneve_sock_add(geneve, false); > if (ret < 0) > geneve_sock_release(geneve); >
On 5/7/19 10:00 AM, Nivedita Singhvi wrote: > From: Jiri Benc <jbenc@redhat.com> > > BugLink: https://bugs.launchpad.net/bugs/1794232 > > When IPv6 is compiled but disabled at runtime, geneve_sock_add returns > -EAFNOSUPPORT. For metadata based tunnels, this causes failure of the whole > operation of bringing up the tunnel. > > Ignore failure of IPv6 socket creation for metadata based tunnels caused by > IPv6 not being available. > > This is the same fix as what commit d074bf960044 ("vxlan: correctly handle > ipv6.disable module parameter") is doing for vxlan. > > Note there's also commit c0a47e44c098 ("geneve: should not call rt6_lookup() > when ipv6 was disabled") which fixes a similar issue but for regular > tunnels, while this patch is needed for metadata based tunnels. > > Signed-off-by: Jiri Benc <jbenc@redhat.com> > Signed-off-by: David S. Miller <davem@davemloft.net> > (cherry picked from commit cf1c9ccba7308e48a68fa77f476287d9d614e4c7) > Signed-off-by: Nivedita Singhvi <nivedita.singhvi@canonical.com> > --- Agreed with Kleber, great documentation. Acked-by: Connor Kuehl <connor.kuehl@canonical.com> > drivers/net/geneve.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c > index 8bb5bd72342a..62e62cab6739 100644 > --- a/drivers/net/geneve.c > +++ b/drivers/net/geneve.c > @@ -632,15 +632,20 @@ static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6) > static int geneve_open(struct net_device *dev) > { > struct geneve_dev *geneve = netdev_priv(dev); > - bool ipv6 = !!(geneve->info.mode & IP_TUNNEL_INFO_IPV6); > bool metadata = geneve->collect_md; > + bool ipv4, ipv6; > int ret = 0; > > + ipv6 = geneve->info.mode & IP_TUNNEL_INFO_IPV6 || metadata; > + ipv4 = !ipv6 || metadata; > #if IS_ENABLED(CONFIG_IPV6) > - if (ipv6 || metadata) > + if (ipv6) { > ret = geneve_sock_add(geneve, true); > + if (ret < 0 && ret != -EAFNOSUPPORT) > + ipv4 = false; > + } > #endif > - if (!ret && (!ipv6 || metadata)) > + if (ipv4) > ret = geneve_sock_add(geneve, false); > if (ret < 0) > geneve_sock_release(geneve); >
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 8bb5bd72342a..62e62cab6739 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -632,15 +632,20 @@ static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6) static int geneve_open(struct net_device *dev) { struct geneve_dev *geneve = netdev_priv(dev); - bool ipv6 = !!(geneve->info.mode & IP_TUNNEL_INFO_IPV6); bool metadata = geneve->collect_md; + bool ipv4, ipv6; int ret = 0; + ipv6 = geneve->info.mode & IP_TUNNEL_INFO_IPV6 || metadata; + ipv4 = !ipv6 || metadata; #if IS_ENABLED(CONFIG_IPV6) - if (ipv6 || metadata) + if (ipv6) { ret = geneve_sock_add(geneve, true); + if (ret < 0 && ret != -EAFNOSUPPORT) + ipv4 = false; + } #endif - if (!ret && (!ipv6 || metadata)) + if (ipv4) ret = geneve_sock_add(geneve, false); if (ret < 0) geneve_sock_release(geneve);