geneve.go 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright 2016 Google, Inc. All rights reserved.
  2. //
  3. // Use of this source code is governed by a BSD-style license
  4. // that can be found in the LICENSE file in the root of the source
  5. // tree.
  6. package layers
  7. import (
  8. "encoding/binary"
  9. "github.com/google/gopacket"
  10. )
  11. // Geneve is specifed here https://tools.ietf.org/html/draft-ietf-nvo3-geneve-03
  12. // Geneve Header:
  13. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. // |Ver| Opt Len |O|C| Rsvd. | Protocol Type |
  15. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16. // | Virtual Network Identifier (VNI) | Reserved |
  17. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  18. // | Variable Length Options |
  19. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  20. type Geneve struct {
  21. BaseLayer
  22. Version uint8 // 2 bits
  23. OptionsLength uint8 // 6 bits
  24. OAMPacket bool // 1 bits
  25. CriticalOption bool // 1 bits
  26. Protocol EthernetType // 16 bits
  27. VNI uint32 // 24bits
  28. Options []*GeneveOption
  29. }
  30. // Geneve Tunnel Options
  31. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  32. // | Option Class | Type |R|R|R| Length |
  33. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  34. // | Variable Option Data |
  35. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  36. type GeneveOption struct {
  37. Class uint16 // 16 bits
  38. Type uint8 // 8 bits
  39. Flags uint8 // 3 bits
  40. Length uint8 // 5 bits
  41. Data []byte
  42. }
  43. // LayerType returns LayerTypeGeneve
  44. func (gn *Geneve) LayerType() gopacket.LayerType { return LayerTypeGeneve }
  45. func decodeGeneveOption(data []byte, gn *Geneve) (*GeneveOption, uint8) {
  46. opt := &GeneveOption{}
  47. opt.Class = binary.BigEndian.Uint16(data[0:1])
  48. opt.Type = data[2]
  49. opt.Flags = data[3] >> 4
  50. opt.Length = data[3] & 0xf
  51. copy(opt.Data, data[4:opt.Length])
  52. return opt, 4 + opt.Length
  53. }
  54. func (gn *Geneve) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
  55. gn.Version = data[0] >> 7
  56. gn.OptionsLength = data[0] & 0x3f
  57. gn.OAMPacket = data[1]&0x80 > 0
  58. gn.CriticalOption = data[1]&0x40 > 0
  59. gn.Protocol = EthernetType(binary.BigEndian.Uint16(data[2:4]))
  60. var buf [4]byte
  61. copy(buf[1:], data[4:7])
  62. gn.VNI = binary.BigEndian.Uint32(buf[:])
  63. offset, length := uint8(8), gn.OptionsLength
  64. for length > 0 {
  65. opt, len := decodeGeneveOption(data[offset:], gn)
  66. gn.Options = append(gn.Options, opt)
  67. length -= len
  68. offset += len
  69. }
  70. gn.BaseLayer = BaseLayer{data[:offset], data[offset:]}
  71. return nil
  72. }
  73. func (gn *Geneve) NextLayerType() gopacket.LayerType {
  74. return gn.Protocol.LayerType()
  75. }
  76. func decodeGeneve(data []byte, p gopacket.PacketBuilder) error {
  77. gn := &Geneve{}
  78. return decodingLayerDecoder(gn, data, p)
  79. }