|
@@ -2758,8 +2758,6 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,
|
|
|
|
|
|
sock = vxlan_create_sock(net, ipv6, port, flags);
|
|
|
if (IS_ERR(sock)) {
|
|
|
- pr_info("Cannot bind port %d, err=%ld\n", ntohs(port),
|
|
|
- PTR_ERR(sock));
|
|
|
kfree(vs);
|
|
|
return ERR_CAST(sock);
|
|
|
}
|
|
@@ -2822,17 +2820,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);
|