github.com/gopacket/gopacket@v1.1.0/layers_decoder.go (about)

     1  // Copyright 2019 The GoPacket Authors. All rights reserved.
     2  
     3  package gopacket
     4  
     5  // Created by gen.go, don't edit manually
     6  // Generated at 2019-06-18 11:37:31.308731293 +0600 +06 m=+0.000842599
     7  
     8  // LayersDecoder returns DecodingLayerFunc for specified
     9  // DecodingLayerContainer, LayerType value to start decoding with and
    10  // some DecodeFeedback.
    11  func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback) DecodingLayerFunc {
    12  	firstDec, ok := dl.Decoder(first)
    13  	if !ok {
    14  		return func([]byte, *[]LayerType) (LayerType, error) {
    15  			return first, nil
    16  		}
    17  	}
    18  	if dlc, ok := dl.(DecodingLayerSparse); ok {
    19  		return func(data []byte, decoded *[]LayerType) (LayerType, error) {
    20  			*decoded = (*decoded)[:0] // Truncated decoded layers.
    21  			typ := first
    22  			decoder := firstDec
    23  			for {
    24  				if err := decoder.DecodeFromBytes(data, df); err != nil {
    25  					return LayerTypeZero, err
    26  				}
    27  				*decoded = append(*decoded, typ)
    28  				typ = decoder.NextLayerType()
    29  				if data = decoder.LayerPayload(); len(data) == 0 {
    30  					break
    31  				}
    32  				if decoder, ok = dlc.Decoder(typ); !ok {
    33  					return typ, nil
    34  				}
    35  			}
    36  			return LayerTypeZero, nil
    37  		}
    38  	}
    39  	if dlc, ok := dl.(DecodingLayerArray); ok {
    40  		return func(data []byte, decoded *[]LayerType) (LayerType, error) {
    41  			*decoded = (*decoded)[:0] // Truncated decoded layers.
    42  			typ := first
    43  			decoder := firstDec
    44  			for {
    45  				if err := decoder.DecodeFromBytes(data, df); err != nil {
    46  					return LayerTypeZero, err
    47  				}
    48  				*decoded = append(*decoded, typ)
    49  				typ = decoder.NextLayerType()
    50  				if data = decoder.LayerPayload(); len(data) == 0 {
    51  					break
    52  				}
    53  				if decoder, ok = dlc.Decoder(typ); !ok {
    54  					return typ, nil
    55  				}
    56  			}
    57  			return LayerTypeZero, nil
    58  		}
    59  	}
    60  	if dlc, ok := dl.(DecodingLayerMap); ok {
    61  		return func(data []byte, decoded *[]LayerType) (LayerType, error) {
    62  			*decoded = (*decoded)[:0] // Truncated decoded layers.
    63  			typ := first
    64  			decoder := firstDec
    65  			for {
    66  				if err := decoder.DecodeFromBytes(data, df); err != nil {
    67  					return LayerTypeZero, err
    68  				}
    69  				*decoded = append(*decoded, typ)
    70  				typ = decoder.NextLayerType()
    71  				if data = decoder.LayerPayload(); len(data) == 0 {
    72  					break
    73  				}
    74  				if decoder, ok = dlc.Decoder(typ); !ok {
    75  					return typ, nil
    76  				}
    77  			}
    78  			return LayerTypeZero, nil
    79  		}
    80  	}
    81  	dlc := dl
    82  	return func(data []byte, decoded *[]LayerType) (LayerType, error) {
    83  		*decoded = (*decoded)[:0] // Truncated decoded layers.
    84  		typ := first
    85  		decoder := firstDec
    86  		for {
    87  			if err := decoder.DecodeFromBytes(data, df); err != nil {
    88  				return LayerTypeZero, err
    89  			}
    90  			*decoded = append(*decoded, typ)
    91  			typ = decoder.NextLayerType()
    92  			if data = decoder.LayerPayload(); len(data) == 0 {
    93  				break
    94  			}
    95  			if decoder, ok = dlc.Decoder(typ); !ok {
    96  				return typ, nil
    97  			}
    98  		}
    99  		return LayerTypeZero, nil
   100  	}
   101  }