|
|
@@ -636,15 +636,20 @@ out:
|
|
|
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);
|