unicast_test.go 6.4 KB

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