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

     1  // Copyright 2012, Google, Inc. All rights reserved.
     2  // Copyright 2009-2011 Andreas Krennmair. All rights reserved.
     3  //
     4  // Use of this source code is governed by a BSD-style license
     5  // that can be found in the LICENSE file in the root of the source
     6  // tree.
     7  
     8  package layers
     9  
    10  import (
    11  	"testing"
    12  
    13  	"github.com/gopacket/gopacket"
    14  )
    15  
    16  var icmp6NeighborAnnouncementData = []byte{
    17  	// Ethernet layer
    18  	0x00, 0x1F, 0xCA, 0xB3, 0x76, 0x40, // destination
    19  	0x24, 0xBE, 0x05, 0x27, 0x0B, 0x17, // source
    20  	0x86, 0xDD, // type IPv6
    21  
    22  	// IPv6 layer
    23  	0x60, 0x00, 0x00, 0x00, // version; traffic class; flow label
    24  	0x00, 0x18, // payload length?
    25  	0x3A,                                                                                           // Next Header - IPv6-ICMP
    26  	0xFF,                                                                                           // Hop Limit
    27  	0x26, 0x20, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x26, 0xBE, 0x05, 0xFF, 0xFE, 0x27, 0x0B, 0x17, // source
    28  	0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1F, 0xCA, 0xFF, 0xFE, 0xB3, 0x76, 0x40, // destination
    29  
    30  	// ICMPv6 layer
    31  	0x88, 0x00, // ICMP type 136, code 0
    32  
    33  	0x1E, 0xD6, // checksum
    34  	0x40, 0x00, 0x00, 0x00, // flags & reserved
    35  	0x26, 0x20, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x26, 0xBE, 0x05, 0xFF, 0xFE, 0x27, 0x0B, 0x17, // target address
    36  }
    37  
    38  var icmp6RouterAdvertisementData = []byte{
    39  	// Ethernet layer
    40  	0x33, 0x33, 0x00, 0x00, 0x00, 0x01, // destination,
    41  	0xde, 0x42, 0x72, 0xb0, 0x1e, 0xf4, // source
    42  	0x86, 0xdd,
    43  
    44  	// IPv6 layer
    45  	0x60, 0x00, 0x00, 0x00, // version; traffic class; flow label
    46  	0x00, 0x20, // payload length?
    47  	0x3a,                                                                                           // Next Header - IPv6-ICMP
    48  	0xff,                                                                                           // Hop Limit
    49  	0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x42, 0x72, 0xff, 0xfe, 0xb0, 0x1e, 0xf4, // source,
    50  	0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // destination
    51  
    52  	// ICMPv6 layer
    53  	0x86, 0x00, // ICMP type 134, code 0
    54  
    55  	0x4c, 0x6b, // checksum
    56  	0x40,       // current hop limit
    57  	0x00,       // flags & reserves
    58  	0x07, 0x08, // router lifetime
    59  	0x00, 0x00, 0x00, 0x00, // reachable time
    60  	0x00, 0x00, 0x00, 0x00, //retrans time
    61  	0x01, 0x01, 0xde, 0x42, 0x72, 0xb0, 0x1e, 0xf4, // source link layer address
    62  	0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0xdc, // MTU option
    63  }
    64  
    65  func TestPacketICMPv6NeighborAnnouncementFlags(t *testing.T) {
    66  	var ethLayer Ethernet
    67  	var ipV6Layer IPv6
    68  	var icmpLayer ICMPv6
    69  
    70  	var icmpNeighAdvLayer ICMPv6NeighborAdvertisement
    71  
    72  	parser := gopacket.NewDecodingLayerParser(LayerTypeEthernet, &ethLayer, &ipV6Layer, &icmpLayer)
    73  	parser.IgnoreUnsupported = true
    74  
    75  	respLayers := make([]gopacket.LayerType, 0)
    76  	err := parser.DecodeLayers(icmp6NeighborAnnouncementData, &respLayers)
    77  
    78  	if err != nil {
    79  		t.Errorf("error decoding layers %s", err)
    80  		return
    81  	}
    82  
    83  	err = icmpNeighAdvLayer.DecodeFromBytes(icmpLayer.LayerPayload(), gopacket.NilDecodeFeedback)
    84  	if err != nil {
    85  		t.Errorf("Error while Decodeing From Bytes: %s", err)
    86  		return
    87  	}
    88  
    89  	if icmpNeighAdvLayer.Router() {
    90  		t.Errorf("This Neighbor Advertisement message's Router flag should not be set")
    91  	}
    92  	if !icmpNeighAdvLayer.Solicited() {
    93  		t.Errorf("This Neighbor Advertisement message's Solicited flag should be set")
    94  	}
    95  	if icmpNeighAdvLayer.Override() {
    96  		t.Errorf("This Neighbor Advertisement message's Override bit should not be set")
    97  	}
    98  }
    99  
   100  func TestPacketICMPv6RouterAnnouncementFlags(t *testing.T) {
   101  	var ethLayer Ethernet
   102  	var ipV6Layer IPv6
   103  	var icmpLayer ICMPv6
   104  
   105  	var icmpRouterAdvLayer ICMPv6RouterAdvertisement
   106  
   107  	parser := gopacket.NewDecodingLayerParser(LayerTypeEthernet, &ethLayer, &ipV6Layer, &icmpLayer)
   108  	parser.IgnoreUnsupported = true
   109  
   110  	respLayers := make([]gopacket.LayerType, 0)
   111  	err := parser.DecodeLayers(icmp6RouterAdvertisementData, &respLayers)
   112  
   113  	if err != nil {
   114  		t.Errorf("error decoding layers %s", err)
   115  		return
   116  	}
   117  
   118  	err = icmpRouterAdvLayer.DecodeFromBytes(icmpLayer.LayerPayload(), gopacket.NilDecodeFeedback)
   119  	if err != nil {
   120  		t.Errorf("Error while Decodeing From Bytes: %s", err)
   121  		return
   122  	}
   123  
   124  	if icmpRouterAdvLayer.ManagedAddressConfig() {
   125  		t.Errorf("This Router Advertisement message's ManagedAddressConfig flag should not be set")
   126  	}
   127  	if icmpRouterAdvLayer.OtherConfig() {
   128  		t.Errorf("This Router Advertisement message's OtherConfig flag should not be set")
   129  	}
   130  }