unicast_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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.
  4. package ipv6_test
  5. import (
  6. "code.google.com/p/go.net/ipv6"
  7. "net"
  8. "os"
  9. "runtime"
  10. "testing"
  11. )
  12. func benchmarkUDPListener() (net.PacketConn, net.Addr, error) {
  13. c, err := net.ListenPacket("udp6", "[::1]:0")
  14. if err != nil {
  15. return nil, nil, err
  16. }
  17. dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String())
  18. if err != nil {
  19. c.Close()
  20. return nil, nil, err
  21. }
  22. return c, dst, nil
  23. }
  24. func BenchmarkReadWriteNetUDP(b *testing.B) {
  25. c, dst, err := benchmarkUDPListener()
  26. if err != nil {
  27. b.Fatalf("benchmarkUDPListener failed: %v", err)
  28. }
  29. defer c.Close()
  30. wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
  31. b.ResetTimer()
  32. for i := 0; i < b.N; i++ {
  33. benchmarkReadWriteNetUDP(b, c, wb, rb, dst)
  34. }
  35. }
  36. func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) {
  37. if _, err := c.WriteTo(wb, dst); err != nil {
  38. b.Fatalf("net.PacketConn.WriteTo failed: %v", err)
  39. }
  40. if _, _, err := c.ReadFrom(rb); err != nil {
  41. b.Fatalf("net.PacketConn.ReadFrom failed: %v", err)
  42. }
  43. }
  44. func BenchmarkReadWriteIPv6UDP(b *testing.B) {
  45. c, dst, err := benchmarkUDPListener()
  46. if err != nil {
  47. b.Fatalf("benchmarkUDPListener failed: %v", err)
  48. }
  49. defer c.Close()
  50. p := ipv6.NewPacketConn(c)
  51. cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU
  52. if err := p.SetControlMessage(cf, true); err != nil {
  53. b.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err)
  54. }
  55. ifi := loopbackInterface()
  56. wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
  57. b.ResetTimer()
  58. for i := 0; i < b.N; i++ {
  59. benchmarkReadWriteIPv6UDP(b, p, wb, rb, dst, ifi)
  60. }
  61. }
  62. func benchmarkReadWriteIPv6UDP(b *testing.B, p *ipv6.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) {
  63. cm := ipv6.ControlMessage{
  64. TrafficClass: DiffServAF11 | CongestionExperienced,
  65. HopLimit: 1,
  66. }
  67. if ifi != nil {
  68. cm.IfIndex = ifi.Index
  69. }
  70. if _, err := p.WriteTo(wb, &cm, dst); err != nil {
  71. b.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err)
  72. }
  73. if _, _, _, err := p.ReadFrom(rb); err != nil {
  74. b.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err)
  75. }
  76. }
  77. func TestPacketConnReadWriteUnicastUDP(t *testing.T) {
  78. switch runtime.GOOS {
  79. case "plan9", "windows":
  80. t.Skipf("not supported on %q", runtime.GOOS)
  81. }
  82. if !supportsIPv6 {
  83. t.Skip("ipv6 is not supported")
  84. }
  85. c, err := net.ListenPacket("udp6", "[::1]:0")
  86. if err != nil {
  87. t.Fatalf("net.ListenPacket failed: %v", err)
  88. }
  89. defer c.Close()
  90. dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String())
  91. if err != nil {
  92. t.Fatalf("net.ResolveUDPAddr failed: %v", err)
  93. }
  94. p := ipv6.NewPacketConn(c)
  95. cm := ipv6.ControlMessage{
  96. TrafficClass: DiffServAF11 | CongestionExperienced,
  97. }
  98. cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU
  99. ifi := loopbackInterface()
  100. if ifi != nil {
  101. cm.IfIndex = ifi.Index
  102. }
  103. for i, toggle := range []bool{true, false, true} {
  104. if err := p.SetControlMessage(cf, toggle); err != nil {
  105. t.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err)
  106. }
  107. cm.HopLimit = i + 1
  108. if _, err := p.WriteTo([]byte("HELLO-R-U-THERE"), &cm, dst); err != nil {
  109. t.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err)
  110. }
  111. b := make([]byte, 128)
  112. if _, cm, _, err := p.ReadFrom(b); err != nil {
  113. t.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err)
  114. } else {
  115. t.Logf("rcvd cmsg: %v", cm)
  116. }
  117. }
  118. }
  119. func TestPacketConnReadWriteUnicastICMP(t *testing.T) {
  120. switch runtime.GOOS {
  121. case "plan9", "windows":
  122. t.Skipf("not supported on %q", runtime.GOOS)
  123. }
  124. if !supportsIPv6 {
  125. t.Skip("ipv6 is not supported")
  126. }
  127. if os.Getuid() != 0 {
  128. t.Skip("must be root")
  129. }
  130. c, err := net.ListenPacket("ip6:ipv6-icmp", "::1")
  131. if err != nil {
  132. t.Fatalf("net.ListenPacket failed: %v", err)
  133. }
  134. defer c.Close()
  135. dst, err := net.ResolveIPAddr("ip6", "::1")
  136. if err != nil {
  137. t.Fatalf("net.ResolveIPAddr failed: %v", err)
  138. }
  139. p := ipv6.NewPacketConn(c)
  140. cm := ipv6.ControlMessage{TrafficClass: DiffServAF11 | CongestionExperienced}
  141. cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagInterface | ipv6.FlagPathMTU
  142. ifi := loopbackInterface()
  143. if ifi != nil {
  144. cm.IfIndex = ifi.Index
  145. }
  146. var f ipv6.ICMPFilter
  147. f.SetAll(true)
  148. f.Set(ipv6.ICMPTypeEchoReply, false)
  149. if err := p.SetICMPFilter(&f); err != nil {
  150. t.Fatalf("ipv6.PacketConn.SetICMPFilter failed: %v", err)
  151. }
  152. for i, toggle := range []bool{true, false, true} {
  153. wb, err := (&icmpMessage{
  154. Type: ipv6.ICMPTypeEchoRequest, Code: 0,
  155. Body: &icmpEcho{
  156. ID: os.Getpid() & 0xffff, Seq: i + 1,
  157. Data: []byte("HELLO-R-U-THERE"),
  158. },
  159. }).Marshal()
  160. if err != nil {
  161. t.Fatalf("icmpMessage.Marshal failed: %v", err)
  162. }
  163. if err := p.SetControlMessage(cf, toggle); err != nil {
  164. t.Fatalf("ipv6.PacketConn.SetControlMessage failed: %v", err)
  165. }
  166. cm.HopLimit = i + 1
  167. if _, err := p.WriteTo(wb, &cm, dst); err != nil {
  168. t.Fatalf("ipv6.PacketConn.WriteTo failed: %v", err)
  169. }
  170. b := make([]byte, 128)
  171. if n, cm, _, err := p.ReadFrom(b); err != nil {
  172. t.Fatalf("ipv6.PacketConn.ReadFrom failed: %v", err)
  173. } else {
  174. t.Logf("rcvd cmsg: %v", cm)
  175. if m, err := parseICMPMessage(b[:n]); err != nil {
  176. t.Fatalf("parseICMPMessage failed: %v", err)
  177. } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 {
  178. t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0)
  179. }
  180. }
  181. }
  182. }