forked from google/gopacket
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
parser: implement DecodeLayerContainer
Changes: * add DecodingLayerContainer to contain/search DecodingLayer values: * add DecodingLayerFunc type as a decoder closure; * add DecodingLayerMap, DecodingLayerSparse, DecodingLayerArray as implementations of DecodingLayerContainer; * add code generation for the reference LayersDecoder method implementation. * refactor DecodingLayerParser: * use DecodingLayerMap by default; * add SetDecodingLayerContainer method to initialize parser. Signed-off-by: Yerden Zhumabekov <[email protected]>
- Loading branch information
Showing
3 changed files
with
345 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
// Copyright 2019 The GoPacket Authors. 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. | ||
|
||
// +build ignore | ||
|
||
// This file generates LayersDecoder function for DecodingLayerContainer | ||
// go run gen.go | gofmt > layers_decoder.go | ||
package main | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
"time" | ||
) | ||
|
||
const headerFmt = `// Copyright 2019 The GoPacket Authors. All rights reserved. | ||
package gopacket | ||
// Created by gen.go, don't edit manually | ||
// Generated at %s | ||
// LayersDecoder returns DecodingLayerFunc for specified | ||
// DecodingLayerContainer, LayerType value to start decoding with and | ||
// some DecodeFeedback. | ||
func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback) DecodingLayerFunc { | ||
firstDec, ok := dl.Decoder(first) | ||
if !ok { | ||
return func([]byte, *[]LayerType) (LayerType, error) { | ||
return first, nil | ||
} | ||
} | ||
` | ||
|
||
var funcBody = `return func(data []byte, decoded *[]LayerType) (LayerType, error) { | ||
*decoded = (*decoded)[:0] // Truncated decoded layers. | ||
typ := first | ||
decoder := firstDec | ||
for { | ||
if err := decoder.DecodeFromBytes(data, df); err != nil { | ||
return LayerTypeZero, err | ||
} | ||
*decoded = append(*decoded, typ) | ||
typ = decoder.NextLayerType() | ||
if data = decoder.LayerPayload(); len(data) == 0 { | ||
break | ||
} | ||
if decoder, ok = dlc.Decoder(typ); !ok { | ||
return typ, nil | ||
} | ||
} | ||
return LayerTypeZero, nil | ||
}` | ||
|
||
func main() { | ||
fmt.Fprintf(os.Stderr, "Writing results to stdout\n") | ||
types := []string{ | ||
"DecodingLayerSparse", | ||
"DecodingLayerArray", | ||
"DecodingLayerMap", | ||
} | ||
|
||
fmt.Printf(headerFmt, time.Now()) | ||
for _, t := range types { | ||
fmt.Printf("if dlc, ok := dl.(%s); ok {", t) | ||
fmt.Println(funcBody) | ||
fmt.Println("}") | ||
} | ||
fmt.Println("dlc := dl") | ||
fmt.Println(funcBody) | ||
fmt.Println("}") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
// Copyright 2019 The GoPacket Authors. All rights reserved. | ||
|
||
package gopacket | ||
|
||
// Created by gen.go, don't edit manually | ||
// Generated at 2019-06-18 11:37:31.308731293 +0600 +06 m=+0.000842599 | ||
|
||
// LayersDecoder returns DecodingLayerFunc for specified | ||
// DecodingLayerContainer, LayerType value to start decoding with and | ||
// some DecodeFeedback. | ||
func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback) DecodingLayerFunc { | ||
firstDec, ok := dl.Decoder(first) | ||
if !ok { | ||
return func([]byte, *[]LayerType) (LayerType, error) { | ||
return first, nil | ||
} | ||
} | ||
if dlc, ok := dl.(DecodingLayerSparse); ok { | ||
return func(data []byte, decoded *[]LayerType) (LayerType, error) { | ||
*decoded = (*decoded)[:0] // Truncated decoded layers. | ||
typ := first | ||
decoder := firstDec | ||
for { | ||
if err := decoder.DecodeFromBytes(data, df); err != nil { | ||
return LayerTypeZero, err | ||
} | ||
*decoded = append(*decoded, typ) | ||
typ = decoder.NextLayerType() | ||
if data = decoder.LayerPayload(); len(data) == 0 { | ||
break | ||
} | ||
if decoder, ok = dlc.Decoder(typ); !ok { | ||
return typ, nil | ||
} | ||
} | ||
return LayerTypeZero, nil | ||
} | ||
} | ||
if dlc, ok := dl.(DecodingLayerArray); ok { | ||
return func(data []byte, decoded *[]LayerType) (LayerType, error) { | ||
*decoded = (*decoded)[:0] // Truncated decoded layers. | ||
typ := first | ||
decoder := firstDec | ||
for { | ||
if err := decoder.DecodeFromBytes(data, df); err != nil { | ||
return LayerTypeZero, err | ||
} | ||
*decoded = append(*decoded, typ) | ||
typ = decoder.NextLayerType() | ||
if data = decoder.LayerPayload(); len(data) == 0 { | ||
break | ||
} | ||
if decoder, ok = dlc.Decoder(typ); !ok { | ||
return typ, nil | ||
} | ||
} | ||
return LayerTypeZero, nil | ||
} | ||
} | ||
if dlc, ok := dl.(DecodingLayerMap); ok { | ||
return func(data []byte, decoded *[]LayerType) (LayerType, error) { | ||
*decoded = (*decoded)[:0] // Truncated decoded layers. | ||
typ := first | ||
decoder := firstDec | ||
for { | ||
if err := decoder.DecodeFromBytes(data, df); err != nil { | ||
return LayerTypeZero, err | ||
} | ||
*decoded = append(*decoded, typ) | ||
typ = decoder.NextLayerType() | ||
if data = decoder.LayerPayload(); len(data) == 0 { | ||
break | ||
} | ||
if decoder, ok = dlc.Decoder(typ); !ok { | ||
return typ, nil | ||
} | ||
} | ||
return LayerTypeZero, nil | ||
} | ||
} | ||
dlc := dl | ||
return func(data []byte, decoded *[]LayerType) (LayerType, error) { | ||
*decoded = (*decoded)[:0] // Truncated decoded layers. | ||
typ := first | ||
decoder := firstDec | ||
for { | ||
if err := decoder.DecodeFromBytes(data, df); err != nil { | ||
return LayerTypeZero, err | ||
} | ||
*decoded = append(*decoded, typ) | ||
typ = decoder.NextLayerType() | ||
if data = decoder.LayerPayload(); len(data) == 0 { | ||
break | ||
} | ||
if decoder, ok = dlc.Decoder(typ); !ok { | ||
return typ, nil | ||
} | ||
} | ||
return LayerTypeZero, nil | ||
} | ||
} |
Oops, something went wrong.