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 }