From 5a3ff6c8955a5df81f6dd83e143a47bd51266b61 Mon Sep 17 00:00:00 2001 From: Paul Marks Date: Fri, 4 Sep 2015 18:33:35 -0700 Subject: [PATCH] net: Make Listen(":port") use IPv6 when IPv4 is not supported. When running an experimental kernel with IPv4 disabled, Listen(":port") currently tries to create an AF_INET socket, and fails. Instead, it should see !supportsIPv4, and use an AF_INET6 socket. This sort of environment is quite esoteric at the moment, but I can force the tests to fail on regular Linux using the following tweaks: - net/net.go: supportsIPv4, supportsIPv6, supportsIPv4map = false, true, false - net/sockopt_linux.go: ipv6only=true - net/ipsock_posix.go: Revert this fix - ./make.bash && ../bin/go test net Also, make the arrows in server_test.go point to the left, because server<-client is easier to read. Fixes #12510 Change-Id: I0cc3b6b08d5e6908d2fbf8594f652ba19815aa4b Reviewed-on: https://go-review.googlesource.com/14334 Run-TryBot: Paul Marks Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/ipsock_posix.go | 11 ++++++----- src/net/platform_test.go | 2 +- src/net/server_test.go | 6 +++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/net/ipsock_posix.go b/src/net/ipsock_posix.go index 83eaf855b4c2d0..4419aaf8a06d70 100644 --- a/src/net/ipsock_posix.go +++ b/src/net/ipsock_posix.go @@ -101,10 +101,11 @@ func probeIPv6Stack() (supportsIPv6, supportsIPv4map bool) { // // 1. A wild-wild listen, "tcp" + "" // If the platform supports both IPv6 and IPv6 IPv4-mapping -// capabilities, we assume that the user want to listen on -// both IPv4 and IPv6 wildcard address over an AF_INET6 -// socket with IPV6_V6ONLY=0. Otherwise we prefer an IPv4 -// wildcard address listen over an AF_INET socket. +// capabilities, or does not support IPv4, we assume that +// the user wants to listen on both IPv4 and IPv6 wildcard +// addresses over an AF_INET6 socket with IPV6_V6ONLY=0. +// Otherwise we prefer an IPv4 wildcard address listen over +// an AF_INET socket. // // 2. A wild-ipv4wild listen, "tcp" + "0.0.0.0" // Same as 1. @@ -137,7 +138,7 @@ func favoriteAddrFamily(net string, laddr, raddr sockaddr, mode string) (family } if mode == "listen" && (laddr == nil || laddr.isWildcard()) { - if supportsIPv4map { + if supportsIPv4map || !supportsIPv4 { return syscall.AF_INET6, false } if laddr == nil { diff --git a/src/net/platform_test.go b/src/net/platform_test.go index d6248520f33b69..c9415d1038c1ea 100644 --- a/src/net/platform_test.go +++ b/src/net/platform_test.go @@ -134,7 +134,7 @@ func testableListenArgs(network, address, client string) bool { // Test functionality of IPv4 communication using AF_INET6 // sockets. - if !supportsIPv4map && (network == "tcp" || network == "udp" || network == "ip") && wildcard { + if !supportsIPv4map && supportsIPv4 && (network == "tcp" || network == "udp" || network == "ip") && wildcard { // At this point, we prefer IPv4 when ip is nil. // See favoriteAddrFamily for further information. if ip.To16() != nil && ip.To4() == nil && cip.To4() != nil { // a pair of IPv6 server and IPv4 client diff --git a/src/net/server_test.go b/src/net/server_test.go index fe0006b11fb037..2e998e23a8a0ab 100644 --- a/src/net/server_test.go +++ b/src/net/server_test.go @@ -55,7 +55,7 @@ func TestTCPServer(t *testing.T) { for i, tt := range tcpServerTests { if !testableListenArgs(tt.snet, tt.saddr, tt.taddr) { - t.Logf("skipping %s test", tt.snet+" "+tt.saddr+"->"+tt.taddr) + t.Logf("skipping %s test", tt.snet+" "+tt.saddr+"<-"+tt.taddr) continue } @@ -251,7 +251,7 @@ var udpServerTests = []struct { func TestUDPServer(t *testing.T) { for i, tt := range udpServerTests { if !testableListenArgs(tt.snet, tt.saddr, tt.taddr) { - t.Logf("skipping %s test", tt.snet+" "+tt.saddr+"->"+tt.taddr) + t.Logf("skipping %s test", tt.snet+" "+tt.saddr+"<-"+tt.taddr) continue } @@ -329,7 +329,7 @@ var unixgramServerTests = []struct { func TestUnixgramServer(t *testing.T) { for i, tt := range unixgramServerTests { if !testableListenArgs("unixgram", tt.saddr, "") { - t.Logf("skipping %s test", "unixgram "+tt.saddr+"->"+tt.caddr) + t.Logf("skipping %s test", "unixgram "+tt.saddr+"<-"+tt.caddr) continue }