23 struct geneve_option_header
27 #if (BYTE_ORDER == LITTLE_ENDIAN)
36 static_assert(
sizeof(geneve_option_header) == 4,
"geneve_option_header size is not 4 bytes");
38 static constexpr
size_t HeaderLength =
sizeof(geneve_option_header);
39 static constexpr
size_t DataLengthUnit = 4;
40 static constexpr
size_t MaxDataLength = ((1 << 5) - 1) * DataLengthUnit;
41 static constexpr uint8_t TypeMask = 0x7f;
42 static constexpr uint8_t CriticalBitMask = 0x80;
44 geneve_option_header* m_Data;
47 explicit GeneveOption(uint8_t* optionData) : m_Data(
reinterpret_cast<geneve_option_header*
>(optionData))
50 static bool canAssign(
const uint8_t* optionRawData,
size_t optionDataLen);
51 void setOptionClass(uint16_t value);
52 void setType(uint8_t value,
bool critical);
53 void setDataSize(
size_t value);
55 static uint8_t extractType(uint8_t value)
57 return static_cast<uint8_t
>(value & TypeMask);
60 static size_t alignDataSize(
size_t value)
62 constexpr
size_t AlignmentMask = DataLengthUnit - 1;
63 return (value + AlignmentMask) & ~AlignmentMask;
66 uint8_t* getRecordBasePtr()
const
68 return reinterpret_cast<uint8_t*
>(m_Data);
79 return m_Data ==
nullptr;
106 return !(*
this == other);
208 bool addOption(uint16_t optionClass, uint8_t optionType,
const uint8_t* optionData,
size_t optionDataLen,
209 bool critical =
false);
245 static std::vector<FieldDescriptor>
all()
250 std::copy(extra.begin(), extra.end(), std::back_inserter(result));
261 static std::vector<FieldDescriptor>
all()
305 #pragma pack(push, 1)
308 #if (BYTE_ORDER == LITTLE_ENDIAN)
309 uint8_t optionsLength : 6;
311 uint8_t reserved1 : 6;
312 uint8_t criticalFlag : 1;
316 uint8_t optionsLength : 6;
318 uint8_t criticalFlag : 1;
319 uint8_t reserved1 : 6;
321 uint16_t protocolType;
326 static_assert(
sizeof(geneve_header) == 8,
"geneve_header size is not 8 bytes");
328 static constexpr
size_t HeaderLength =
sizeof(geneve_header);
329 static constexpr
size_t OptionsLengthUnit = 4;
330 static constexpr
size_t MaxOptionsLength = ((1 << 6) - 1) * OptionsLengthUnit;
332 geneve_header* getGeneveHeader()
const
334 return reinterpret_cast<geneve_header*
>(m_Data);
337 void setOptionsLength(
size_t value);
339 void updateCriticalFlag();
#define PCPP_ETHERTYPE_ETHBRIDGE
Transparent Ethernet Bridging.
Definition: EthLayer.h:37
Definition: GeneveLayer.h:116
void setOamFlag(bool value)
static bool isDataValid(const uint8_t *data, size_t dataLen)
void serializeLayer(ObjectScope &serializer) const override
void computeCalculateFields() override
Update the Protocol Type and Critical flag from the following layer and options.
OsiModelLayer getOsiModelLayer() const override
Definition: GeneveLayer.h:234
size_t getHeaderLen() const override
GeneveLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: GeneveLayer.h:128
static constexpr uint16_t DefaultPort
The IANA-assigned UDP destination port for GENEVE.
Definition: GeneveLayer.h:119
size_t getOptionCount() const
GeneveLayer(uint32_t vni=0, uint16_t protocolType=0x6558, bool oamFlag=false)
void parseNextLayer() override
GeneveOption getOption(uint16_t optionClass, uint8_t optionType) const
bool removeOption(uint16_t optionClass, uint8_t optionType)
uint16_t getProtocolType() const
bool getCriticalFlag() const
void setVNI(uint32_t vni)
GeneveOption getFirstOption() const
std::string toString() const override
void setProtocolType(uint16_t protocolType)
static bool isGenevePort(uint16_t port)
Definition: GeneveLayer.h:151
size_t getOptionsLength() const
GeneveOption getNextOption(const GeneveOption &option) const
bool addOption(uint16_t optionClass, uint8_t optionType, const uint8_t *optionData, size_t optionDataLen, bool critical=false)
Definition: GeneveLayer.h:18
bool isNull() const
Definition: GeneveLayer.h:77
bool operator!=(const GeneveOption &other) const
Definition: GeneveLayer.h:104
GeneveOption()
Construct a null option view.
Definition: GeneveLayer.h:73
uint8_t * getData() const
size_t getDataSize() const
bool operator==(const GeneveOption &other) const
uint16_t getOptionClass() const
size_t getTotalSize() const
Definition: Serializers.h:230
const ProtocolType Geneve
GENEVE protocol.
Definition: ProtocolType.h:273
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:425
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:429
Definition: Serializers.h:18
Definition: GeneveLayer.h:257
static const FieldDescriptor DataSize
Option data length in bytes.
Definition: GeneveLayer.h:276
static const FieldDescriptor OptionClass
Option class in host byte order.
Definition: GeneveLayer.h:267
static std::vector< FieldDescriptor > all()
Definition: GeneveLayer.h:261
static const FieldDescriptor Critical
True if the option critical bit is set.
Definition: GeneveLayer.h:273
static const FieldDescriptor Type
Option type without the critical bit.
Definition: GeneveLayer.h:270
Definition: GeneveLayer.h:243
static std::vector< FieldDescriptor > all()
Definition: GeneveLayer.h:245
static const FieldDescriptor Options
GENEVE options.
Definition: GeneveLayer.h:295
static const FieldDescriptor VNI
The 24-bit virtual network identifier.
Definition: GeneveLayer.h:286
static const FieldDescriptor ProtocolType
Encapsulated protocol EtherType in host byte order.
Definition: GeneveLayer.h:283
static const OptionObject Option
Descriptor for one element of the options array.
Definition: GeneveLayer.h:298
static const FieldDescriptor CriticalFlag
True if the GENEVE critical options flag is set.
Definition: GeneveLayer.h:292
static const FieldDescriptor OamFlag
True if the GENEVE OAM flag is set.
Definition: GeneveLayer.h:289
static const FieldDescriptor OptionsLength
Total options length in bytes declared by the GENEVE header.
Definition: GeneveLayer.h:280
static std::vector< FieldDescriptor > all()
Definition: Layer.h:214
Definition: Serializers.h:49
ObjectFieldDescriptor(uint16_t fieldId, std::string fieldName)
Definition: Serializers.h:53