12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package layers
- import (
- "encoding/binary"
- "fmt"
- "github.com/google/gopacket"
- )
- type VXLAN struct {
- BaseLayer
- ValidIDFlag bool
- VNI uint32
- GBPExtension bool
- GBPDontLearn bool
- GBPApplied bool
- GBPGroupPolicyID uint16
- }
- func (vx *VXLAN) LayerType() gopacket.LayerType { return LayerTypeVXLAN }
- func decodeVXLAN(data []byte, p gopacket.PacketBuilder) error {
- vx := &VXLAN{}
-
- var buf [4]byte
- copy(buf[1:], data[4:7])
-
- vx.ValidIDFlag = data[0]&0x08 > 0
- vx.VNI = binary.BigEndian.Uint32(buf[:])
-
- vx.GBPExtension = data[0]&0x80 > 0
- vx.GBPDontLearn = data[1]&0x40 > 0
- vx.GBPApplied = data[1]&0x80 > 0
- vx.GBPGroupPolicyID = binary.BigEndian.Uint16(data[2:4])
-
- const vxlanLength = 8
- vx.Contents = data[:vxlanLength]
- vx.Payload = data[vxlanLength:]
- p.AddLayer(vx)
- return p.NextDecoder(LinkTypeEthernet)
- }
- func (vx *VXLAN) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- bytes, err := b.PrependBytes(8)
- if err != nil {
- return err
- }
- if vx.ValidIDFlag {
- bytes[0] |= 0x08
- }
- if vx.GBPExtension {
- bytes[0] |= 0x80
- }
- if vx.GBPDontLearn {
- bytes[1] |= 0x40
- }
- if vx.GBPApplied {
- bytes[1] |= 0x80
- }
- binary.BigEndian.PutUint16(bytes[2:4], vx.GBPGroupPolicyID)
- if vx.VNI >= 1<<24 {
- return fmt.Errorf("Virtual Network Identifier = %x exceeds max for 24-bit uint", vx.VNI)
- }
- binary.BigEndian.PutUint32(bytes[4:8], vx.VNI<<8)
- return nil
- }
|