blob: ac89358cb7ea48552394c35f4f2508e0ad266469 [file] [log] [blame]
Mikio Harad2e5a122012-09-26 21:03:09 +09001// 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
Mikio Hara28a4bd92014-01-29 10:23:52 +09005package ipv4
Mikio Harad2e5a122012-09-26 21:03:09 +09006
7import (
8 "bytes"
Mikio Harad2e5a122012-09-26 21:03:09 +09009 "net"
10 "reflect"
11 "runtime"
Mikio Hara09f95ee2015-10-26 12:18:19 +090012 "strings"
Mikio Harad2e5a122012-09-26 21:03:09 +090013 "testing"
14)
15
16var (
Mikio Hara28a4bd92014-01-29 10:23:52 +090017 wireHeaderFromKernel = [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090018 0x45, 0x01, 0xbe, 0xef,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090019 0xca, 0xfe, 0x45, 0xdc,
Mikio Harad2e5a122012-09-26 21:03:09 +090020 0xff, 0x01, 0xde, 0xad,
21 172, 16, 254, 254,
22 192, 168, 0, 1,
23 }
Mikio Hara28a4bd92014-01-29 10:23:52 +090024 wireHeaderToKernel = [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090025 0x45, 0x01, 0xbe, 0xef,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090026 0xca, 0xfe, 0x45, 0xdc,
Mikio Harad2e5a122012-09-26 21:03:09 +090027 0xff, 0x01, 0xde, 0xad,
28 172, 16, 254, 254,
29 192, 168, 0, 1,
30 }
Mikio Hara28a4bd92014-01-29 10:23:52 +090031 wireHeaderFromTradBSDKernel = [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090032 0x45, 0x01, 0xdb, 0xbe,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090033 0xca, 0xfe, 0xdc, 0x45,
Mikio Harad2e5a122012-09-26 21:03:09 +090034 0xff, 0x01, 0xde, 0xad,
35 172, 16, 254, 254,
36 192, 168, 0, 1,
37 }
Mikio Hara28a4bd92014-01-29 10:23:52 +090038 wireHeaderFromFreeBSD10Kernel = [HeaderLen]byte{
39 0x45, 0x01, 0xef, 0xbe,
40 0xca, 0xfe, 0xdc, 0x45,
41 0xff, 0x01, 0xde, 0xad,
42 172, 16, 254, 254,
43 192, 168, 0, 1,
44 }
45 wireHeaderToTradBSDKernel = [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090046 0x45, 0x01, 0xef, 0xbe,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090047 0xca, 0xfe, 0xdc, 0x45,
Mikio Harad2e5a122012-09-26 21:03:09 +090048 0xff, 0x01, 0xde, 0xad,
49 172, 16, 254, 254,
50 192, 168, 0, 1,
51 }
52 // TODO(mikio): Add platform dependent wire header formats when
53 // we support new platforms.
Mikio Hara6b91bf22013-02-16 13:02:07 +090054
Mikio Hara28a4bd92014-01-29 10:23:52 +090055 testHeader = &Header{
56 Version: Version,
57 Len: HeaderLen,
Mikio Hara6b91bf22013-02-16 13:02:07 +090058 TOS: 1,
59 TotalLen: 0xbeef,
60 ID: 0xcafe,
Mikio Hara28a4bd92014-01-29 10:23:52 +090061 Flags: DontFragment,
Mikio Hara6b91bf22013-02-16 13:02:07 +090062 FragOff: 1500,
63 TTL: 255,
64 Protocol: 1,
65 Checksum: 0xdead,
66 Src: net.IPv4(172, 16, 254, 254),
67 Dst: net.IPv4(192, 168, 0, 1),
68 }
Mikio Harad2e5a122012-09-26 21:03:09 +090069)
70
Mikio Harad2e5a122012-09-26 21:03:09 +090071func TestMarshalHeader(t *testing.T) {
Mikio Hara6b91bf22013-02-16 13:02:07 +090072 b, err := testHeader.Marshal()
Mikio Harad2e5a122012-09-26 21:03:09 +090073 if err != nil {
Mikio Harac25a4f32014-11-16 11:30:27 +090074 t.Fatal(err)
Mikio Harad2e5a122012-09-26 21:03:09 +090075 }
76 var wh []byte
Mikio Harab1ee7b32014-12-24 11:58:46 +090077 switch runtime.GOOS {
78 case "darwin", "dragonfly", "netbsd":
Mikio Harad2e5a122012-09-26 21:03:09 +090079 wh = wireHeaderToTradBSDKernel[:]
Mikio Harab1ee7b32014-12-24 11:58:46 +090080 case "freebsd":
81 if freebsdVersion < 1000000 {
82 wh = wireHeaderToTradBSDKernel[:]
83 } else {
84 wh = wireHeaderFromFreeBSD10Kernel[:]
85 }
86 default:
87 wh = wireHeaderToKernel[:]
Mikio Harad2e5a122012-09-26 21:03:09 +090088 }
89 if !bytes.Equal(b, wh) {
Mikio Harac25a4f32014-11-16 11:30:27 +090090 t.Fatalf("got %#v; want %#v", b, wh)
Mikio Harad2e5a122012-09-26 21:03:09 +090091 }
92}
93
94func TestParseHeader(t *testing.T) {
95 var wh []byte
Mikio Harab1ee7b32014-12-24 11:58:46 +090096 switch runtime.GOOS {
97 case "darwin", "dragonfly", "netbsd":
98 wh = wireHeaderFromTradBSDKernel[:]
99 case "freebsd":
100 if freebsdVersion < 1000000 {
Mikio Hara28a4bd92014-01-29 10:23:52 +0900101 wh = wireHeaderFromTradBSDKernel[:]
Mikio Harab1ee7b32014-12-24 11:58:46 +0900102 } else {
103 wh = wireHeaderFromFreeBSD10Kernel[:]
Mikio Hara28a4bd92014-01-29 10:23:52 +0900104 }
Mikio Harab1ee7b32014-12-24 11:58:46 +0900105 default:
106 wh = wireHeaderFromKernel[:]
Mikio Harad2e5a122012-09-26 21:03:09 +0900107 }
Mikio Hara28a4bd92014-01-29 10:23:52 +0900108 h, err := ParseHeader(wh)
Mikio Harad2e5a122012-09-26 21:03:09 +0900109 if err != nil {
Mikio Harac25a4f32014-11-16 11:30:27 +0900110 t.Fatal(err)
Mikio Harad2e5a122012-09-26 21:03:09 +0900111 }
Mikio Hara6b91bf22013-02-16 13:02:07 +0900112 if !reflect.DeepEqual(h, testHeader) {
Mikio Harac25a4f32014-11-16 11:30:27 +0900113 t.Fatalf("got %#v; want %#v", h, testHeader)
Mikio Harad2e5a122012-09-26 21:03:09 +0900114 }
Mikio Hara09f95ee2015-10-26 12:18:19 +0900115 s := h.String()
116 if strings.Contains(s, ",") {
117 t.Fatalf("should be space-separated values: %s", s)
118 }
Mikio Harad2e5a122012-09-26 21:03:09 +0900119}