aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/google/gopacket/layers/tcpip_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/google/gopacket/layers/tcpip_test.go')
-rw-r--r--vendor/github.com/google/gopacket/layers/tcpip_test.go185
1 files changed, 185 insertions, 0 deletions
diff --git a/vendor/github.com/google/gopacket/layers/tcpip_test.go b/vendor/github.com/google/gopacket/layers/tcpip_test.go
new file mode 100644
index 0000000..c002e84
--- /dev/null
+++ b/vendor/github.com/google/gopacket/layers/tcpip_test.go
@@ -0,0 +1,185 @@
+// Copyright 2014, Google, Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file in the root of the source
+// tree.
+
+package layers
+
+import (
+ "github.com/google/gopacket"
+ "net"
+ "testing"
+)
+
+const (
+ ipv4UDPChecksum = uint16(0xbc5f) // Wireshark
+ ipv6UDPChecksumWithIPv6DstOpts = uint16(0x4d21) // Wireshark
+ ipv6UDPChecksumJumbogram = uint16(0xcda8)
+)
+
+func createIPv4ChecksumTestLayer() (ip4 *IPv4) {
+ ip4 = &IPv4{}
+ ip4.Version = 4
+ ip4.TTL = 64
+ ip4.SrcIP = net.ParseIP("192.0.2.1")
+ ip4.DstIP = net.ParseIP("198.51.100.1")
+ return
+}
+
+func createIPv6ChecksumTestLayer() (ip6 *IPv6) {
+ ip6 = &IPv6{}
+ ip6.Version = 6
+ ip6.NextHeader = IPProtocolNoNextHeader
+ ip6.HopLimit = 64
+ ip6.SrcIP = net.ParseIP("2001:db8::1")
+ ip6.DstIP = net.ParseIP("2001:db8::2")
+ return
+}
+
+func createIPv6DestinationChecksumTestLayer() (dst *IPv6Destination) {
+ tlv := &IPv6DestinationOption{}
+ tlv.OptionType = 0x01 //PadN
+ tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00}
+ dst = &IPv6Destination{}
+ dst.Options = append(dst.Options, tlv)
+ dst.NextHeader = IPProtocolNoNextHeader
+ return
+}
+
+func createUDPChecksumTestLayer() (udp *UDP) {
+ udp = &UDP{}
+ udp.SrcPort = UDPPort(12345)
+ udp.DstPort = UDPPort(9999)
+ return
+}
+
+func TestIPv4UDPChecksum(t *testing.T) {
+ var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2)
+ var u *UDP
+ var err error
+
+ ip4 := createIPv4ChecksumTestLayer()
+ ip4.Protocol = IPProtocolUDP
+ serialize = append(serialize, ip4)
+
+ udp := createUDPChecksumTestLayer()
+ udp.SetNetworkLayerForChecksum(ip4)
+ serialize = append(serialize, udp)
+
+ buf := gopacket.NewSerializeBuffer()
+ opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
+ err = gopacket.SerializeLayers(buf, opts, serialize...)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ p := gopacket.NewPacket(buf.Bytes(), LinkTypeRaw, gopacket.Default)
+ if p.ErrorLayer() != nil {
+ t.Fatal("Failed to decode packet:", p.ErrorLayer().Error())
+ }
+ checkLayers(p, []gopacket.LayerType{LayerTypeIPv4, LayerTypeUDP}, t)
+
+ if l, ok := p.Layer(LayerTypeUDP).(*UDP); !ok {
+ t.Fatal("No UDP layer type found in packet")
+ } else {
+ u = l
+ }
+ got := u.Checksum
+ want := ipv4UDPChecksum
+ if got != want {
+ t.Errorf("Bad checksum:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
+ }
+}
+
+func TestIPv6UDPChecksumWithIPv6DstOpts(t *testing.T) {
+ var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 3)
+ var u *UDP
+ var err error
+
+ ip6 := createIPv6ChecksumTestLayer()
+ ip6.NextHeader = IPProtocolIPv6Destination
+ serialize = append(serialize, ip6)
+
+ dst := createIPv6DestinationChecksumTestLayer()
+ dst.NextHeader = IPProtocolUDP
+ serialize = append(serialize, dst)
+
+ udp := createUDPChecksumTestLayer()
+ udp.SetNetworkLayerForChecksum(ip6)
+ serialize = append(serialize, udp)
+
+ buf := gopacket.NewSerializeBuffer()
+ opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
+ err = gopacket.SerializeLayers(buf, opts, serialize...)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ p := gopacket.NewPacket(buf.Bytes(), LinkTypeRaw, gopacket.Default)
+ if p.ErrorLayer() != nil {
+ t.Fatal("Failed to decode packet:", p.ErrorLayer().Error())
+ }
+ checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6Destination, LayerTypeUDP}, t)
+
+ if l, ok := p.Layer(LayerTypeUDP).(*UDP); !ok {
+ t.Fatal("No UDP layer type found in packet")
+ } else {
+ u = l
+ }
+ got := u.Checksum
+ want := ipv6UDPChecksumWithIPv6DstOpts
+ if got != want {
+ t.Errorf("Bad checksum:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
+ }
+}
+
+func TestIPv6JumbogramUDPChecksum(t *testing.T) {
+ var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 4)
+ var u *UDP
+ var err error
+
+ ip6 := &IPv6{}
+ ip6.Version = 6
+ ip6.NextHeader = IPProtocolUDP
+ ip6.HopLimit = 64
+ ip6.SrcIP = net.ParseIP("2001:db8::1")
+ ip6.DstIP = net.ParseIP("2001:db8::2")
+ serialize = append(serialize, ip6)
+
+ udp := &UDP{}
+ udp.SrcPort = UDPPort(12345)
+ udp.DstPort = UDPPort(9999)
+ udp.SetNetworkLayerForChecksum(ip6)
+ serialize = append(serialize, udp)
+
+ payload := make([]byte, ipv6MaxPayloadLength+1)
+ for i := range payload {
+ payload[i] = 0xfe
+ }
+ serialize = append(serialize, gopacket.Payload(payload))
+
+ buf := gopacket.NewSerializeBuffer()
+ opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
+ err = gopacket.SerializeLayers(buf, opts, serialize...)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ p := gopacket.NewPacket(buf.Bytes(), LinkTypeRaw, gopacket.Default)
+ if p.ErrorLayer() != nil {
+ t.Fatal("Failed to decode packet:", p.ErrorLayer().Error())
+ }
+ checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop, LayerTypeUDP, gopacket.LayerTypePayload}, t)
+
+ if l, ok := p.Layer(LayerTypeUDP).(*UDP); !ok {
+ t.Fatal("No UDP layer type found in packet")
+ } else {
+ u = l
+ }
+ got := u.Checksum
+ want := ipv6UDPChecksumJumbogram
+ if got != want {
+ t.Errorf("Bad checksum:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
+ }
+}