Dmitri Shuralyov | 5d99779 | 2016-11-07 15:05:57 -0800 | [diff] [blame] | 1 | // Copyright 2012 The Go Authors. All rights reserved. |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 5 | package ipv4 |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 6 | |
| 7 | import ( |
| 8 | "bytes" |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 9 | "encoding/binary" |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 10 | "net" |
| 11 | "reflect" |
| 12 | "runtime" |
Mikio Hara | 09f95ee | 2015-10-26 12:18:19 +0900 | [diff] [blame] | 13 | "strings" |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 14 | "testing" |
| 15 | ) |
| 16 | |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 17 | type headerTest struct { |
| 18 | wireHeaderFromKernel [HeaderLen]byte |
| 19 | wireHeaderToKernel [HeaderLen]byte |
| 20 | wireHeaderFromTradBSDKernel [HeaderLen]byte |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 21 | wireHeaderToTradBSDKernel [HeaderLen]byte |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 22 | wireHeaderFromFreeBSD10Kernel [HeaderLen]byte |
| 23 | wireHeaderToFreeBSD10Kernel [HeaderLen]byte |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 24 | *Header |
| 25 | } |
| 26 | |
| 27 | var headerLittleEndianTest = headerTest{ |
| 28 | // TODO(mikio): Add platform dependent wire header formats when |
| 29 | // we support new platforms. |
| 30 | wireHeaderFromKernel: [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 31 | 0x45, 0x01, 0xbe, 0xef, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 32 | 0xca, 0xfe, 0x45, 0xdc, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 33 | 0xff, 0x01, 0xde, 0xad, |
| 34 | 172, 16, 254, 254, |
| 35 | 192, 168, 0, 1, |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 36 | }, |
| 37 | wireHeaderToKernel: [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 38 | 0x45, 0x01, 0xbe, 0xef, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 39 | 0xca, 0xfe, 0x45, 0xdc, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 40 | 0xff, 0x01, 0xde, 0xad, |
| 41 | 172, 16, 254, 254, |
| 42 | 192, 168, 0, 1, |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 43 | }, |
| 44 | wireHeaderFromTradBSDKernel: [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 45 | 0x45, 0x01, 0xdb, 0xbe, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 46 | 0xca, 0xfe, 0xdc, 0x45, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 47 | 0xff, 0x01, 0xde, 0xad, |
| 48 | 172, 16, 254, 254, |
| 49 | 192, 168, 0, 1, |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 50 | }, |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 51 | 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 Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 58 | wireHeaderFromFreeBSD10Kernel: [HeaderLen]byte{ |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 59 | 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 Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 64 | }, |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 65 | wireHeaderToFreeBSD10Kernel: [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 66 | 0x45, 0x01, 0xef, 0xbe, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 67 | 0xca, 0xfe, 0xdc, 0x45, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 68 | 0xff, 0x01, 0xde, 0xad, |
| 69 | 172, 16, 254, 254, |
| 70 | 192, 168, 0, 1, |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 71 | }, |
| 72 | Header: &Header{ |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 73 | Version: Version, |
| 74 | Len: HeaderLen, |
Mikio Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 75 | TOS: 1, |
| 76 | TotalLen: 0xbeef, |
| 77 | ID: 0xcafe, |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 78 | Flags: DontFragment, |
Mikio Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 79 | 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 Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 85 | }, |
| 86 | } |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 87 | |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 88 | func TestMarshalHeader(t *testing.T) { |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 89 | 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 Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 95 | if err != nil { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 96 | t.Fatal(err) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 97 | } |
| 98 | var wh []byte |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 99 | switch runtime.GOOS { |
| 100 | case "darwin", "dragonfly", "netbsd": |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 101 | wh = tt.wireHeaderToTradBSDKernel[:] |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 102 | case "freebsd": |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 103 | switch { |
| 104 | case freebsdVersion < 1000000: |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 105 | wh = tt.wireHeaderToTradBSDKernel[:] |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 106 | case 1000000 <= freebsdVersion && freebsdVersion < 1100000: |
| 107 | wh = tt.wireHeaderToFreeBSD10Kernel[:] |
| 108 | default: |
| 109 | wh = tt.wireHeaderToKernel[:] |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 110 | } |
| 111 | default: |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 112 | wh = tt.wireHeaderToKernel[:] |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 113 | } |
| 114 | if !bytes.Equal(b, wh) { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 115 | t.Fatalf("got %#v; want %#v", b, wh) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 116 | } |
| 117 | } |
| 118 | |
| 119 | func TestParseHeader(t *testing.T) { |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 120 | tt := &headerLittleEndianTest |
| 121 | if nativeEndian != binary.LittleEndian { |
| 122 | t.Skip("no test for big endian machine yet") |
| 123 | } |
| 124 | |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 125 | var wh []byte |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 126 | switch runtime.GOOS { |
| 127 | case "darwin", "dragonfly", "netbsd": |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 128 | wh = tt.wireHeaderFromTradBSDKernel[:] |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 129 | case "freebsd": |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 130 | switch { |
| 131 | case freebsdVersion < 1000000: |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 132 | wh = tt.wireHeaderFromTradBSDKernel[:] |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 133 | case 1000000 <= freebsdVersion && freebsdVersion < 1100000: |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 134 | wh = tt.wireHeaderFromFreeBSD10Kernel[:] |
Mikio Hara | cf4effb | 2016-10-11 12:19:24 +0900 | [diff] [blame] | 135 | default: |
| 136 | wh = tt.wireHeaderFromKernel[:] |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 137 | } |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 138 | default: |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 139 | wh = tt.wireHeaderFromKernel[:] |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 140 | } |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 141 | h, err := ParseHeader(wh) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 142 | if err != nil { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 143 | t.Fatal(err) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 144 | } |
Mikio Hara | 7e42c0e | 2016-04-30 16:13:37 +0900 | [diff] [blame] | 145 | if !reflect.DeepEqual(h, tt.Header) { |
| 146 | t.Fatalf("got %#v; want %#v", h, tt.Header) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 147 | } |
Mikio Hara | 09f95ee | 2015-10-26 12:18:19 +0900 | [diff] [blame] | 148 | s := h.String() |
| 149 | if strings.Contains(s, ",") { |
| 150 | t.Fatalf("should be space-separated values: %s", s) |
| 151 | } |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 152 | } |