1 // Copyright 2013 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/iana"
16 "golang.org/x/net/internal/nettest"
17 "golang.org/x/net/ipv6"
20 func BenchmarkReadWriteUnicast(b *testing.B) {
21 c, err := nettest.NewLocalPacketListener("udp6")
23 b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err)
28 wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
30 b.Run("NetUDP", func(b *testing.B) {
31 for i := 0; i < b.N; i++ {
32 if _, err := c.WriteTo(wb, dst); err != nil {
35 if _, _, err := c.ReadFrom(rb); err != nil {
40 b.Run("IPv6UDP", func(b *testing.B) {
41 p := ipv6.NewPacketConn(c)
42 cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU
43 if err := p.SetControlMessage(cf, true); err != nil {
46 cm := ipv6.ControlMessage{
47 TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced,
50 ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback)
52 cm.IfIndex = ifi.Index
55 for i := 0; i < b.N; i++ {
56 if _, err := p.WriteTo(wb, &cm, dst); err != nil {
59 if _, _, _, err := p.ReadFrom(rb); err != nil {
66 func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) {
68 case "nacl", "plan9", "windows":
69 t.Skipf("not supported on %s", runtime.GOOS)
72 t.Skip("ipv6 is not supported")
75 c, err := nettest.NewLocalPacketListener("udp6")
80 p := ipv6.NewPacketConn(c)
84 ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback)
85 cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU
86 wb := []byte("HELLO-R-U-THERE")
88 if err := p.SetControlMessage(cf, true); err != nil { // probe before test
89 if nettest.ProtocolNotSupported(err) {
90 t.Skipf("not supported on %s", runtime.GOOS)
98 rb := make([]byte, 128)
99 if n, cm, _, err := p.ReadFrom(rb); err != nil {
102 } else if !bytes.Equal(rb[:n], wb) {
103 t.Errorf("got %v; want %v", rb[:n], wb)
107 if strings.Contains(s, ",") {
108 t.Errorf("should be space-separated values: %s", s)
112 writer := func(toggle bool) {
114 cm := ipv6.ControlMessage{
115 TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced,
116 Src: net.IPv6loopback,
119 cm.IfIndex = ifi.Index
121 if err := p.SetControlMessage(cf, toggle); err != nil {
125 if n, err := p.WriteTo(wb, &cm, dst); err != nil {
128 } else if n != len(wb) {
129 t.Errorf("got %d; want %d", n, len(wb))
136 for i := 0; i < N; i++ {
140 for i := 0; i < 2*N; i++ {
144 for i := 0; i < N; i++ {