blob: 797b55fbefe4b4676005c3095d15c06a85431ce3 [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001// 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
7package gopacket
8
9import (
10 "fmt"
11)
12
13// Layer represents a single decoded packet layer (using either the
14// OSI or TCP/IP definition of a layer). When decoding, a packet's data is
15// broken up into a number of layers. The caller may call LayerType() to
16// figure out which type of layer they've received from the packet. Optionally,
17// they may then use a type assertion to get the actual layer type for deep
18// inspection of the data.
19type Layer interface {
20 // LayerType is the gopacket type for this layer.
21 LayerType() LayerType
22 // LayerContents returns the set of bytes that make up this layer.
23 LayerContents() []byte
24 // LayerPayload returns the set of bytes contained within this layer, not
25 // including the layer itself.
26 LayerPayload() []byte
27}
28
29// Payload is a Layer containing the payload of a packet. The definition of
30// what constitutes the payload of a packet depends on previous layers; for
31// TCP and UDP, we stop decoding above layer 4 and return the remaining
32// bytes as a Payload. Payload is an ApplicationLayer.
33type Payload []byte
34
35// LayerType returns LayerTypePayload
36func (p Payload) LayerType() LayerType { return LayerTypePayload }
37
38// LayerContents returns the bytes making up this layer.
39func (p Payload) LayerContents() []byte { return []byte(p) }
40
41// LayerPayload returns the payload within this layer.
42func (p Payload) LayerPayload() []byte { return nil }
43
44// Payload returns this layer as bytes.
45func (p Payload) Payload() []byte { return []byte(p) }
46
47// String implements fmt.Stringer.
48func (p Payload) String() string { return fmt.Sprintf("%d byte(s)", len(p)) }
49
50// GoString implements fmt.GoStringer.
51func (p Payload) GoString() string { return LongBytesGoString([]byte(p)) }
52
53// CanDecode implements DecodingLayer.
54func (p Payload) CanDecode() LayerClass { return LayerTypePayload }
55
56// NextLayerType implements DecodingLayer.
57func (p Payload) NextLayerType() LayerType { return LayerTypeZero }
58
59// DecodeFromBytes implements DecodingLayer.
60func (p *Payload) DecodeFromBytes(data []byte, df DecodeFeedback) error {
61 *p = Payload(data)
62 return nil
63}
64
65// SerializeTo writes the serialized form of this layer into the
66// SerializationBuffer, implementing gopacket.SerializableLayer.
67// See the docs for gopacket.SerializableLayer for more info.
68func (p Payload) SerializeTo(b SerializeBuffer, opts SerializeOptions) error {
69 bytes, err := b.PrependBytes(len(p))
70 if err != nil {
71 return err
72 }
73 copy(bytes, p)
74 return nil
75}
76
77// decodePayload decodes data by returning it all in a Payload layer.
78func decodePayload(data []byte, p PacketBuilder) error {
79 payload := &Payload{}
80 if err := payload.DecodeFromBytes(data, p); err != nil {
81 return nil
82 }
83 p.AddLayer(payload)
84 p.SetApplicationLayer(payload)
85 return nil
86}
87
88// Fragment is a Layer containing a fragment of a larger frame, used by layers
89// like IPv4 and IPv6 that allow for fragmentation of their payloads.
90type Fragment []byte
91
92// LayerType returns LayerTypeFragment
93func (p *Fragment) LayerType() LayerType { return LayerTypeFragment }
94
95// LayerContents implements Layer.
96func (p *Fragment) LayerContents() []byte { return []byte(*p) }
97
98// LayerPayload implements Layer.
99func (p *Fragment) LayerPayload() []byte { return nil }
100
101// Payload returns this layer as a byte slice.
102func (p *Fragment) Payload() []byte { return []byte(*p) }
103
104// String implements fmt.Stringer.
105func (p *Fragment) String() string { return fmt.Sprintf("%d byte(s)", len(*p)) }
106
107// CanDecode implements DecodingLayer.
108func (p *Fragment) CanDecode() LayerClass { return LayerTypeFragment }
109
110// NextLayerType implements DecodingLayer.
111func (p *Fragment) NextLayerType() LayerType { return LayerTypeZero }
112
113// DecodeFromBytes implements DecodingLayer.
114func (p *Fragment) DecodeFromBytes(data []byte, df DecodeFeedback) error {
115 *p = Fragment(data)
116 return nil
117}
118
119// SerializeTo writes the serialized form of this layer into the
120// SerializationBuffer, implementing gopacket.SerializableLayer.
121// See the docs for gopacket.SerializableLayer for more info.
122func (p *Fragment) SerializeTo(b SerializeBuffer, opts SerializeOptions) error {
123 bytes, err := b.PrependBytes(len(*p))
124 if err != nil {
125 return err
126 }
127 copy(bytes, *p)
128 return nil
129}
130
131// decodeFragment decodes data by returning it all in a Fragment layer.
132func decodeFragment(data []byte, p PacketBuilder) error {
133 payload := &Fragment{}
134 if err := payload.DecodeFromBytes(data, p); err != nil {
135 return nil
136 }
137 p.AddLayer(payload)
138 p.SetApplicationLayer(payload)
139 return nil
140}
141
142// These layers correspond to Internet Protocol Suite (TCP/IP) layers, and their
143// corresponding OSI layers, as best as possible.
144
145// LinkLayer is the packet layer corresponding to TCP/IP layer 1 (OSI layer 2)
146type LinkLayer interface {
147 Layer
148 LinkFlow() Flow
149}
150
151// NetworkLayer is the packet layer corresponding to TCP/IP layer 2 (OSI
152// layer 3)
153type NetworkLayer interface {
154 Layer
155 NetworkFlow() Flow
156}
157
158// TransportLayer is the packet layer corresponding to the TCP/IP layer 3 (OSI
159// layer 4)
160type TransportLayer interface {
161 Layer
162 TransportFlow() Flow
163}
164
165// ApplicationLayer is the packet layer corresponding to the TCP/IP layer 4 (OSI
166// layer 7), also known as the packet payload.
167type ApplicationLayer interface {
168 Layer
169 Payload() []byte
170}
171
172// ErrorLayer is a packet layer created when decoding of the packet has failed.
173// Its payload is all the bytes that we were unable to decode, and the returned
174// error details why the decoding failed.
175type ErrorLayer interface {
176 Layer
177 Error() error
178}