Skip to content

Commit 2aa8215

Browse files
cuonglmgopherbot
authored andcommitted
nettest: use RoutedInterface for probing network stack capability
The ipv4/ipv6 support capability is done by explicitly listening on loopback interface. However, it can lead to false positive, especially for ipv6 case. For example, ipv6 can be enabled, but explicitly disable for loopback interface (for security, policy ...). This CL changes probeStack to use another approach, by looking for any interface that can route IP traffic and in "UP" state. If there's one, then the platform can do ipv4/ipv6 networking functionality. Fixes golang/go#57386 Change-Id: If911bc223b52c5a4562d3f61b4ee1032bdbec47c Reviewed-on: https://go-review.googlesource.com/c/net/+/458096 TryBot-Result: Gopher Robot <[email protected]> Auto-Submit: Cuong Manh Le <[email protected]> Reviewed-by: Benny Siegert <[email protected]> Reviewed-by: Matt Layher <[email protected]> Run-TryBot: Cuong Manh Le <[email protected]> Reviewed-by: David Chase <[email protected]>
1 parent ad92d3d commit 2aa8215

File tree

6 files changed

+18
-20
lines changed

6 files changed

+18
-20
lines changed

ipv6/bpf_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ func TestBPF(t *testing.T) {
1919
if runtime.GOOS != "linux" {
2020
t.Skipf("not supported on %s", runtime.GOOS)
2121
}
22-
if !nettest.SupportsIPv6() {
23-
t.Skip("ipv6 is not supported")
22+
if _, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); err != nil {
23+
t.Skip("ipv6 is not enabled for loopback interface")
2424
}
2525

2626
l, err := net.ListenPacket("udp6", "[::1]:0")

ipv6/readwrite_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,10 @@ func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) {
223223
case "fuchsia", "hurd", "js", "nacl", "plan9", "windows":
224224
t.Skipf("not supported on %s", runtime.GOOS)
225225
}
226-
if !nettest.SupportsIPv6() {
227-
t.Skip("ipv6 is not supported")
226+
ifi, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback)
227+
if err != nil {
228+
t.Skip("ipv6 is not enabled for loopback interface")
228229
}
229-
230230
c, err := nettest.NewLocalPacketListener("udp6")
231231
if err != nil {
232232
t.Fatal(err)
@@ -236,7 +236,6 @@ func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) {
236236
defer p.Close()
237237

238238
dst := c.LocalAddr()
239-
ifi, _ := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback)
240239
cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU
241240
wb := []byte("HELLO-R-U-THERE")
242241

ipv6/sockopt_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ func TestConnInitiatorPathMTU(t *testing.T) {
2020
case "fuchsia", "hurd", "js", "nacl", "plan9", "windows", "zos":
2121
t.Skipf("not supported on %s", runtime.GOOS)
2222
}
23-
if !nettest.SupportsIPv6() {
24-
t.Skip("ipv6 is not supported")
23+
24+
if _, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); err != nil {
25+
t.Skip("ipv6 is not enabled for loopback interface")
2526
}
2627

2728
ln, err := net.Listen("tcp6", "[::1]:0")
@@ -53,8 +54,8 @@ func TestConnResponderPathMTU(t *testing.T) {
5354
case "fuchsia", "hurd", "js", "nacl", "plan9", "windows", "zos":
5455
t.Skipf("not supported on %s", runtime.GOOS)
5556
}
56-
if !nettest.SupportsIPv6() {
57-
t.Skip("ipv6 is not supported")
57+
if _, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); err != nil {
58+
t.Skip("ipv6 is not enabled for loopback interface")
5859
}
5960

6061
ln, err := net.Listen("tcp6", "[::1]:0")

ipv6/unicast_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ func TestPacketConnReadWriteUnicastUDP(t *testing.T) {
2323
case "fuchsia", "hurd", "js", "nacl", "plan9", "windows":
2424
t.Skipf("not supported on %s", runtime.GOOS)
2525
}
26-
if !nettest.SupportsIPv6() {
27-
t.Skip("ipv6 is not supported")
26+
if _, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); err != nil {
27+
t.Skip("ipv6 is not enabled for loopback interface")
2828
}
2929

3030
c, err := nettest.NewLocalPacketListener("udp6")

ipv6/unicastsockopt_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ func TestConnUnicastSocketOptions(t *testing.T) {
1919
case "fuchsia", "hurd", "js", "nacl", "plan9", "windows":
2020
t.Skipf("not supported on %s", runtime.GOOS)
2121
}
22-
if !nettest.SupportsIPv6() {
23-
t.Skip("ipv6 is not supported")
22+
if _, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); err != nil {
23+
t.Skip("ipv6 is not enabled for loopback interface")
2424
}
2525

2626
ln, err := net.Listen("tcp6", "[::1]:0")
@@ -64,8 +64,8 @@ func TestPacketConnUnicastSocketOptions(t *testing.T) {
6464
case "fuchsia", "hurd", "js", "nacl", "plan9", "windows":
6565
t.Skipf("not supported on %s", runtime.GOOS)
6666
}
67-
if !nettest.SupportsIPv6() {
68-
t.Skip("ipv6 is not supported")
67+
if _, err := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback); err != nil {
68+
t.Skip("ipv6 is not enabled for loopback interface")
6969
}
7070

7171
ok := nettest.SupportsRawSocket()

nettest/nettest.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@ var (
3434
)
3535

3636
func probeStack() {
37-
if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil {
38-
ln.Close()
37+
if _, err := RoutedInterface("ip4", net.FlagUp); err == nil {
3938
ipv4Enabled = true
4039
}
41-
if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil {
42-
ln.Close()
40+
if _, err := RoutedInterface("ip6", net.FlagUp); err == nil {
4341
ipv6Enabled = true
4442
}
4543
rawSocketSess = supportsRawSocket()

0 commit comments

Comments
 (0)