mocktransponder_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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.
  4. package ipv4_test
  5. import (
  6. "code.google.com/p/go.net/ipv4"
  7. "net"
  8. "testing"
  9. "time"
  10. )
  11. // writeThenReadPayload transmits IPv4 datagram payloads to the
  12. // loopback address or interface and captures the loopback'd datagram
  13. // payloads.
  14. func writeThenReadPayload(t *testing.T, i int, c *ipv4.PacketConn, wb []byte, dst net.Addr) []byte {
  15. rb := make([]byte, 1500)
  16. c.SetTOS(i + 1)
  17. var ip net.IP
  18. switch v := dst.(type) {
  19. case *net.UDPAddr:
  20. ip = v.IP
  21. case *net.IPAddr:
  22. ip = v.IP
  23. }
  24. if ip.IsMulticast() {
  25. c.SetMulticastTTL(i + 1)
  26. } else {
  27. c.SetTTL(i + 1)
  28. }
  29. c.SetDeadline(time.Now().Add(100 * time.Millisecond))
  30. if _, err := c.WriteTo(wb, nil, dst); err != nil {
  31. t.Fatalf("ipv4.PacketConn.WriteTo failed: %v", err)
  32. }
  33. n, cm, _, err := c.ReadFrom(rb)
  34. if err != nil {
  35. t.Fatalf("ipv4.PacketConn.ReadFrom failed: %v", err)
  36. }
  37. t.Logf("rcvd cmsg: %v", cm)
  38. return rb[:n]
  39. }
  40. // writeThenReadDatagram transmits ICMP for IPv4 datagrams to the
  41. // loopback address or interface and captures the response datagrams
  42. // from the protocol stack within the kernel.
  43. func writeThenReadDatagram(t *testing.T, i int, c *ipv4.RawConn, wb []byte, src, dst net.Addr) []byte {
  44. rb := make([]byte, ipv4.HeaderLen+len(wb))
  45. wh := &ipv4.Header{
  46. Version: ipv4.Version,
  47. Len: ipv4.HeaderLen,
  48. TOS: i + 1,
  49. TotalLen: ipv4.HeaderLen + len(wb),
  50. TTL: i + 1,
  51. Protocol: 1,
  52. }
  53. if src != nil {
  54. wh.Src = src.(*net.IPAddr).IP
  55. }
  56. if dst != nil {
  57. wh.Dst = dst.(*net.IPAddr).IP
  58. }
  59. c.SetDeadline(time.Now().Add(100 * time.Millisecond))
  60. if err := c.WriteTo(wh, wb, nil); err != nil {
  61. t.Fatalf("ipv4.RawConn.WriteTo failed: %v", err)
  62. }
  63. rh, b, cm, err := c.ReadFrom(rb)
  64. if err != nil {
  65. t.Fatalf("ipv4.RawConn.ReadFrom failed: %v", err)
  66. }
  67. t.Logf("rcvd cmsg: %v", cm.String())
  68. t.Logf("rcvd hdr: %v", rh.String())
  69. return b
  70. }
  71. func isUnicast(ip net.IP) bool {
  72. return ip.To4() != nil && (ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsGlobalUnicast())
  73. }
  74. // LoopbackInterface returns a logical network interface for loopback
  75. // tests.
  76. func loopbackInterface() *net.Interface {
  77. ift, err := net.Interfaces()
  78. if err != nil {
  79. return nil
  80. }
  81. for _, ifi := range ift {
  82. if ifi.Flags&net.FlagLoopback == 0 || ifi.Flags&net.FlagUp == 0 {
  83. continue
  84. }
  85. ifat, err := ifi.Addrs()
  86. if err != nil {
  87. continue
  88. }
  89. for _, ifa := range ifat {
  90. switch ifa := ifa.(type) {
  91. case *net.IPAddr:
  92. if isUnicast(ifa.IP) {
  93. return &ifi
  94. }
  95. case *net.IPNet:
  96. if isUnicast(ifa.IP) {
  97. return &ifi
  98. }
  99. }
  100. }
  101. }
  102. return nil
  103. }
  104. // isMulticastAvailable returns true if ifi is a multicast access
  105. // enabled network interface. It also returns a unicast IPv4 address
  106. // that can be used for listening on ifi.
  107. func isMulticastAvailable(ifi *net.Interface) (net.IP, bool) {
  108. if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 {
  109. return nil, false
  110. }
  111. ifat, err := ifi.Addrs()
  112. if err != nil {
  113. return nil, false
  114. }
  115. for _, ifa := range ifat {
  116. switch ifa := ifa.(type) {
  117. case *net.IPAddr:
  118. if isUnicast(ifa.IP) {
  119. return ifa.IP, true
  120. }
  121. case *net.IPNet:
  122. if isUnicast(ifa.IP) {
  123. return ifa.IP, true
  124. }
  125. }
  126. }
  127. return nil, false
  128. }