|
@@ -2822,17 +2822,21 @@ static int __vxlan_sock_add(struct vxlan_dev *vxlan, bool ipv6)
|
|
|
|
|
|
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);
|