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.
16 "golang.org/x/net/internal/socket"
19 type headerTest struct {
20 wireHeaderFromKernel []byte
21 wireHeaderToKernel []byte
22 wireHeaderFromTradBSDKernel []byte
23 wireHeaderToTradBSDKernel []byte
24 wireHeaderFromFreeBSD10Kernel []byte
25 wireHeaderToFreeBSD10Kernel []byte
29 var headerLittleEndianTests = []headerTest{
30 // TODO(mikio): Add platform dependent wire header formats when
31 // we support new platforms.
33 wireHeaderFromKernel: []byte{
34 0x45, 0x01, 0xbe, 0xef,
35 0xca, 0xfe, 0x45, 0xdc,
36 0xff, 0x01, 0xde, 0xad,
40 wireHeaderToKernel: []byte{
41 0x45, 0x01, 0xbe, 0xef,
42 0xca, 0xfe, 0x45, 0xdc,
43 0xff, 0x01, 0xde, 0xad,
47 wireHeaderFromTradBSDKernel: []byte{
48 0x45, 0x01, 0xdb, 0xbe,
49 0xca, 0xfe, 0xdc, 0x45,
50 0xff, 0x01, 0xde, 0xad,
54 wireHeaderToTradBSDKernel: []byte{
55 0x45, 0x01, 0xef, 0xbe,
56 0xca, 0xfe, 0xdc, 0x45,
57 0xff, 0x01, 0xde, 0xad,
61 wireHeaderFromFreeBSD10Kernel: []byte{
62 0x45, 0x01, 0xef, 0xbe,
63 0xca, 0xfe, 0xdc, 0x45,
64 0xff, 0x01, 0xde, 0xad,
68 wireHeaderToFreeBSD10Kernel: []byte{
69 0x45, 0x01, 0xef, 0xbe,
70 0xca, 0xfe, 0xdc, 0x45,
71 0xff, 0x01, 0xde, 0xad,
86 Src: net.IPv4(172, 16, 254, 254),
87 Dst: net.IPv4(192, 168, 0, 1),
91 // with option headers
93 wireHeaderFromKernel: []byte{
94 0x46, 0x01, 0xbe, 0xf3,
95 0xca, 0xfe, 0x45, 0xdc,
96 0xff, 0x01, 0xde, 0xad,
99 0xff, 0xfe, 0xfe, 0xff,
101 wireHeaderToKernel: []byte{
102 0x46, 0x01, 0xbe, 0xf3,
103 0xca, 0xfe, 0x45, 0xdc,
104 0xff, 0x01, 0xde, 0xad,
107 0xff, 0xfe, 0xfe, 0xff,
109 wireHeaderFromTradBSDKernel: []byte{
110 0x46, 0x01, 0xdb, 0xbe,
111 0xca, 0xfe, 0xdc, 0x45,
112 0xff, 0x01, 0xde, 0xad,
115 0xff, 0xfe, 0xfe, 0xff,
117 wireHeaderToTradBSDKernel: []byte{
118 0x46, 0x01, 0xf3, 0xbe,
119 0xca, 0xfe, 0xdc, 0x45,
120 0xff, 0x01, 0xde, 0xad,
123 0xff, 0xfe, 0xfe, 0xff,
125 wireHeaderFromFreeBSD10Kernel: []byte{
126 0x46, 0x01, 0xf3, 0xbe,
127 0xca, 0xfe, 0xdc, 0x45,
128 0xff, 0x01, 0xde, 0xad,
131 0xff, 0xfe, 0xfe, 0xff,
133 wireHeaderToFreeBSD10Kernel: []byte{
134 0x46, 0x01, 0xf3, 0xbe,
135 0xca, 0xfe, 0xdc, 0x45,
136 0xff, 0x01, 0xde, 0xad,
139 0xff, 0xfe, 0xfe, 0xff,
152 Src: net.IPv4(172, 16, 254, 254),
153 Dst: net.IPv4(192, 168, 0, 1),
154 Options: []byte{0xff, 0xfe, 0xfe, 0xff},
159 func TestMarshalHeader(t *testing.T) {
160 if socket.NativeEndian != binary.LittleEndian {
161 t.Skip("no test for non-little endian machine yet")
164 for _, tt := range headerLittleEndianTests {
165 b, err := tt.Header.Marshal()
170 switch runtime.GOOS {
171 case "darwin", "dragonfly", "netbsd":
172 wh = tt.wireHeaderToTradBSDKernel
175 case freebsdVersion < 1000000:
176 wh = tt.wireHeaderToTradBSDKernel
177 case 1000000 <= freebsdVersion && freebsdVersion < 1100000:
178 wh = tt.wireHeaderToFreeBSD10Kernel
180 wh = tt.wireHeaderToKernel
183 wh = tt.wireHeaderToKernel
185 if !bytes.Equal(b, wh) {
186 t.Fatalf("got %#v; want %#v", b, wh)
191 func TestParseHeader(t *testing.T) {
192 if socket.NativeEndian != binary.LittleEndian {
193 t.Skip("no test for big endian machine yet")
196 for _, tt := range headerLittleEndianTests {
198 switch runtime.GOOS {
199 case "darwin", "dragonfly", "netbsd":
200 wh = tt.wireHeaderFromTradBSDKernel
203 case freebsdVersion < 1000000:
204 wh = tt.wireHeaderFromTradBSDKernel
205 case 1000000 <= freebsdVersion && freebsdVersion < 1100000:
206 wh = tt.wireHeaderFromFreeBSD10Kernel
208 wh = tt.wireHeaderFromKernel
211 wh = tt.wireHeaderFromKernel
213 h, err := ParseHeader(wh)
217 if err := h.Parse(wh); err != nil {
220 if !reflect.DeepEqual(h, tt.Header) {
221 t.Fatalf("got %#v; want %#v", h, tt.Header)
224 if strings.Contains(s, ",") {
225 t.Fatalf("should be space-separated values: %s", s)