Patchwork [v2,2/4] ipv6: Allow ipv4 wildcard binds after ipv6 address binds

login
register
mail settings
Submitter Vlad Yasevich
Date March 25, 2009, 2:24 a.m.
Message ID <1237947891-26825-3-git-send-email-vladislav.yasevich@hp.com>
Download mbox | patch
Permalink /patch/25038/
State Accepted
Delegated to: David Miller
Headers show

Comments

Vlad Yasevich - March 25, 2009, 2:24 a.m.
The IPv4 wildcard (0.0.0.0) address does not intersect
in any way with explicit IPv6 addresses.  These two should
be permitted, but the IPv4 conflict code checks the ipv6only
bit as part of the test.  Since binding to an explicit IPv6
address restricts the socket to only that IPv6 address, the
side-effect is that the socket behaves as v6-only.  By
explicitely setting ipv6only in this case, allows the 2 binds
to succeed.

Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
---
 net/ipv6/af_inet6.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

Patch

diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 7f092fa..9b6a37d 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -346,8 +346,11 @@  int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 		goto out;
 	}
 
-	if (addr_type != IPV6_ADDR_ANY)
+	if (addr_type != IPV6_ADDR_ANY) {
 		sk->sk_userlocks |= SOCK_BINDADDR_LOCK;
+		if (addr_type != IPV6_ADDR_MAPPED)
+			np->ipv6only = 1;
+	}
 	if (snum)
 		sk->sk_userlocks |= SOCK_BINDPORT_LOCK;
 	inet->sport = htons(inet->num);