| // Copyright 2012 Google, Inc. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style license |
| // that can be found in the LICENSE file in the root of the source |
| // tree. |
| |
| package gopacket |
| |
| import ( |
| "fmt" |
| ) |
| |
| // Layer represents a single decoded packet layer (using either the |
| // OSI or TCP/IP definition of a layer). When decoding, a packet's data is |
| // broken up into a number of layers. The caller may call LayerType() to |
| // figure out which type of layer they've received from the packet. Optionally, |
| // they may then use a type assertion to get the actual layer type for deep |
| // inspection of the data. |
| type Layer interface { |
| // LayerType is the gopacket type for this layer. |
| LayerType() LayerType |
| // LayerContents returns the set of bytes that make up this layer. |
| LayerContents() []byte |
| // LayerPayload returns the set of bytes contained within this layer, not |
| // including the layer itself. |
| LayerPayload() []byte |
| } |
| |
| // Payload is a Layer containing the payload of a packet. The definition of |
| // what constitutes the payload of a packet depends on previous layers; for |
| // TCP and UDP, we stop decoding above layer 4 and return the remaining |
| // bytes as a Payload. Payload is an ApplicationLayer. |
| type Payload []byte |
| |
| // LayerType returns LayerTypePayload |
| func (p Payload) LayerType() LayerType { return LayerTypePayload } |
| |
| // LayerContents returns the bytes making up this layer. |
| func (p Payload) LayerContents() []byte { return []byte(p) } |
| |
| // LayerPayload returns the payload within this layer. |
| func (p Payload) LayerPayload() []byte { return nil } |
| |
| // Payload returns this layer as bytes. |
| func (p Payload) Payload() []byte { return []byte(p) } |
| |
| // String implements fmt.Stringer. |
| func (p Payload) String() string { return fmt.Sprintf("%d byte(s)", len(p)) } |
| |
| // GoString implements fmt.GoStringer. |
| func (p Payload) GoString() string { return LongBytesGoString([]byte(p)) } |
| |
| // CanDecode implements DecodingLayer. |
| func (p Payload) CanDecode() LayerClass { return LayerTypePayload } |
| |
| // NextLayerType implements DecodingLayer. |
| func (p Payload) NextLayerType() LayerType { return LayerTypeZero } |
| |
| // DecodeFromBytes implements DecodingLayer. |
| func (p *Payload) DecodeFromBytes(data []byte, df DecodeFeedback) error { |
| *p = Payload(data) |
| return nil |
| } |
| |
| // SerializeTo writes the serialized form of this layer into the |
| // SerializationBuffer, implementing gopacket.SerializableLayer. |
| // See the docs for gopacket.SerializableLayer for more info. |
| func (p Payload) SerializeTo(b SerializeBuffer, opts SerializeOptions) error { |
| bytes, err := b.PrependBytes(len(p)) |
| if err != nil { |
| return err |
| } |
| copy(bytes, p) |
| return nil |
| } |
| |
| // decodePayload decodes data by returning it all in a Payload layer. |
| func decodePayload(data []byte, p PacketBuilder) error { |
| payload := &Payload{} |
| if err := payload.DecodeFromBytes(data, p); err != nil { |
| return nil |
| } |
| p.AddLayer(payload) |
| p.SetApplicationLayer(payload) |
| return nil |
| } |
| |
| // Fragment is a Layer containing a fragment of a larger frame, used by layers |
| // like IPv4 and IPv6 that allow for fragmentation of their payloads. |
| type Fragment []byte |
| |
| // LayerType returns LayerTypeFragment |
| func (p *Fragment) LayerType() LayerType { return LayerTypeFragment } |
| |
| // LayerContents implements Layer. |
| func (p *Fragment) LayerContents() []byte { return []byte(*p) } |
| |
| // LayerPayload implements Layer. |
| func (p *Fragment) LayerPayload() []byte { return nil } |
| |
| // Payload returns this layer as a byte slice. |
| func (p *Fragment) Payload() []byte { return []byte(*p) } |
| |
| // String implements fmt.Stringer. |
| func (p *Fragment) String() string { return fmt.Sprintf("%d byte(s)", len(*p)) } |
| |
| // CanDecode implements DecodingLayer. |
| func (p *Fragment) CanDecode() LayerClass { return LayerTypeFragment } |
| |
| // NextLayerType implements DecodingLayer. |
| func (p *Fragment) NextLayerType() LayerType { return LayerTypeZero } |
| |
| // DecodeFromBytes implements DecodingLayer. |
| func (p *Fragment) DecodeFromBytes(data []byte, df DecodeFeedback) error { |
| *p = Fragment(data) |
| return nil |
| } |
| |
| // SerializeTo writes the serialized form of this layer into the |
| // SerializationBuffer, implementing gopacket.SerializableLayer. |
| // See the docs for gopacket.SerializableLayer for more info. |
| func (p *Fragment) SerializeTo(b SerializeBuffer, opts SerializeOptions) error { |
| bytes, err := b.PrependBytes(len(*p)) |
| if err != nil { |
| return err |
| } |
| copy(bytes, *p) |
| return nil |
| } |
| |
| // decodeFragment decodes data by returning it all in a Fragment layer. |
| func decodeFragment(data []byte, p PacketBuilder) error { |
| payload := &Fragment{} |
| if err := payload.DecodeFromBytes(data, p); err != nil { |
| return nil |
| } |
| p.AddLayer(payload) |
| p.SetApplicationLayer(payload) |
| return nil |
| } |
| |
| // These layers correspond to Internet Protocol Suite (TCP/IP) layers, and their |
| // corresponding OSI layers, as best as possible. |
| |
| // LinkLayer is the packet layer corresponding to TCP/IP layer 1 (OSI layer 2) |
| type LinkLayer interface { |
| Layer |
| LinkFlow() Flow |
| } |
| |
| // NetworkLayer is the packet layer corresponding to TCP/IP layer 2 (OSI |
| // layer 3) |
| type NetworkLayer interface { |
| Layer |
| NetworkFlow() Flow |
| } |
| |
| // TransportLayer is the packet layer corresponding to the TCP/IP layer 3 (OSI |
| // layer 4) |
| type TransportLayer interface { |
| Layer |
| TransportFlow() Flow |
| } |
| |
| // ApplicationLayer is the packet layer corresponding to the TCP/IP layer 4 (OSI |
| // layer 7), also known as the packet payload. |
| type ApplicationLayer interface { |
| Layer |
| Payload() []byte |
| } |
| |
| // ErrorLayer is a packet layer created when decoding of the packet has failed. |
| // Its payload is all the bytes that we were unable to decode, and the returned |
| // error details why the decoding failed. |
| type ErrorLayer interface { |
| Layer |
| Error() error |
| } |