github.com/gopacket/gopacket@v1.1.0/gen.go (about) 1 // Copyright 2019 The GoPacket Authors. 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 7 //go:build ignore 8 // +build ignore 9 10 // This file generates LayersDecoder function for DecodingLayerContainer 11 // go run gen.go | gofmt > layers_decoder.go 12 package main 13 14 import ( 15 "fmt" 16 "os" 17 "time" 18 ) 19 20 const headerFmt = `// Copyright 2019 The GoPacket Authors. All rights reserved. 21 22 package gopacket 23 24 // Created by gen.go, don't edit manually 25 // Generated at %s 26 27 // LayersDecoder returns DecodingLayerFunc for specified 28 // DecodingLayerContainer, LayerType value to start decoding with and 29 // some DecodeFeedback. 30 func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback) DecodingLayerFunc { 31 firstDec, ok := dl.Decoder(first) 32 if !ok { 33 return func([]byte, *[]LayerType) (LayerType, error) { 34 return first, nil 35 } 36 } 37 ` 38 39 var funcBody = `return func(data []byte, decoded *[]LayerType) (LayerType, error) { 40 *decoded = (*decoded)[:0] // Truncated decoded layers. 41 typ := first 42 decoder := firstDec 43 for { 44 if err := decoder.DecodeFromBytes(data, df); err != nil { 45 return LayerTypeZero, err 46 } 47 *decoded = append(*decoded, typ) 48 typ = decoder.NextLayerType() 49 if data = decoder.LayerPayload(); len(data) == 0 { 50 break 51 } 52 if decoder, ok = dlc.Decoder(typ); !ok { 53 return typ, nil 54 } 55 } 56 return LayerTypeZero, nil 57 }` 58 59 func main() { 60 fmt.Fprintf(os.Stderr, "Writing results to stdout\n") 61 types := []string{ 62 "DecodingLayerSparse", 63 "DecodingLayerArray", 64 "DecodingLayerMap", 65 } 66 67 fmt.Printf(headerFmt, time.Now()) 68 for _, t := range types { 69 fmt.Printf("if dlc, ok := dl.(%s); ok {", t) 70 fmt.Println(funcBody) 71 fmt.Println("}") 72 } 73 fmt.Println("dlc := dl") 74 fmt.Println(funcBody) 75 fmt.Println("}") 76 }