blob: cdf27fd03fc5a6d8294ed12b3d6a043d91e450fd [file] [log] [blame]
Dmitri Shuralyov5d997792016-11-07 15:05:57 -08001// Copyright 2012 The Go Authors. All rights reserved.
Mikio Harad2e5a122012-09-26 21:03:09 +09002// 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 Hara7e42c0e2016-04-30 16:13:37 +09009 "encoding/binary"
Mikio Harad2e5a122012-09-26 21:03:09 +090010 "net"
11 "reflect"
12 "runtime"
Mikio Hara09f95ee2015-10-26 12:18:19 +090013 "strings"
Mikio Harad2e5a122012-09-26 21:03:09 +090014 "testing"
15)
16
Mikio Hara7e42c0e2016-04-30 16:13:37 +090017type headerTest struct {
18 wireHeaderFromKernel [HeaderLen]byte
19 wireHeaderToKernel [HeaderLen]byte
20 wireHeaderFromTradBSDKernel [HeaderLen]byte
Mikio Hara7e42c0e2016-04-30 16:13:37 +090021 wireHeaderToTradBSDKernel [HeaderLen]byte
Mikio Haracf4effb2016-10-11 12:19:24 +090022 wireHeaderFromFreeBSD10Kernel [HeaderLen]byte
23 wireHeaderToFreeBSD10Kernel [HeaderLen]byte
Mikio Hara7e42c0e2016-04-30 16:13:37 +090024 *Header
25}
26
27var headerLittleEndianTest = headerTest{
28 // TODO(mikio): Add platform dependent wire header formats when
29 // we support new platforms.
30 wireHeaderFromKernel: [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090031 0x45, 0x01, 0xbe, 0xef,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090032 0xca, 0xfe, 0x45, 0xdc,
Mikio Harad2e5a122012-09-26 21:03:09 +090033 0xff, 0x01, 0xde, 0xad,
34 172, 16, 254, 254,
35 192, 168, 0, 1,
Mikio Hara7e42c0e2016-04-30 16:13:37 +090036 },
37 wireHeaderToKernel: [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090038 0x45, 0x01, 0xbe, 0xef,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090039 0xca, 0xfe, 0x45, 0xdc,
Mikio Harad2e5a122012-09-26 21:03:09 +090040 0xff, 0x01, 0xde, 0xad,
41 172, 16, 254, 254,
42 192, 168, 0, 1,
Mikio Hara7e42c0e2016-04-30 16:13:37 +090043 },
44 wireHeaderFromTradBSDKernel: [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090045 0x45, 0x01, 0xdb, 0xbe,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090046 0xca, 0xfe, 0xdc, 0x45,
Mikio Harad2e5a122012-09-26 21:03:09 +090047 0xff, 0x01, 0xde, 0xad,
48 172, 16, 254, 254,
49 192, 168, 0, 1,
Mikio Hara7e42c0e2016-04-30 16:13:37 +090050 },
Mikio Haracf4effb2016-10-11 12:19:24 +090051 wireHeaderToTradBSDKernel: [HeaderLen]byte{
52 0x45, 0x01, 0xef, 0xbe,
53 0xca, 0xfe, 0xdc, 0x45,
54 0xff, 0x01, 0xde, 0xad,
55 172, 16, 254, 254,
56 192, 168, 0, 1,
57 },
Mikio Hara7e42c0e2016-04-30 16:13:37 +090058 wireHeaderFromFreeBSD10Kernel: [HeaderLen]byte{
Mikio Hara28a4bd92014-01-29 10:23:52 +090059 0x45, 0x01, 0xef, 0xbe,
60 0xca, 0xfe, 0xdc, 0x45,
61 0xff, 0x01, 0xde, 0xad,
62 172, 16, 254, 254,
63 192, 168, 0, 1,
Mikio Hara7e42c0e2016-04-30 16:13:37 +090064 },
Mikio Haracf4effb2016-10-11 12:19:24 +090065 wireHeaderToFreeBSD10Kernel: [HeaderLen]byte{
Mikio Harad2e5a122012-09-26 21:03:09 +090066 0x45, 0x01, 0xef, 0xbe,
Marko Juhani Silokunnasc2e426e2013-10-08 06:52:49 +090067 0xca, 0xfe, 0xdc, 0x45,
Mikio Harad2e5a122012-09-26 21:03:09 +090068 0xff, 0x01, 0xde, 0xad,
69 172, 16, 254, 254,
70 192, 168, 0, 1,
Mikio Hara7e42c0e2016-04-30 16:13:37 +090071 },
72 Header: &Header{
Mikio Hara28a4bd92014-01-29 10:23:52 +090073 Version: Version,
74 Len: HeaderLen,
Mikio Hara6b91bf22013-02-16 13:02:07 +090075 TOS: 1,
76 TotalLen: 0xbeef,
77 ID: 0xcafe,
Mikio Hara28a4bd92014-01-29 10:23:52 +090078 Flags: DontFragment,
Mikio Hara6b91bf22013-02-16 13:02:07 +090079 FragOff: 1500,
80 TTL: 255,
81 Protocol: 1,
82 Checksum: 0xdead,
83 Src: net.IPv4(172, 16, 254, 254),
84 Dst: net.IPv4(192, 168, 0, 1),
Mikio Hara7e42c0e2016-04-30 16:13:37 +090085 },
86}
Mikio Harad2e5a122012-09-26 21:03:09 +090087
Mikio Harad2e5a122012-09-26 21:03:09 +090088func TestMarshalHeader(t *testing.T) {
Mikio Hara7e42c0e2016-04-30 16:13:37 +090089 tt := &headerLittleEndianTest
90 if nativeEndian != binary.LittleEndian {
91 t.Skip("no test for non-little endian machine yet")
92 }
93
94 b, err := tt.Header.Marshal()
Mikio Harad2e5a122012-09-26 21:03:09 +090095 if err != nil {
Mikio Harac25a4f32014-11-16 11:30:27 +090096 t.Fatal(err)
Mikio Harad2e5a122012-09-26 21:03:09 +090097 }
98 var wh []byte
Mikio Harab1ee7b32014-12-24 11:58:46 +090099 switch runtime.GOOS {
100 case "darwin", "dragonfly", "netbsd":
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900101 wh = tt.wireHeaderToTradBSDKernel[:]
Mikio Harab1ee7b32014-12-24 11:58:46 +0900102 case "freebsd":
Mikio Haracf4effb2016-10-11 12:19:24 +0900103 switch {
104 case freebsdVersion < 1000000:
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900105 wh = tt.wireHeaderToTradBSDKernel[:]
Mikio Haracf4effb2016-10-11 12:19:24 +0900106 case 1000000 <= freebsdVersion && freebsdVersion < 1100000:
107 wh = tt.wireHeaderToFreeBSD10Kernel[:]
108 default:
109 wh = tt.wireHeaderToKernel[:]
Mikio Harab1ee7b32014-12-24 11:58:46 +0900110 }
111 default:
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900112 wh = tt.wireHeaderToKernel[:]
Mikio Harad2e5a122012-09-26 21:03:09 +0900113 }
114 if !bytes.Equal(b, wh) {
Mikio Harac25a4f32014-11-16 11:30:27 +0900115 t.Fatalf("got %#v; want %#v", b, wh)
Mikio Harad2e5a122012-09-26 21:03:09 +0900116 }
117}
118
119func TestParseHeader(t *testing.T) {
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900120 tt := &headerLittleEndianTest
121 if nativeEndian != binary.LittleEndian {
122 t.Skip("no test for big endian machine yet")
123 }
124
Mikio Harad2e5a122012-09-26 21:03:09 +0900125 var wh []byte
Mikio Harab1ee7b32014-12-24 11:58:46 +0900126 switch runtime.GOOS {
127 case "darwin", "dragonfly", "netbsd":
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900128 wh = tt.wireHeaderFromTradBSDKernel[:]
Mikio Harab1ee7b32014-12-24 11:58:46 +0900129 case "freebsd":
Mikio Haracf4effb2016-10-11 12:19:24 +0900130 switch {
131 case freebsdVersion < 1000000:
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900132 wh = tt.wireHeaderFromTradBSDKernel[:]
Mikio Haracf4effb2016-10-11 12:19:24 +0900133 case 1000000 <= freebsdVersion && freebsdVersion < 1100000:
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900134 wh = tt.wireHeaderFromFreeBSD10Kernel[:]
Mikio Haracf4effb2016-10-11 12:19:24 +0900135 default:
136 wh = tt.wireHeaderFromKernel[:]
Mikio Hara28a4bd92014-01-29 10:23:52 +0900137 }
Mikio Harab1ee7b32014-12-24 11:58:46 +0900138 default:
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900139 wh = tt.wireHeaderFromKernel[:]
Mikio Harad2e5a122012-09-26 21:03:09 +0900140 }
Mikio Hara28a4bd92014-01-29 10:23:52 +0900141 h, err := ParseHeader(wh)
Mikio Harad2e5a122012-09-26 21:03:09 +0900142 if err != nil {
Mikio Harac25a4f32014-11-16 11:30:27 +0900143 t.Fatal(err)
Mikio Harad2e5a122012-09-26 21:03:09 +0900144 }
Mikio Hara7e42c0e2016-04-30 16:13:37 +0900145 if !reflect.DeepEqual(h, tt.Header) {
146 t.Fatalf("got %#v; want %#v", h, tt.Header)
Mikio Harad2e5a122012-09-26 21:03:09 +0900147 }
Mikio Hara09f95ee2015-10-26 12:18:19 +0900148 s := h.String()
149 if strings.Contains(s, ",") {
150 t.Fatalf("should be space-separated values: %s", s)
151 }
Mikio Harad2e5a122012-09-26 21:03:09 +0900152}