summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go')
-rw-r--r--src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go160
1 files changed, 138 insertions, 22 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go
index 0e15c878a9b..2f2e4a52d01 100644
--- a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go
+++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/github.com/google/gopacket/layers/llc.go
@@ -8,6 +8,8 @@ package layers
import (
"encoding/binary"
+ "errors"
+
"github.com/google/gopacket"
)
@@ -25,6 +27,47 @@ type LLC struct {
// LayerType returns gopacket.LayerTypeLLC.
func (l *LLC) LayerType() gopacket.LayerType { return LayerTypeLLC }
+// DecodeFromBytes decodes the given bytes into this layer.
+func (l *LLC) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
+ if len(data) < 3 {
+ return errors.New("LLC header too small")
+ }
+ l.DSAP = data[0] & 0xFE
+ l.IG = data[0]&0x1 != 0
+ l.SSAP = data[1] & 0xFE
+ l.CR = data[1]&0x1 != 0
+ l.Control = uint16(data[2])
+
+ if l.Control&0x1 == 0 || l.Control&0x3 == 0x1 {
+ if len(data) < 4 {
+ return errors.New("LLC header too small")
+ }
+ l.Control = l.Control<<8 | uint16(data[3])
+ l.Contents = data[:4]
+ l.Payload = data[4:]
+ } else {
+ l.Contents = data[:3]
+ l.Payload = data[3:]
+ }
+ return nil
+}
+
+// CanDecode returns the set of layer types that this DecodingLayer can decode.
+func (l *LLC) CanDecode() gopacket.LayerClass {
+ return LayerTypeLLC
+}
+
+// NextLayerType returns the layer type contained by this DecodingLayer.
+func (l *LLC) NextLayerType() gopacket.LayerType {
+ switch {
+ case l.DSAP == 0xAA && l.SSAP == 0xAA:
+ return LayerTypeSNAP
+ case l.DSAP == 0x42 && l.SSAP == 0x42:
+ return LayerTypeSTP
+ }
+ return gopacket.LayerTypeZero // Not implemented
+}
+
// SNAP is used inside LLC. See
// http://standards.ieee.org/getieee802/download/802-2001.pdf.
// From http://en.wikipedia.org/wiki/Subnetwork_Access_Protocol:
@@ -40,34 +83,43 @@ type SNAP struct {
// LayerType returns gopacket.LayerTypeSNAP.
func (s *SNAP) LayerType() gopacket.LayerType { return LayerTypeSNAP }
-func decodeLLC(data []byte, p gopacket.PacketBuilder) error {
- l := &LLC{
- DSAP: data[0] & 0xFE,
- IG: data[0]&0x1 != 0,
- SSAP: data[1] & 0xFE,
- CR: data[1]&0x1 != 0,
- Control: uint16(data[2]),
+// DecodeFromBytes decodes the given bytes into this layer.
+func (s *SNAP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
+ if len(data) < 5 {
+ return errors.New("SNAP header too small")
}
- if l.Control&0x1 == 0 || l.Control&0x3 == 0x1 {
- l.Control = l.Control<<8 | uint16(data[3])
- l.Contents = data[:4]
- l.Payload = data[4:]
- } else {
- l.Contents = data[:3]
- l.Payload = data[3:]
+ s.OrganizationalCode = data[:3]
+ s.Type = EthernetType(binary.BigEndian.Uint16(data[3:5]))
+ s.BaseLayer = BaseLayer{data[:5], data[5:]}
+ return nil
+}
+
+// CanDecode returns the set of layer types that this DecodingLayer can decode.
+func (s *SNAP) CanDecode() gopacket.LayerClass {
+ return LayerTypeLLC
+}
+
+// NextLayerType returns the layer type contained by this DecodingLayer.
+func (s *SNAP) NextLayerType() gopacket.LayerType {
+ // See BUG(gconnel) in decodeSNAP
+ return s.Type.LayerType()
+}
+
+func decodeLLC(data []byte, p gopacket.PacketBuilder) error {
+ l := &LLC{}
+ err := l.DecodeFromBytes(data, p)
+ if err != nil {
+ return err
}
p.AddLayer(l)
- if l.DSAP == 0xAA && l.SSAP == 0xAA {
- return p.NextDecoder(LayerTypeSNAP)
- }
- return p.NextDecoder(gopacket.DecodeUnknown)
+ return p.NextDecoder(l.NextLayerType())
}
func decodeSNAP(data []byte, p gopacket.PacketBuilder) error {
- s := &SNAP{
- OrganizationalCode: data[:3],
- Type: EthernetType(binary.BigEndian.Uint16(data[3:5])),
- BaseLayer: BaseLayer{data[:5], data[5:]},
+ s := &SNAP{}
+ err := s.DecodeFromBytes(data, p)
+ if err != nil {
+ return err
}
p.AddLayer(s)
// BUG(gconnell): When decoding SNAP, we treat the SNAP type as an Ethernet
@@ -75,3 +127,67 @@ func decodeSNAP(data []byte, p gopacket.PacketBuilder) error {
// depending on the organizational code. Right now, we don't check.
return p.NextDecoder(s.Type)
}
+
+// SerializeTo writes the serialized form of this layer into the
+// SerializationBuffer, implementing gopacket.SerializableLayer.
+// See the docs for gopacket.SerializableLayer for more info.
+func (l *LLC) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
+ var igFlag, crFlag byte
+ var length int
+
+ if l.Control&0xFF00 != 0 {
+ length = 4
+ } else {
+ length = 3
+ }
+
+ if l.DSAP&0x1 != 0 {
+ return errors.New("DSAP value invalid, should not include IG flag bit")
+ }
+
+ if l.SSAP&0x1 != 0 {
+ return errors.New("SSAP value invalid, should not include CR flag bit")
+ }
+
+ if buf, err := b.PrependBytes(length); err != nil {
+ return err
+ } else {
+ igFlag = 0
+ if l.IG {
+ igFlag = 0x1
+ }
+
+ crFlag = 0
+ if l.CR {
+ crFlag = 0x1
+ }
+
+ buf[0] = l.DSAP + igFlag
+ buf[1] = l.SSAP + crFlag
+
+ if length == 4 {
+ buf[2] = uint8(l.Control >> 8)
+ buf[3] = uint8(l.Control)
+ } else {
+ buf[2] = uint8(l.Control)
+ }
+ }
+
+ return nil
+}
+
+// SerializeTo writes the serialized form of this layer into the
+// SerializationBuffer, implementing gopacket.SerializableLayer.
+// See the docs for gopacket.SerializableLayer for more info.
+func (s *SNAP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
+ if buf, err := b.PrependBytes(5); err != nil {
+ return err
+ } else {
+ buf[0] = s.OrganizationalCode[0]
+ buf[1] = s.OrganizationalCode[1]
+ buf[2] = s.OrganizationalCode[2]
+ binary.BigEndian.PutUint16(buf[3:5], uint16(s.Type))
+ }
+
+ return nil
+}