1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package layers
- import (
- "encoding/binary"
- "errors"
- "fmt"
- "github.com/google/gopacket"
- )
- type Loopback struct {
- BaseLayer
- Family ProtocolFamily
- }
- func (l *Loopback) LayerType() gopacket.LayerType { return LayerTypeLoopback }
- func (l *Loopback) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
- if len(data) < 4 {
- return errors.New("Loopback packet too small")
- }
-
-
-
- var prot uint32
- if data[0] == 0 && data[1] == 0 {
- prot = binary.BigEndian.Uint32(data[:4])
- } else {
- prot = binary.LittleEndian.Uint32(data[:4])
- }
- if prot > 0xFF {
- return fmt.Errorf("Invalid loopback protocol %q", data[:4])
- }
- l.Family = ProtocolFamily(prot)
- l.BaseLayer = BaseLayer{data[:4], data[4:]}
- return nil
- }
- func (l *Loopback) CanDecode() gopacket.LayerClass {
- return LayerTypeLoopback
- }
- func (l *Loopback) NextLayerType() gopacket.LayerType {
- return l.Family.LayerType()
- }
- func (l *Loopback) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- bytes, err := b.PrependBytes(4)
- if err != nil {
- return err
- }
- binary.LittleEndian.PutUint32(bytes, uint32(l.Family))
- return nil
- }
- func decodeLoopback(data []byte, p gopacket.PacketBuilder) error {
- l := Loopback{}
- if err := l.DecodeFromBytes(data, gopacket.NilDecodeFeedback); err != nil {
- return err
- }
- p.AddLayer(&l)
- return p.NextDecoder(l.Family)
- }
|