github.com/gopacket/gopacket@v1.1.0/layers/ip6_test.go (about)

     1  // Copyright 2014, Google, Inc. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style license
     4  // that can be found in the LICENSE file in the root of the source
     5  // tree.
     6  
     7  package layers
     8  
     9  import (
    10  	"bytes"
    11  	"net"
    12  	"reflect"
    13  	"testing"
    14  
    15  	"github.com/gopacket/gopacket"
    16  )
    17  
    18  func TestSerializeIPv6HeaderTLVOptions(t *testing.T) {
    19  	//RFC 2460 Appendix B
    20  	/*
    21  	   Example 3
    22  
    23  	   A Hop-by-Hop or Destination Options header containing both options X
    24  	   and Y from Examples 1 and 2 would have one of the two following
    25  	   formats, depending on which option appeared first:
    26  
    27  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    28  	   |  Next Header  | Hdr Ext Len=3 | Option Type=X |Opt Data Len=12|
    29  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    30  	   |                         4-octet field                         |
    31  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    32  	   |                                                               |
    33  	   +                         8-octet field                         +
    34  	   |                                                               |
    35  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    36  	   | PadN Option=1 |Opt Data Len=1 |       0       | Option Type=Y |
    37  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    38  	   |Opt Data Len=7 | 1-octet field |         2-octet field         |
    39  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    40  	   |                         4-octet field                         |
    41  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    42  	   | PadN Option=1 |Opt Data Len=2 |       0       |       0       |
    43  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    44  	*/
    45  	opt1 := &ipv6HeaderTLVOption{}
    46  	opt1.OptionType = 0x1e
    47  	opt1.OptionData = []byte{0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb}
    48  	opt1.OptionAlignment = [2]uint8{8, 2}
    49  
    50  	opt2 := &ipv6HeaderTLVOption{}
    51  	opt2.OptionType = 0x3e
    52  	opt2.OptionData = []byte{0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44}
    53  	opt2.OptionAlignment = [2]uint8{4, 3}
    54  
    55  	l := serializeIPv6HeaderTLVOptions(nil, []*ipv6HeaderTLVOption{opt1, opt2}, true)
    56  	b := make([]byte, l)
    57  	serializeIPv6HeaderTLVOptions(b, []*ipv6HeaderTLVOption{opt1, opt2}, true)
    58  	got := b
    59  	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}
    60  
    61  	if !bytes.Equal(got, want) {
    62  		t.Errorf("IPv6HeaderTLVOption serialize (X,Y) failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
    63  	}
    64  
    65  	/*
    66  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    67  	   |  Next Header  | Hdr Ext Len=3 | Pad1 Option=0 | Option Type=Y |
    68  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    69  	   |Opt Data Len=7 | 1-octet field |         2-octet field         |
    70  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    71  	   |                         4-octet field                         |
    72  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    73  	   | PadN Option=1 |Opt Data Len=4 |       0       |       0       |
    74  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    75  	   |       0       |       0       | Option Type=X |Opt Data Len=12|
    76  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    77  	   |                         4-octet field                         |
    78  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    79  	   |                                                               |
    80  	   +                         8-octet field                         +
    81  	   |                                                               |
    82  	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    83  	*/
    84  
    85  	l = serializeIPv6HeaderTLVOptions(nil, []*ipv6HeaderTLVOption{opt2, opt1}, true)
    86  	b = make([]byte, l)
    87  	serializeIPv6HeaderTLVOptions(b, []*ipv6HeaderTLVOption{opt2, opt1}, true)
    88  	got = b
    89  	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}
    90  
    91  	if !bytes.Equal(got, want) {
    92  		t.Errorf("IPv6HeaderTLVOption serialize (Y,X) failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
    93  	}
    94  }
    95  
    96  var testPacketIPv6HopByHop0 = []byte{
    97  	0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
    98  	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
    99  	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00,
   100  }
   101  
   102  func TestPacketIPv6HopByHop0Serialize(t *testing.T) {
   103  	var serialize = make([]gopacket.SerializableLayer, 0, 2)
   104  	var err error
   105  
   106  	ip6 := &IPv6{}
   107  	ip6.Version = 6
   108  	ip6.NextHeader = IPProtocolIPv6HopByHop
   109  	ip6.HopLimit = 64
   110  	ip6.SrcIP = net.ParseIP("2001:db8::1")
   111  	ip6.DstIP = net.ParseIP("2001:db8::2")
   112  	serialize = append(serialize, ip6)
   113  
   114  	tlv := &IPv6HopByHopOption{}
   115  	tlv.OptionType = 0x01 //PadN
   116  	tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00}
   117  	hop := &IPv6HopByHop{}
   118  	hop.Options = append(hop.Options, tlv)
   119  	hop.NextHeader = IPProtocolNoNextHeader
   120  	ip6.HopByHop = hop
   121  
   122  	buf := gopacket.NewSerializeBuffer()
   123  	opts := gopacket.SerializeOptions{FixLengths: true}
   124  	err = gopacket.SerializeLayers(buf, opts, serialize...)
   125  	if err != nil {
   126  		t.Fatal(err)
   127  	}
   128  
   129  	got := buf.Bytes()
   130  	want := testPacketIPv6HopByHop0
   131  	if !bytes.Equal(got, want) {
   132  		t.Errorf("IPv6HopByHop serialize failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
   133  	}
   134  }
   135  
   136  func TestPacketIPv6HopByHop0Decode(t *testing.T) {
   137  	ip6 := &IPv6{
   138  		BaseLayer: BaseLayer{
   139  			Contents: []byte{
   140  				0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   141  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   142  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
   143  			},
   144  			Payload: []byte{},
   145  		},
   146  		Version:      6,
   147  		TrafficClass: 0,
   148  		FlowLabel:    0,
   149  		Length:       8,
   150  		NextHeader:   IPProtocolIPv6HopByHop,
   151  		HopLimit:     64,
   152  		SrcIP:        net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
   153  		DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   154  			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
   155  	}
   156  
   157  	hop := &ip6.hbh
   158  	hop.ipv6ExtensionBase = ipv6ExtensionBase{
   159  		BaseLayer: BaseLayer{
   160  			Contents: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00},
   161  			Payload:  []byte{},
   162  		},
   163  		NextHeader:   IPProtocolNoNextHeader,
   164  		HeaderLength: uint8(0),
   165  		ActualLength: 8,
   166  	}
   167  	opt := &IPv6HopByHopOption{
   168  		OptionType:   uint8(0x01),
   169  		OptionLength: uint8(0x04),
   170  		ActualLength: 6,
   171  		OptionData:   []byte{0x00, 0x00, 0x00, 0x00},
   172  	}
   173  	hop.Options = append(hop.Options, opt)
   174  	ip6.HopByHop = hop
   175  
   176  	p := gopacket.NewPacket(testPacketIPv6HopByHop0, LinkTypeRaw, gopacket.Default)
   177  	if p.ErrorLayer() != nil {
   178  		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
   179  	}
   180  	checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop}, t)
   181  	if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok {
   182  		want := ip6
   183  		want.HopByHop = got.HopByHop // avoid comparing pointers
   184  		if !reflect.DeepEqual(got, want) {
   185  			t.Errorf("IPv6 packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
   186  		}
   187  	} else {
   188  		t.Error("No IPv6 layer type found in packet")
   189  	}
   190  	if got, ok := p.Layer(LayerTypeIPv6HopByHop).(*IPv6HopByHop); ok {
   191  		want := hop
   192  		if !reflect.DeepEqual(got, want) {
   193  			t.Errorf("IPv6HopByHop packet processing failed:\ngot\n%#v\n\nwant:\n%#v\n\n", got, want)
   194  		}
   195  	} else {
   196  		t.Error("No IPv6HopByHop layer type found in packet")
   197  	}
   198  }
   199  
   200  // testPacketIPv6Destination0 is the packet:
   201  //
   202  //	12:40:14.429409595 IP6 2001:db8::1 > 2001:db8::2: DSTOPT no next header
   203  //		0x0000:  6000 0000 0008 3c40 2001 0db8 0000 0000  `.....<@........
   204  //		0x0010:  0000 0000 0000 0001 2001 0db8 0000 0000  ................
   205  //		0x0020:  0000 0000 0000 0002 3b00 0104 0000 0000  ........;.......
   206  var testPacketIPv6Destination0 = []byte{
   207  	0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3c, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   208  	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   209  	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00,
   210  }
   211  
   212  func TestPacketIPv6Destination0Serialize(t *testing.T) {
   213  	var serialize = make([]gopacket.SerializableLayer, 0, 2)
   214  	var err error
   215  
   216  	ip6 := &IPv6{}
   217  	ip6.Version = 6
   218  	ip6.NextHeader = IPProtocolIPv6Destination
   219  	ip6.HopLimit = 64
   220  	ip6.SrcIP = net.ParseIP("2001:db8::1")
   221  	ip6.DstIP = net.ParseIP("2001:db8::2")
   222  	serialize = append(serialize, ip6)
   223  
   224  	tlv := &IPv6DestinationOption{}
   225  	tlv.OptionType = 0x01 //PadN
   226  	tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00}
   227  	dst := &IPv6Destination{}
   228  	dst.Options = append(dst.Options, tlv)
   229  	dst.NextHeader = IPProtocolNoNextHeader
   230  	serialize = append(serialize, dst)
   231  
   232  	buf := gopacket.NewSerializeBuffer()
   233  	opts := gopacket.SerializeOptions{FixLengths: true}
   234  	err = gopacket.SerializeLayers(buf, opts, serialize...)
   235  	if err != nil {
   236  		t.Fatal(err)
   237  	}
   238  
   239  	got := buf.Bytes()
   240  	want := testPacketIPv6Destination0
   241  	if !bytes.Equal(got, want) {
   242  		t.Errorf("IPv6Destination serialize failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
   243  	}
   244  }
   245  
   246  func TestPacketIPv6Destination0Decode(t *testing.T) {
   247  	ip6 := &IPv6{
   248  		BaseLayer: BaseLayer{
   249  			Contents: []byte{
   250  				0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3c, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   251  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   252  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
   253  			},
   254  			Payload: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00},
   255  		},
   256  		Version:      6,
   257  		TrafficClass: 0,
   258  		FlowLabel:    0,
   259  		Length:       8,
   260  		NextHeader:   IPProtocolIPv6Destination,
   261  		HopLimit:     64,
   262  		SrcIP:        net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
   263  		DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   264  			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
   265  	}
   266  
   267  	dst := &IPv6Destination{}
   268  	dst.BaseLayer = BaseLayer{
   269  		Contents: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00},
   270  		Payload:  []byte{},
   271  	}
   272  	dst.NextHeader = IPProtocolNoNextHeader
   273  	dst.HeaderLength = uint8(0)
   274  	dst.ActualLength = 8
   275  	opt := &IPv6DestinationOption{
   276  		OptionType:   uint8(0x01),
   277  		OptionLength: uint8(0x04),
   278  		ActualLength: 6,
   279  		OptionData:   []byte{0x00, 0x00, 0x00, 0x00},
   280  	}
   281  	dst.Options = append(dst.Options, opt)
   282  
   283  	p := gopacket.NewPacket(testPacketIPv6Destination0, LinkTypeRaw, gopacket.Default)
   284  	if p.ErrorLayer() != nil {
   285  		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
   286  	}
   287  	checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6Destination}, t)
   288  	if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok {
   289  		want := ip6
   290  		if !reflect.DeepEqual(got, want) {
   291  			t.Errorf("IPv6 packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
   292  		}
   293  	} else {
   294  		t.Error("No IPv6 layer type found in packet")
   295  	}
   296  	if got, ok := p.Layer(LayerTypeIPv6Destination).(*IPv6Destination); ok {
   297  		want := dst
   298  		if !reflect.DeepEqual(got, want) {
   299  			t.Errorf("IPv6Destination packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want)
   300  		}
   301  	} else {
   302  		t.Error("No IPv6Destination layer type found in packet")
   303  	}
   304  }
   305  
   306  var testPacketIPv6JumbogramHeader = []byte{
   307  	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   308  	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   309  	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08,
   310  }
   311  
   312  func TestIPv6JumbogramSerialize(t *testing.T) {
   313  	var serialize = make([]gopacket.SerializableLayer, 0, 2)
   314  	var err error
   315  
   316  	ip6 := &IPv6{}
   317  	ip6.Version = 6
   318  	ip6.NextHeader = IPProtocolNoNextHeader
   319  	ip6.HopLimit = 64
   320  	ip6.SrcIP = net.ParseIP("2001:db8::1")
   321  	ip6.DstIP = net.ParseIP("2001:db8::2")
   322  	serialize = append(serialize, ip6)
   323  
   324  	payload := make([]byte, ipv6MaxPayloadLength+1)
   325  	for i := range payload {
   326  		payload[i] = 0xfe
   327  	}
   328  	serialize = append(serialize, gopacket.Payload(payload))
   329  
   330  	buf := gopacket.NewSerializeBuffer()
   331  	opts := gopacket.SerializeOptions{FixLengths: true}
   332  	err = gopacket.SerializeLayers(buf, opts, serialize...)
   333  	if err != nil {
   334  		t.Fatal(err)
   335  	}
   336  
   337  	got := buf.Bytes()
   338  	w := new(bytes.Buffer)
   339  	w.Write(testPacketIPv6JumbogramHeader)
   340  	w.Write(payload)
   341  	want := w.Bytes()
   342  
   343  	if !bytes.Equal(got, want) {
   344  		t.Errorf("IPv6 Jumbogram serialize failed:\ngot:\n%v\n\nwant:\n%v\n\n",
   345  			gopacket.LongBytesGoString(got), gopacket.LongBytesGoString(want))
   346  	}
   347  }
   348  
   349  func TestIPv6JumbogramDecode(t *testing.T) {
   350  	payload := make([]byte, ipv6MaxPayloadLength+1)
   351  	for i := range payload {
   352  		payload[i] = 0xfe
   353  	}
   354  
   355  	ip6 := &IPv6{
   356  		BaseLayer: BaseLayer{
   357  			Contents: []byte{
   358  				0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   359  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   360  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
   361  			},
   362  		},
   363  		Version:      6,
   364  		TrafficClass: 0,
   365  		FlowLabel:    0,
   366  		Length:       0,
   367  		NextHeader:   IPProtocolIPv6HopByHop,
   368  		HopLimit:     64,
   369  		SrcIP:        net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
   370  		DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
   371  			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
   372  	}
   373  	buf := new(bytes.Buffer)
   374  	buf.Write([]byte{0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08})
   375  	buf.Write(payload)
   376  	ip6.Payload = buf.Bytes()
   377  
   378  	hop := &ip6.hbh
   379  	hop.Contents = []byte{0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08}
   380  	hop.Payload = payload
   381  	hop.NextHeader = IPProtocolNoNextHeader
   382  	hop.HeaderLength = uint8(0)
   383  	hop.ActualLength = 8
   384  	opt := &IPv6HopByHopOption{}
   385  	opt.OptionType = uint8(0xc2)
   386  	opt.OptionLength = uint8(0x04)
   387  	opt.ActualLength = 6
   388  	opt.OptionData = []byte{0x00, 0x01, 0x00, 0x08}
   389  	hop.Options = append(hop.Options, opt)
   390  	ip6.HopByHop = hop
   391  
   392  	pkt := new(bytes.Buffer)
   393  	pkt.Write(testPacketIPv6JumbogramHeader)
   394  	pkt.Write(payload)
   395  
   396  	p := gopacket.NewPacket(pkt.Bytes(), LinkTypeRaw, gopacket.Default)
   397  	if p.ErrorLayer() != nil {
   398  		t.Error("Failed to decode packet:", p.ErrorLayer().Error())
   399  	}
   400  	checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop, gopacket.LayerTypePayload}, t)
   401  
   402  	if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok {
   403  		want := ip6
   404  		want.HopByHop = got.HopByHop // Hack, avoid comparing pointers
   405  		if !reflect.DeepEqual(got, want) {
   406  			t.Errorf("IPv6 packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n",
   407  				gopacket.LayerGoString(got), gopacket.LayerGoString(want))
   408  		}
   409  	} else {
   410  		t.Error("No IPv6 layer type found in packet")
   411  	}
   412  
   413  	if got, ok := p.Layer(LayerTypeIPv6HopByHop).(*IPv6HopByHop); ok {
   414  		want := hop
   415  		if !reflect.DeepEqual(got, want) {
   416  			t.Errorf("IPv6HopByHop packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n",
   417  				gopacket.LayerGoString(got), gopacket.LayerGoString(want))
   418  		}
   419  	} else {
   420  		t.Error("No IPv6HopByHop layer type found in packet")
   421  	}
   422  
   423  	if got, ok := p.Layer(gopacket.LayerTypePayload).(*gopacket.Payload); ok {
   424  		want := (*gopacket.Payload)(&payload)
   425  		if !reflect.DeepEqual(got, want) {
   426  			t.Errorf("Payload packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n",
   427  				gopacket.LayerGoString(got), gopacket.LayerGoString(want))
   428  		}
   429  	} else {
   430  		t.Error("No Payload layer type found in packet")
   431  	}
   432  }