1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
15 "golang.org/x/net/internal/nettest"
16 "golang.org/x/net/ipv4"
19 func BenchmarkReadWriteUnicast(b *testing.B) {
20 c, err := nettest.NewLocalPacketListener("udp4")
22 b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err)
27 wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
29 b.Run("NetUDP", func(b *testing.B) {
30 for i := 0; i < b.N; i++ {
31 if _, err := c.WriteTo(wb, dst); err != nil {
34 if _, _, err := c.ReadFrom(rb); err != nil {
39 b.Run("IPv4UDP", func(b *testing.B) {
40 p := ipv4.NewPacketConn(c)
41 cf := ipv4.FlagTTL | ipv4.FlagInterface
42 if err := p.SetControlMessage(cf, true); err != nil {
45 cm := ipv4.ControlMessage{TTL: 1}
46 ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback)
48 cm.IfIndex = ifi.Index
51 for i := 0; i < b.N; i++ {
52 if _, err := p.WriteTo(wb, &cm, dst); err != nil {
55 if _, _, _, err := p.ReadFrom(rb); err != nil {
62 func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) {
64 case "nacl", "plan9", "windows":
65 t.Skipf("not supported on %s", runtime.GOOS)
68 c, err := nettest.NewLocalPacketListener("udp4")
73 p := ipv4.NewPacketConn(c)
77 ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback)
78 cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface
79 wb := []byte("HELLO-R-U-THERE")
81 if err := p.SetControlMessage(cf, true); err != nil { // probe before test
82 if nettest.ProtocolNotSupported(err) {
83 t.Skipf("not supported on %s", runtime.GOOS)
91 rb := make([]byte, 128)
92 if n, cm, _, err := p.ReadFrom(rb); err != nil {
95 } else if !bytes.Equal(rb[:n], wb) {
96 t.Errorf("got %v; want %v", rb[:n], wb)
100 if strings.Contains(s, ",") {
101 t.Errorf("should be space-separated values: %s", s)
105 writer := func(toggle bool) {
107 cm := ipv4.ControlMessage{
108 Src: net.IPv4(127, 0, 0, 1),
111 cm.IfIndex = ifi.Index
113 if err := p.SetControlMessage(cf, toggle); err != nil {
117 if n, err := p.WriteTo(wb, &cm, dst); err != nil {
120 } else if n != len(wb) {
121 t.Errorf("got %d; want %d", n, len(wb))
128 for i := 0; i < N; i++ {
132 for i := 0; i < 2*N; i++ {
136 for i := 0; i < N; i++ {