123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- package gopacket
- import (
- "fmt"
- )
- type DecodingLayer interface {
-
-
-
-
-
- DecodeFromBytes(data []byte, df DecodeFeedback) error
-
-
-
- CanDecode() LayerClass
-
-
- NextLayerType() LayerType
-
-
- LayerPayload() []byte
- }
- type DecodingLayerParser struct {
-
-
- DecodingLayerParserOptions
- first LayerType
- decoders map[LayerType]DecodingLayer
- df DecodeFeedback
-
-
- Truncated bool
- }
- func (l *DecodingLayerParser) AddDecodingLayer(d DecodingLayer) {
- for _, typ := range d.CanDecode().LayerTypes() {
- l.decoders[typ] = d
- }
- }
- func (l *DecodingLayerParser) SetTruncated() {
- l.Truncated = true
- }
- func NewDecodingLayerParser(first LayerType, decoders ...DecodingLayer) *DecodingLayerParser {
- dlp := &DecodingLayerParser{
- decoders: make(map[LayerType]DecodingLayer),
- first: first,
- }
- dlp.df = dlp
- for _, d := range decoders {
- dlp.AddDecodingLayer(d)
- }
- return dlp
- }
- func (l *DecodingLayerParser) DecodeLayers(data []byte, decoded *[]LayerType) (err error) {
- l.Truncated = false
- if !l.IgnorePanic {
- defer panicToError(&err)
- }
- typ := l.first
- *decoded = (*decoded)[:0]
- for len(data) > 0 {
- decoder, ok := l.decoders[typ]
- if !ok {
- if l.IgnoreUnsupported {
- return nil
- }
- return UnsupportedLayerType(typ)
- } else if err = decoder.DecodeFromBytes(data, l.df); err != nil {
- return err
- }
- *decoded = append(*decoded, typ)
- typ = decoder.NextLayerType()
- data = decoder.LayerPayload()
- }
- return nil
- }
- type UnsupportedLayerType LayerType
- func (e UnsupportedLayerType) Error() string {
- return fmt.Sprintf("No decoder for layer type %v", LayerType(e))
- }
- func panicToError(e *error) {
- if r := recover(); r != nil {
- *e = fmt.Errorf("panic: %v", r)
- }
- }
- type DecodingLayerParserOptions struct {
-
-
-
-
-
-
- IgnorePanic bool
-
-
-
-
-
- IgnoreUnsupported bool
- }
|