diff --git a/wgengine/magicsock/magicsock_test.go b/wgengine/magicsock/magicsock_test.go index 17d931e1f..a308e8dd7 100644 --- a/wgengine/magicsock/magicsock_test.go +++ b/wgengine/magicsock/magicsock_test.go @@ -56,7 +56,7 @@ func init() { // conditions in tests. In particular, you can't expect two test magicsocks // to be able to connect to each other through a test DERP unless they are // both fully initialized before you try. -func (c *Conn) WaitReady(t *testing.T) { +func (c *Conn) WaitReady(t testing.TB) { t.Helper() timer := time.NewTimer(10 * time.Second) defer timer.Stop() @@ -130,7 +130,7 @@ type magicStack struct { // newMagicStack builds and initializes an idle magicsock and // friends. You need to call conn.SetNetworkMap and dev.Reconfig // before anything interesting happens. -func newMagicStack(t *testing.T, logf logger.Logf, l nettype.PacketListener, derpMap *tailcfg.DERPMap) *magicStack { +func newMagicStack(t testing.TB, logf logger.Logf, l nettype.PacketListener, derpMap *tailcfg.DERPMap) *magicStack { t.Helper() privateKey, err := wgcfg.NewPrivateKey() @@ -377,7 +377,7 @@ collectEndpoints: } } -func pickPort(t *testing.T) uint16 { +func pickPort(t testing.TB) uint16 { t.Helper() conn, err := net.ListenPacket("udp4", "127.0.0.1:0") if err != nil { @@ -1344,3 +1344,75 @@ func TestDiscoEndpointAlignment(t *testing.T) { t.Error("expected false on second call") } } + +func BenchmarkReceiveFrom(b *testing.B) { + port := pickPort(b) + conn, err := NewConn(Options{ + Logf: b.Logf, + Port: port, + EndpointsFunc: func(eps []string) { + b.Logf("endpoints: %q", eps) + }, + }) + if err != nil { + b.Fatal(err) + } + defer conn.Close() + + sendConn, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + b.Fatal(err) + } + defer sendConn.Close() + + var dstAddr net.Addr = conn.pconn4.LocalAddr() + sendBuf := make([]byte, 1<<10) + for i := range sendBuf { + sendBuf[i] = 'x' + } + + buf := make([]byte, 2<<10) + for i := 0; i < b.N; i++ { + if _, err := sendConn.WriteTo(sendBuf, dstAddr); err != nil { + b.Fatalf("WriteTo: %v", err) + } + n, ep, addr, err := conn.ReceiveIPv4(buf) + if err != nil { + b.Fatal(err) + } + _ = n + _ = ep + _ = addr + } +} + +func BenchmarkReceiveFrom_Native(b *testing.B) { + recvConn, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + b.Fatal(err) + } + defer recvConn.Close() + recvConnUDP := recvConn.(*net.UDPConn) + + sendConn, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + b.Fatal(err) + } + defer sendConn.Close() + + var dstAddr net.Addr = recvConn.LocalAddr() + sendBuf := make([]byte, 1<<10) + for i := range sendBuf { + sendBuf[i] = 'x' + } + + buf := make([]byte, 2<<10) + for i := 0; i < b.N; i++ { + if _, err := sendConn.WriteTo(sendBuf, dstAddr); err != nil { + b.Fatalf("WriteTo: %v", err) + } + if _, _, err := recvConnUDP.ReadFromUDP(buf); err != nil { + b.Fatalf("ReadFromUDP: %v", err) + } + } +}