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 }