From 3f1edad4e6ba0a7876750aea55507fae14d8badf Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Wed, 11 Oct 2017 16:40:58 +0200 Subject: ODPM 266: Go-libmemif + 2 examples. Change-Id: Icdb9b9eb2314eff6c96afe7996fcf2728291de4a Signed-off-by: Milan Lenco --- .../github.com/google/gopacket/layers/ip6_test.go | 430 +++++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 vendor/github.com/google/gopacket/layers/ip6_test.go (limited to 'vendor/github.com/google/gopacket/layers/ip6_test.go') diff --git a/vendor/github.com/google/gopacket/layers/ip6_test.go b/vendor/github.com/google/gopacket/layers/ip6_test.go new file mode 100644 index 0000000..ab22f17 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ip6_test.go @@ -0,0 +1,430 @@ +// 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 ( + "bytes" + "github.com/google/gopacket" + "net" + "reflect" + "testing" +) + +func TestSerializeIPv6HeaderTLVOptions(t *testing.T) { + //RFC 2460 Appendix B + /* + Example 3 + + A Hop-by-Hop or Destination Options header containing both options X + and Y from Examples 1 and 2 would have one of the two following + formats, depending on which option appeared first: + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header | Hdr Ext Len=3 | Option Type=X |Opt Data Len=12| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + 8-octet field + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PadN Option=1 |Opt Data Len=1 | 0 | Option Type=Y | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |Opt Data Len=7 | 1-octet field | 2-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PadN Option=1 |Opt Data Len=2 | 0 | 0 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + opt1 := &ipv6HeaderTLVOption{} + opt1.OptionType = 0x1e + opt1.OptionData = []byte{0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb} + opt1.OptionAlignment = [2]uint8{8, 2} + + opt2 := &ipv6HeaderTLVOption{} + opt2.OptionType = 0x3e + opt2.OptionData = []byte{0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44} + opt2.OptionAlignment = [2]uint8{4, 3} + + l := serializeIPv6HeaderTLVOptions(nil, []*ipv6HeaderTLVOption{opt1, opt2}, true) + b := make([]byte, l) + serializeIPv6HeaderTLVOptions(b, []*ipv6HeaderTLVOption{opt1, opt2}, true) + got := b + want := []byte{0x1e, 0x0c, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x01, 0x01, 0x00, 0x3e, 0x07, 0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44, 0x01, 0x02, 0x00, 0x00} + + if !bytes.Equal(got, want) { + t.Errorf("IPv6HeaderTLVOption serialize (X,Y) failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + + /* + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header | Hdr Ext Len=3 | Pad1 Option=0 | Option Type=Y | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |Opt Data Len=7 | 1-octet field | 2-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PadN Option=1 |Opt Data Len=4 | 0 | 0 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 0 | 0 | Option Type=X |Opt Data Len=12| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + 8-octet field + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + + l = serializeIPv6HeaderTLVOptions(nil, []*ipv6HeaderTLVOption{opt2, opt1}, true) + b = make([]byte, l) + serializeIPv6HeaderTLVOptions(b, []*ipv6HeaderTLVOption{opt2, opt1}, true) + got = b + want = []byte{0x00, 0x3e, 0x07, 0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb} + + if !bytes.Equal(got, want) { + t.Errorf("IPv6HeaderTLVOption serialize (Y,X) failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +var testPacketIPv6HopByHop0 = []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketIPv6HopByHop0Serialize(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var err error + + ip6 := &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolIPv6HopByHop + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + serialize = append(serialize, ip6) + + tlv := &IPv6HopByHopOption{} + tlv.OptionType = 0x01 //PadN + tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00} + hop := &IPv6HopByHop{} + hop.Options = append(hop.Options, tlv) + hop.NextHeader = IPProtocolNoNextHeader + ip6.HopByHop = hop + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + got := buf.Bytes() + want := testPacketIPv6HopByHop0 + if !bytes.Equal(got, want) { + t.Errorf("IPv6HopByHop serialize failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +func TestPacketIPv6HopByHop0Decode(t *testing.T) { + ip6 := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + Payload: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 8, + NextHeader: IPProtocolIPv6HopByHop, + HopLimit: 64, + SrcIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, + } + + hop := &ip6.hbh + hop.ipv6ExtensionBase = ipv6ExtensionBase{ + BaseLayer: BaseLayer{ + Contents: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + Payload: []byte{}, + }, + NextHeader: IPProtocolNoNextHeader, + HeaderLength: uint8(0), + ActualLength: 8, + } + opt := &IPv6HopByHopOption{ + OptionType: uint8(0x01), + OptionLength: uint8(0x04), + ActualLength: 6, + OptionData: []byte{0x00, 0x00, 0x00, 0x00}, + } + hop.Options = append(hop.Options, opt) + ip6.HopByHop = hop + + p := gopacket.NewPacket(testPacketIPv6HopByHop0, LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop}, t) + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := ip6 + want.HopByHop = got.HopByHop // avoid comparing pointers + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + if got, ok := p.Layer(LayerTypeIPv6HopByHop).(*IPv6HopByHop); ok { + want := hop + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6HopByHop packet processing failed:\ngot\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6HopByHop layer type found in packet") + } +} + +// testPacketIPv6Destination0 is the packet: +// 12:40:14.429409595 IP6 2001:db8::1 > 2001:db8::2: DSTOPT no next header +// 0x0000: 6000 0000 0008 3c40 2001 0db8 0000 0000 `.....<@........ +// 0x0010: 0000 0000 0000 0001 2001 0db8 0000 0000 ................ +// 0x0020: 0000 0000 0000 0002 3b00 0104 0000 0000 ........;....... +var testPacketIPv6Destination0 = []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3c, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketIPv6Destination0Serialize(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var err error + + ip6 := &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolIPv6Destination + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + serialize = append(serialize, ip6) + + tlv := &IPv6DestinationOption{} + tlv.OptionType = 0x01 //PadN + tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00} + dst := &IPv6Destination{} + dst.Options = append(dst.Options, tlv) + dst.NextHeader = IPProtocolNoNextHeader + serialize = append(serialize, dst) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + got := buf.Bytes() + want := testPacketIPv6Destination0 + if !bytes.Equal(got, want) { + t.Errorf("IPv6Destination serialize failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +func TestPacketIPv6Destination0Decode(t *testing.T) { + ip6 := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3c, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + Payload: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 8, + NextHeader: IPProtocolIPv6Destination, + HopLimit: 64, + SrcIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, + } + + dst := &IPv6Destination{} + dst.BaseLayer = BaseLayer{ + Contents: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + Payload: []byte{}, + } + dst.NextHeader = IPProtocolNoNextHeader + dst.HeaderLength = uint8(0) + dst.ActualLength = 8 + opt := &IPv6DestinationOption{ + OptionType: uint8(0x01), + OptionLength: uint8(0x04), + ActualLength: 6, + OptionData: []byte{0x00, 0x00, 0x00, 0x00}, + } + dst.Options = append(dst.Options, opt) + + p := gopacket.NewPacket(testPacketIPv6Destination0, LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6Destination}, t) + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := ip6 + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + if got, ok := p.Layer(LayerTypeIPv6Destination).(*IPv6Destination); ok { + want := dst + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6Destination packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6Destination layer type found in packet") + } +} + +var testPacketIPv6JumbogramHeader = []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08, +} + +func TestIPv6JumbogramSerialize(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var err error + + 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") + serialize = append(serialize, ip6) + + 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} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + got := buf.Bytes() + w := new(bytes.Buffer) + w.Write(testPacketIPv6JumbogramHeader) + w.Write(payload) + want := w.Bytes() + + if !bytes.Equal(got, want) { + t.Errorf("IPv6 Jumbogram serialize failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LongBytesGoString(got), gopacket.LongBytesGoString(want)) + } +} + +func TestIPv6JumbogramDecode(t *testing.T) { + payload := make([]byte, ipv6MaxPayloadLength+1) + for i := range payload { + payload[i] = 0xfe + } + + ip6 := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 0, + NextHeader: IPProtocolIPv6HopByHop, + HopLimit: 64, + SrcIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, + } + buf := new(bytes.Buffer) + buf.Write([]byte{0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08}) + buf.Write(payload) + ip6.Payload = buf.Bytes() + + hop := &ip6.hbh + hop.Contents = []byte{0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08} + hop.Payload = payload + hop.NextHeader = IPProtocolNoNextHeader + hop.HeaderLength = uint8(0) + hop.ActualLength = 8 + opt := &IPv6HopByHopOption{} + opt.OptionType = uint8(0xc2) + opt.OptionLength = uint8(0x04) + opt.ActualLength = 6 + opt.OptionData = []byte{0x00, 0x01, 0x00, 0x08} + hop.Options = append(hop.Options, opt) + ip6.HopByHop = hop + + pkt := new(bytes.Buffer) + pkt.Write(testPacketIPv6JumbogramHeader) + pkt.Write(payload) + + p := gopacket.NewPacket(pkt.Bytes(), LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop, gopacket.LayerTypePayload}, t) + + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := ip6 + want.HopByHop = got.HopByHop // Hack, avoid comparing pointers + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LayerGoString(got), gopacket.LayerGoString(want)) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + + if got, ok := p.Layer(LayerTypeIPv6HopByHop).(*IPv6HopByHop); ok { + want := hop + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6HopByHop packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LayerGoString(got), gopacket.LayerGoString(want)) + } + } else { + t.Error("No IPv6HopByHop layer type found in packet") + } + + if got, ok := p.Layer(gopacket.LayerTypePayload).(*gopacket.Payload); ok { + want := (*gopacket.Payload)(&payload) + if !reflect.DeepEqual(got, want) { + t.Errorf("Payload packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LayerGoString(got), gopacket.LayerGoString(want)) + } + } else { + t.Error("No Payload layer type found in packet") + } +} -- cgit 1.2.3-korg