-
Notifications
You must be signed in to change notification settings - Fork 0
/
decoder.go
34 lines (31 loc) · 1.08 KB
/
decoder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package layerexts
import (
"github.com/google/gopacket"
)
// LayerDecodingLayer is satisfied by types that we can generate a decoder. This
// is lifted from gopacket, where it is not exported.
type LayerDecodingLayer interface {
gopacket.Layer
DecodeFromBytes([]byte, gopacket.DecodeFeedback) error
NextLayerType() gopacket.LayerType
}
// BuildDecoder creates a gopacket.Decoder for a layer implementing the required
// methods. It is useful when creating a gopacket.LayerTypeMetadata, however
// note this decoder is not used in the context of gopacket.DecodingLayer. This
// function takes a generating function rather than concrete instance, as
// otherwise decoded layers will appear to overwrite each other.
func BuildDecoder(newLayer func() LayerDecodingLayer) gopacket.Decoder {
return gopacket.DecodeFunc(func(d []byte, p gopacket.PacketBuilder) error {
layer := newLayer()
err := layer.DecodeFromBytes(d, p)
if err != nil {
return err
}
p.AddLayer(layer)
next := layer.NextLayerType()
if next == gopacket.LayerTypeZero {
return nil
}
return p.NextDecoder(next)
})
}