diff options
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/loopback.go')
-rw-r--r-- | src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/loopback.go | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/loopback.go b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/loopback.go index 284f34bbc8c..839f760739b 100644 --- a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/loopback.go +++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/loopback.go @@ -8,7 +8,9 @@ package layers import ( "encoding/binary" + "errors" "fmt" + "github.com/google/gopacket" ) @@ -23,7 +25,12 @@ type Loopback struct { // LayerType returns LayerTypeLoopback. func (l *Loopback) LayerType() gopacket.LayerType { return LayerTypeLoopback } -func decodeLoopback(data []byte, p gopacket.PacketBuilder) error { +// DecodeFromBytes decodes the given bytes into this layer. +func (l *Loopback) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 4 { + return errors.New("Loopback packet too small") + } + // The protocol could be either big-endian or little-endian, we're // not sure. But we're PRETTY sure that the value is less than // 256, so we can check the first two bytes. @@ -36,10 +43,38 @@ func decodeLoopback(data []byte, p gopacket.PacketBuilder) error { if prot > 0xFF { return fmt.Errorf("Invalid loopback protocol %q", data[:4]) } - l := &Loopback{ - BaseLayer: BaseLayer{data[:4], data[4:]}, - Family: ProtocolFamily(prot), + + l.Family = ProtocolFamily(prot) + l.BaseLayer = BaseLayer{data[:4], data[4:]} + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (l *Loopback) CanDecode() gopacket.LayerClass { + return LayerTypeLoopback +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (l *Loopback) NextLayerType() gopacket.LayerType { + return l.Family.LayerType() +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +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) + p.AddLayer(&l) return p.NextDecoder(l.Family) } |