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

     1  // Copyright 2012 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 gopacket
     8  
     9  import (
    10  	"errors"
    11  )
    12  
    13  // DecodeFeedback is used by DecodingLayer layers to provide decoding metadata.
    14  type DecodeFeedback interface {
    15  	// SetTruncated should be called if during decoding you notice that a packet
    16  	// is shorter than internal layer variables (HeaderLength, or the like) say it
    17  	// should be.  It sets packet.Metadata().Truncated.
    18  	SetTruncated()
    19  }
    20  
    21  type nilDecodeFeedback struct{}
    22  
    23  func (nilDecodeFeedback) SetTruncated() {}
    24  
    25  // NilDecodeFeedback implements DecodeFeedback by doing nothing.
    26  var NilDecodeFeedback DecodeFeedback = nilDecodeFeedback{}
    27  
    28  // PacketBuilder is used by layer decoders to store the layers they've decoded,
    29  // and to defer future decoding via NextDecoder.
    30  // Typically, the pattern for use is:
    31  //
    32  //	func (m *myDecoder) Decode(data []byte, p PacketBuilder) error {
    33  //	  if myLayer, err := myDecodingLogic(data); err != nil {
    34  //	    return err
    35  //	  } else {
    36  //	    p.AddLayer(myLayer)
    37  //	  }
    38  //	  // maybe do this, if myLayer is a LinkLayer
    39  //	  p.SetLinkLayer(myLayer)
    40  //	  return p.NextDecoder(nextDecoder)
    41  //	}
    42  type PacketBuilder interface {
    43  	DecodeFeedback
    44  	// AddLayer should be called by a decoder immediately upon successful
    45  	// decoding of a layer.
    46  	AddLayer(l Layer)
    47  	// The following functions set the various specific layers in the final
    48  	// packet.  Note that if many layers call SetX, the first call is kept and all
    49  	// other calls are ignored.
    50  	SetLinkLayer(LinkLayer)
    51  	SetNetworkLayer(NetworkLayer)
    52  	SetTransportLayer(TransportLayer)
    53  	SetApplicationLayer(ApplicationLayer)
    54  	SetErrorLayer(ErrorLayer)
    55  	// NextDecoder should be called by a decoder when they're done decoding a
    56  	// packet layer but not done with decoding the entire packet.  The next
    57  	// decoder will be called to decode the last AddLayer's LayerPayload.
    58  	// Because of this, NextDecoder must only be called once all other
    59  	// PacketBuilder calls have been made.  Set*Layer and AddLayer calls after
    60  	// NextDecoder calls will behave incorrectly.
    61  	NextDecoder(next Decoder) error
    62  	// DumpPacketData is used solely for decoding.  If you come across an error
    63  	// you need to diagnose while processing a packet, call this and your packet's
    64  	// data will be dumped to stderr so you can create a test.  This should never
    65  	// be called from a production decoder.
    66  	DumpPacketData()
    67  	// DecodeOptions returns the decode options
    68  	DecodeOptions() *DecodeOptions
    69  }
    70  
    71  // Decoder is an interface for logic to decode a packet layer.  Users may
    72  // implement a Decoder to handle their own strange packet types, or may use one
    73  // of the many decoders available in the 'layers' subpackage to decode things
    74  // for them.
    75  type Decoder interface {
    76  	// Decode decodes the bytes of a packet, sending decoded values and other
    77  	// information to PacketBuilder, and returning an error if unsuccessful.  See
    78  	// the PacketBuilder documentation for more details.
    79  	Decode([]byte, PacketBuilder) error
    80  }
    81  
    82  // DecodeFunc wraps a function to make it a Decoder.
    83  type DecodeFunc func([]byte, PacketBuilder) error
    84  
    85  // Decode implements Decoder by calling itself.
    86  func (d DecodeFunc) Decode(data []byte, p PacketBuilder) error {
    87  	// function, call thyself.
    88  	return d(data, p)
    89  }
    90  
    91  // DecodePayload is a Decoder that returns a Payload layer containing all
    92  // remaining bytes.
    93  var DecodePayload Decoder = DecodeFunc(decodePayload)
    94  
    95  // DecodeUnknown is a Decoder that returns an Unknown layer containing all
    96  // remaining bytes, useful if you run up against a layer that you're unable to
    97  // decode yet.  This layer is considered an ErrorLayer.
    98  var DecodeUnknown Decoder = DecodeFunc(decodeUnknown)
    99  
   100  // DecodeFragment is a Decoder that returns a Fragment layer containing all
   101  // remaining bytes.
   102  var DecodeFragment Decoder = DecodeFunc(decodeFragment)
   103  
   104  // LayerTypeZero is an invalid layer type, but can be used to determine whether
   105  // layer type has actually been set correctly.
   106  var LayerTypeZero = RegisterLayerType(0, LayerTypeMetadata{Name: "Unknown", Decoder: DecodeUnknown})
   107  
   108  // LayerTypeDecodeFailure is the layer type for the default error layer.
   109  var LayerTypeDecodeFailure = RegisterLayerType(1, LayerTypeMetadata{Name: "DecodeFailure", Decoder: DecodeUnknown})
   110  
   111  // LayerTypePayload is the layer type for a payload that we don't try to decode
   112  // but treat as a success, IE: an application-level payload.
   113  var LayerTypePayload = RegisterLayerType(2, LayerTypeMetadata{Name: "Payload", Decoder: DecodePayload})
   114  
   115  // LayerTypeFragment is the layer type for a fragment of a layer transported
   116  // by an underlying layer that supports fragmentation.
   117  var LayerTypeFragment = RegisterLayerType(3, LayerTypeMetadata{Name: "Fragment", Decoder: DecodeFragment})
   118  
   119  // DecodeFailure is a packet layer created if decoding of the packet data failed
   120  // for some reason.  It implements ErrorLayer.  LayerContents will be the entire
   121  // set of bytes that failed to parse, and Error will return the reason parsing
   122  // failed.
   123  type DecodeFailure struct {
   124  	data  []byte
   125  	err   error
   126  	stack []byte
   127  }
   128  
   129  // Error returns the error encountered during decoding.
   130  func (d *DecodeFailure) Error() error { return d.err }
   131  
   132  // LayerContents implements Layer.
   133  func (d *DecodeFailure) LayerContents() []byte { return d.data }
   134  
   135  // LayerPayload implements Layer.
   136  func (d *DecodeFailure) LayerPayload() []byte { return nil }
   137  
   138  // String implements fmt.Stringer.
   139  func (d *DecodeFailure) String() string {
   140  	return "Packet decoding error: " + d.Error().Error()
   141  }
   142  
   143  // Dump implements Dumper.
   144  func (d *DecodeFailure) Dump() (s string) {
   145  	if d.stack != nil {
   146  		s = string(d.stack)
   147  	}
   148  	return
   149  }
   150  
   151  // LayerType returns LayerTypeDecodeFailure
   152  func (d *DecodeFailure) LayerType() LayerType { return LayerTypeDecodeFailure }
   153  
   154  // decodeUnknown "decodes" unsupported data types by returning an error.
   155  // This decoder will thus always return a DecodeFailure layer.
   156  func decodeUnknown(data []byte, p PacketBuilder) error {
   157  	return errors.New("Layer type not currently supported")
   158  }