static int vxlan_sock_add(struct vxlan_dev *vxlan)
 {
-       bool ipv6 = vxlan->flags & VXLAN_F_IPV6;
        bool metadata = vxlan->flags & VXLAN_F_COLLECT_METADATA;
+       bool ipv6 = vxlan->flags & VXLAN_F_IPV6 || metadata;
+       bool ipv4 = !ipv6 || metadata;
        int ret = 0;
 
        RCU_INIT_POINTER(vxlan->vn4_sock, NULL);
 #if IS_ENABLED(CONFIG_IPV6)
        RCU_INIT_POINTER(vxlan->vn6_sock, NULL);
-       if (ipv6 || metadata)
+       if (ipv6) {
                ret = __vxlan_sock_add(vxlan, true);
+               if (ret < 0 && ret != -EAFNOSUPPORT)
+                       ipv4 = false;
+       }
 #endif
-       if (!ret && (!ipv6 || metadata))
+       if (ipv4)
                ret = __vxlan_sock_add(vxlan, false);
        if (ret < 0)
                vxlan_sock_release(vxlan);