/src/PcapPlusPlus/Packet++/src/VxlanLayer.cpp
Line | Count | Source |
1 | | #include "VxlanLayer.h" |
2 | | #include "EthLayer.h" |
3 | | #include "PayloadLayer.h" |
4 | | #include "EndianPortable.h" |
5 | | |
6 | | #include <cstring> |
7 | | |
8 | | namespace pcpp |
9 | | { |
10 | | |
11 | | VxlanLayer::VxlanLayer(uint32_t vni, uint16_t groupPolicyID, bool setGbpFlag, bool setPolicyAppliedFlag, |
12 | | bool setDontLearnFlag) |
13 | 0 | { |
14 | 0 | allocData(sizeof(vxlan_header)); |
15 | 0 | m_Protocol = VXLAN; |
16 | |
|
17 | 0 | if (vni != 0) |
18 | 0 | setVNI(vni); |
19 | |
|
20 | 0 | vxlan_header* vxlanHeader = getVxlanHeader(); |
21 | |
|
22 | 0 | if (groupPolicyID != 0) |
23 | 0 | vxlanHeader->groupPolicyID = htobe16(groupPolicyID); |
24 | |
|
25 | 0 | vxlanHeader->vniPresentFlag = 1; |
26 | |
|
27 | 0 | if (setGbpFlag) |
28 | 0 | vxlanHeader->gbpFlag = 1; |
29 | 0 | if (setPolicyAppliedFlag) |
30 | 0 | vxlanHeader->policyAppliedFlag = 1; |
31 | 0 | if (setDontLearnFlag) |
32 | 0 | vxlanHeader->dontLearnFlag = 1; |
33 | 0 | } |
34 | | |
35 | | uint32_t VxlanLayer::getVNI() const |
36 | 0 | { |
37 | 0 | return (be32toh(getVxlanHeader()->vni) >> 8); |
38 | 0 | } |
39 | | |
40 | | void VxlanLayer::setVNI(uint32_t vni) |
41 | 0 | { |
42 | 0 | getVxlanHeader()->vni = htobe32(vni << 8); |
43 | 0 | } |
44 | | |
45 | | std::string VxlanLayer::toString() const |
46 | 1.43k | { |
47 | 1.43k | return "VXLAN Layer"; |
48 | 1.43k | } |
49 | | |
50 | | void VxlanLayer::parseNextLayer() |
51 | 6.12k | { |
52 | 6.12k | if (m_DataLen <= sizeof(vxlan_header)) |
53 | 0 | return; |
54 | | |
55 | 6.12k | auto payload = m_Data + sizeof(vxlan_header); |
56 | 6.12k | auto payloadLen = m_DataLen - sizeof(vxlan_header); |
57 | 6.12k | tryConstructNextLayerWithFallback<EthLayer, PayloadLayer>(payload, payloadLen); |
58 | 6.12k | } |
59 | | |
60 | | const FieldDescriptor VxlanLayer::SerializedFields::ValidVNI{ Layer::SerializedFields::MaxID + 1, "validVNI" }; |
61 | | const FieldDescriptor VxlanLayer::SerializedFields::GroupPolicyID{ Layer::SerializedFields::MaxID + 2, |
62 | | "groupPolicyID" }; |
63 | | const FieldDescriptor VxlanLayer::SerializedFields::VNI{ Layer::SerializedFields::MaxID + 3, "vni" }; |
64 | | |
65 | | void VxlanLayer::serializeLayer(ObjectScope& serializer) const |
66 | 0 | { |
67 | 0 | auto* header = getVxlanHeader(); |
68 | 0 | serializer.writeField(SerializedFields::ValidVNI, header->vniPresentFlag ? true : false); |
69 | | serializer.writeField(SerializedFields::GroupPolicyID, be16toh(header->groupPolicyID)); |
70 | 0 | serializer.writeField(SerializedFields::VNI, getVNI()); |
71 | 0 | } |
72 | | } // namespace pcpp |