Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 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 | |
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 | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 9 | "net" |
| 10 | "reflect" |
| 11 | "runtime" |
Mikio Hara | 09f95ee | 2015-10-26 12:18:19 +0900 | [diff] [blame^] | 12 | "strings" |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 13 | "testing" |
| 14 | ) |
| 15 | |
| 16 | var ( |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 17 | wireHeaderFromKernel = [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 18 | 0x45, 0x01, 0xbe, 0xef, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 19 | 0xca, 0xfe, 0x45, 0xdc, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 20 | 0xff, 0x01, 0xde, 0xad, |
| 21 | 172, 16, 254, 254, |
| 22 | 192, 168, 0, 1, |
| 23 | } |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 24 | wireHeaderToKernel = [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 25 | 0x45, 0x01, 0xbe, 0xef, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 26 | 0xca, 0xfe, 0x45, 0xdc, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 27 | 0xff, 0x01, 0xde, 0xad, |
| 28 | 172, 16, 254, 254, |
| 29 | 192, 168, 0, 1, |
| 30 | } |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 31 | wireHeaderFromTradBSDKernel = [HeaderLen]byte{ |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 32 | 0x45, 0x01, 0xdb, 0xbe, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 33 | 0xca, 0xfe, 0xdc, 0x45, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 34 | 0xff, 0x01, 0xde, 0xad, |
| 35 | 172, 16, 254, 254, |
| 36 | 192, 168, 0, 1, |
| 37 | } |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 38 | 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 Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 46 | 0x45, 0x01, 0xef, 0xbe, |
Marko Juhani Silokunnas | c2e426e | 2013-10-08 06:52:49 +0900 | [diff] [blame] | 47 | 0xca, 0xfe, 0xdc, 0x45, |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 48 | 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 Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 54 | |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 55 | testHeader = &Header{ |
| 56 | Version: Version, |
| 57 | Len: HeaderLen, |
Mikio Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 58 | TOS: 1, |
| 59 | TotalLen: 0xbeef, |
| 60 | ID: 0xcafe, |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 61 | Flags: DontFragment, |
Mikio Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 62 | 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 Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 69 | ) |
| 70 | |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 71 | func TestMarshalHeader(t *testing.T) { |
Mikio Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 72 | b, err := testHeader.Marshal() |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 73 | if err != nil { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 74 | t.Fatal(err) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 75 | } |
| 76 | var wh []byte |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 77 | switch runtime.GOOS { |
| 78 | case "darwin", "dragonfly", "netbsd": |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 79 | wh = wireHeaderToTradBSDKernel[:] |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 80 | case "freebsd": |
| 81 | if freebsdVersion < 1000000 { |
| 82 | wh = wireHeaderToTradBSDKernel[:] |
| 83 | } else { |
| 84 | wh = wireHeaderFromFreeBSD10Kernel[:] |
| 85 | } |
| 86 | default: |
| 87 | wh = wireHeaderToKernel[:] |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 88 | } |
| 89 | if !bytes.Equal(b, wh) { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 90 | t.Fatalf("got %#v; want %#v", b, wh) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 91 | } |
| 92 | } |
| 93 | |
| 94 | func TestParseHeader(t *testing.T) { |
| 95 | var wh []byte |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 96 | switch runtime.GOOS { |
| 97 | case "darwin", "dragonfly", "netbsd": |
| 98 | wh = wireHeaderFromTradBSDKernel[:] |
| 99 | case "freebsd": |
| 100 | if freebsdVersion < 1000000 { |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 101 | wh = wireHeaderFromTradBSDKernel[:] |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 102 | } else { |
| 103 | wh = wireHeaderFromFreeBSD10Kernel[:] |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 104 | } |
Mikio Hara | b1ee7b3 | 2014-12-24 11:58:46 +0900 | [diff] [blame] | 105 | default: |
| 106 | wh = wireHeaderFromKernel[:] |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 107 | } |
Mikio Hara | 28a4bd9 | 2014-01-29 10:23:52 +0900 | [diff] [blame] | 108 | h, err := ParseHeader(wh) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 109 | if err != nil { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 110 | t.Fatal(err) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 111 | } |
Mikio Hara | 6b91bf2 | 2013-02-16 13:02:07 +0900 | [diff] [blame] | 112 | if !reflect.DeepEqual(h, testHeader) { |
Mikio Hara | c25a4f3 | 2014-11-16 11:30:27 +0900 | [diff] [blame] | 113 | t.Fatalf("got %#v; want %#v", h, testHeader) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 114 | } |
Mikio Hara | 09f95ee | 2015-10-26 12:18:19 +0900 | [diff] [blame^] | 115 | s := h.String() |
| 116 | if strings.Contains(s, ",") { |
| 117 | t.Fatalf("should be space-separated values: %s", s) |
| 118 | } |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 119 | } |