header_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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
  5. import (
  6. "bytes"
  7. "encoding/binary"
  8. "net"
  9. "reflect"
  10. "runtime"
  11. "strings"
  12. "testing"
  13. "golang.org/x/net/internal/socket"
  14. )
  15. type headerTest struct {
  16. wireHeaderFromKernel [HeaderLen]byte
  17. wireHeaderToKernel [HeaderLen]byte
  18. wireHeaderFromTradBSDKernel [HeaderLen]byte
  19. wireHeaderToTradBSDKernel [HeaderLen]byte
  20. wireHeaderFromFreeBSD10Kernel [HeaderLen]byte
  21. wireHeaderToFreeBSD10Kernel [HeaderLen]byte
  22. *Header
  23. }
  24. var headerLittleEndianTest = headerTest{
  25. // TODO(mikio): Add platform dependent wire header formats when
  26. // we support new platforms.
  27. wireHeaderFromKernel: [HeaderLen]byte{
  28. 0x45, 0x01, 0xbe, 0xef,
  29. 0xca, 0xfe, 0x45, 0xdc,
  30. 0xff, 0x01, 0xde, 0xad,
  31. 172, 16, 254, 254,
  32. 192, 168, 0, 1,
  33. },
  34. wireHeaderToKernel: [HeaderLen]byte{
  35. 0x45, 0x01, 0xbe, 0xef,
  36. 0xca, 0xfe, 0x45, 0xdc,
  37. 0xff, 0x01, 0xde, 0xad,
  38. 172, 16, 254, 254,
  39. 192, 168, 0, 1,
  40. },
  41. wireHeaderFromTradBSDKernel: [HeaderLen]byte{
  42. 0x45, 0x01, 0xdb, 0xbe,
  43. 0xca, 0xfe, 0xdc, 0x45,
  44. 0xff, 0x01, 0xde, 0xad,
  45. 172, 16, 254, 254,
  46. 192, 168, 0, 1,
  47. },
  48. wireHeaderToTradBSDKernel: [HeaderLen]byte{
  49. 0x45, 0x01, 0xef, 0xbe,
  50. 0xca, 0xfe, 0xdc, 0x45,
  51. 0xff, 0x01, 0xde, 0xad,
  52. 172, 16, 254, 254,
  53. 192, 168, 0, 1,
  54. },
  55. wireHeaderFromFreeBSD10Kernel: [HeaderLen]byte{
  56. 0x45, 0x01, 0xef, 0xbe,
  57. 0xca, 0xfe, 0xdc, 0x45,
  58. 0xff, 0x01, 0xde, 0xad,
  59. 172, 16, 254, 254,
  60. 192, 168, 0, 1,
  61. },
  62. wireHeaderToFreeBSD10Kernel: [HeaderLen]byte{
  63. 0x45, 0x01, 0xef, 0xbe,
  64. 0xca, 0xfe, 0xdc, 0x45,
  65. 0xff, 0x01, 0xde, 0xad,
  66. 172, 16, 254, 254,
  67. 192, 168, 0, 1,
  68. },
  69. Header: &Header{
  70. Version: Version,
  71. Len: HeaderLen,
  72. TOS: 1,
  73. TotalLen: 0xbeef,
  74. ID: 0xcafe,
  75. Flags: DontFragment,
  76. FragOff: 1500,
  77. TTL: 255,
  78. Protocol: 1,
  79. Checksum: 0xdead,
  80. Src: net.IPv4(172, 16, 254, 254),
  81. Dst: net.IPv4(192, 168, 0, 1),
  82. },
  83. }
  84. func TestMarshalHeader(t *testing.T) {
  85. tt := &headerLittleEndianTest
  86. if socket.NativeEndian != binary.LittleEndian {
  87. t.Skip("no test for non-little endian machine yet")
  88. }
  89. b, err := tt.Header.Marshal()
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. var wh []byte
  94. switch runtime.GOOS {
  95. case "darwin", "dragonfly", "netbsd":
  96. wh = tt.wireHeaderToTradBSDKernel[:]
  97. case "freebsd":
  98. switch {
  99. case freebsdVersion < 1000000:
  100. wh = tt.wireHeaderToTradBSDKernel[:]
  101. case 1000000 <= freebsdVersion && freebsdVersion < 1100000:
  102. wh = tt.wireHeaderToFreeBSD10Kernel[:]
  103. default:
  104. wh = tt.wireHeaderToKernel[:]
  105. }
  106. default:
  107. wh = tt.wireHeaderToKernel[:]
  108. }
  109. if !bytes.Equal(b, wh) {
  110. t.Fatalf("got %#v; want %#v", b, wh)
  111. }
  112. }
  113. func TestParseHeader(t *testing.T) {
  114. tt := &headerLittleEndianTest
  115. if socket.NativeEndian != binary.LittleEndian {
  116. t.Skip("no test for big endian machine yet")
  117. }
  118. var wh []byte
  119. switch runtime.GOOS {
  120. case "darwin", "dragonfly", "netbsd":
  121. wh = tt.wireHeaderFromTradBSDKernel[:]
  122. case "freebsd":
  123. switch {
  124. case freebsdVersion < 1000000:
  125. wh = tt.wireHeaderFromTradBSDKernel[:]
  126. case 1000000 <= freebsdVersion && freebsdVersion < 1100000:
  127. wh = tt.wireHeaderFromFreeBSD10Kernel[:]
  128. default:
  129. wh = tt.wireHeaderFromKernel[:]
  130. }
  131. default:
  132. wh = tt.wireHeaderFromKernel[:]
  133. }
  134. h, err := ParseHeader(wh)
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. if !reflect.DeepEqual(h, tt.Header) {
  139. t.Fatalf("got %#v; want %#v", h, tt.Header)
  140. }
  141. s := h.String()
  142. if strings.Contains(s, ",") {
  143. t.Fatalf("should be space-separated values: %s", s)
  144. }
  145. }