Skip to contentSkip to conversation

vxlan: do not error out on disabled IPv6

PATCH In review Jiri Benc 2 participants 4 messages Apr 27, 2017 – May 1, 2017

Subsystems (2)
lore
Share & tools
lore

Jiri Benc

author
#0 lore raw

cover vxlan: do not error out on disabled IPv6

This patchset fixes a bug with metadata based tunnels when booted with ipv6.disable=1.

Jiri Benc (2):
vxlan: correctly handle ipv6.disable module parameter
vxlan: do not output confusing error message

 drivers/net/vxlan.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
Signature · 1 line
1.8.3.1
author
#1 lore raw

PATCH 1/2 vxlan: correctly handle ipv6.disable module parameter

When IPv6 is compiled but disabled at runtime, __vxlan_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.

Fixes b1be00a6c39f ("vxlan: support both IPv4 and IPv6 sockets in a single vxlan device")
---
 drivers/net/vxlan.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/vxlan.c +7 -3
index bdb6ae16d4a8..118e508f1889 100644
@@ -2818,17 +2818,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);
Signature · 1 line
1.8.3.1
author
#2 lore raw

PATCH 2/2 vxlan: do not output confusing error message

In reply to Jiri Benc

The message "Cannot bind port X, err=Y" creates only confusion. In metadata based mode, failure of IPv6 socket creation is okay if IPv6 is disabled and no error message should be printed. But when IPv6 tunnel was requested, such failure is fatal. The vxlan_socket_create does not know when the error is harmless and when it's not.

Instead of passing such information down to vxlan_socket_create, remove the message completely. It's not useful. We propagate the error code up to the user space and the port number comes from the user space. There's nothing in the message that the process creating vxlan interface does not know.

---
 drivers/net/vxlan.c | 2 --
 1 file changed, 2 deletions(-)
drivers/net/vxlan.c +0 -2
index 118e508f1889..27cba699d83a 100644
@@ -2754,8 +2754,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);
 	}
Signature · 1 line
1.8.3.1