bpf: use of nettest

To ensure tests never fail on IPv6-only kernels.

Change-Id: I40713d00ba6066da69c84f5cd506a2243360e057
Reviewed-on: https://go-review.googlesource.com/c/net/+/169577
Run-TryBot: Mikio Hara <mikioh.public.networking@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matt Layher <mdlayher@gmail.com>
diff --git a/bpf/vm_bpf_test.go b/bpf/vm_bpf_test.go
index 77fa8fe..137eea1 100644
--- a/bpf/vm_bpf_test.go
+++ b/bpf/vm_bpf_test.go
@@ -12,6 +12,8 @@
 
 	"golang.org/x/net/bpf"
 	"golang.org/x/net/ipv4"
+	"golang.org/x/net/ipv6"
+	"golang.org/x/net/nettest"
 )
 
 // A virtualMachine is a BPF virtual machine which can process an
@@ -137,7 +139,7 @@
 // testOSVM creates a virtualMachine which uses the OS's BPF VM by injecting
 // packets into a UDP listener with a BPF program attached to it.
 func testOSVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func()) {
-	l, err := net.ListenPacket("udp4", "127.0.0.1:0")
+	l, err := nettest.NewLocalPacketListener("udp")
 	if err != nil {
 		t.Fatalf("failed to open OS VM UDP listener: %v", err)
 	}
@@ -147,12 +149,17 @@
 		t.Fatalf("failed to compile BPF program: %v", err)
 	}
 
-	p := ipv4.NewPacketConn(l)
-	if err = p.SetBPF(prog); err != nil {
+	ip := l.LocalAddr().(*net.UDPAddr).IP
+	if ip.To4() != nil && ip.To16() == nil {
+		err = ipv4.NewPacketConn(l).SetBPF(prog)
+	} else {
+		err = ipv6.NewPacketConn(l).SetBPF(prog)
+	}
+	if err != nil {
 		t.Fatalf("failed to attach BPF program to listener: %v", err)
 	}
 
-	s, err := net.Dial("udp4", l.LocalAddr().String())
+	s, err := net.Dial(l.LocalAddr().Network(), l.LocalAddr().String())
 	if err != nil {
 		t.Fatalf("failed to dial connection to listener: %v", err)
 	}