/src/PcapPlusPlus/Packet++/src/LLCLayer.cpp
Line | Count | Source |
1 | | #define LOG_MODULE PacketLogModuleLLCLayer |
2 | | |
3 | | #include "LLCLayer.h" |
4 | | #include "PayloadLayer.h" |
5 | | #include "StpLayer.h" |
6 | | |
7 | | #include <cstring> |
8 | | |
9 | | namespace pcpp |
10 | | { |
11 | | |
12 | | LLCLayer::LLCLayer(uint8_t dsap, uint8_t ssap, uint8_t control) |
13 | 0 | { |
14 | 0 | allocData(sizeof(llc_header)); |
15 | 0 | m_Protocol = LLC; |
16 | | |
17 | | // Set values |
18 | 0 | llc_header* header = getLlcHeader(); |
19 | 0 | header->dsap = dsap; |
20 | 0 | header->ssap = ssap; |
21 | 0 | header->control = control; |
22 | 0 | } |
23 | | |
24 | | void LLCLayer::parseNextLayer() |
25 | 0 | { |
26 | 0 | if (m_DataLen <= sizeof(llc_header)) |
27 | 0 | return; |
28 | | |
29 | 0 | llc_header* hdr = getLlcHeader(); |
30 | 0 | uint8_t* payload = m_Data + sizeof(llc_header); |
31 | 0 | size_t payloadLen = m_DataLen - sizeof(llc_header); |
32 | |
|
33 | 0 | if (hdr->dsap == 0x42 && hdr->ssap == 0x42 && StpLayer::isDataValid(payload, payloadLen)) |
34 | 0 | { |
35 | 0 | constructNextLayerFromFactory(StpLayer::parseStpLayer, payload, payloadLen); |
36 | 0 | } |
37 | |
|
38 | 0 | if (!hasNextLayer()) |
39 | 0 | { |
40 | 0 | constructNextLayer<PayloadLayer>(payload, payloadLen); |
41 | 0 | } |
42 | 0 | } |
43 | | |
44 | | std::string LLCLayer::toString() const |
45 | 0 | { |
46 | 0 | return "Logical Link Control"; |
47 | 0 | } |
48 | | |
49 | | bool LLCLayer::isDataValid(const uint8_t* data, size_t dataLen) |
50 | 0 | { |
51 | 0 | return dataLen >= sizeof(llc_header) && !(data[0] == 0xFF && data[1] == 0xFF); |
52 | 0 | } |
53 | | |
54 | | const FieldDescriptor LLCLayer::SerializedFields::DSAP{ Layer::SerializedFields::MaxID + 1, "dsap" }; |
55 | | const FieldDescriptor LLCLayer::SerializedFields::SSAP{ Layer::SerializedFields::MaxID + 2, "ssap" }; |
56 | | const FieldDescriptor LLCLayer::SerializedFields::Control{ Layer::SerializedFields::MaxID + 3, "control" }; |
57 | | |
58 | | void LLCLayer::serializeLayer(ObjectScope& serializer) const |
59 | 0 | { |
60 | 0 | auto* header = getLlcHeader(); |
61 | 0 | serializer.writeField(SerializedFields::DSAP, header->dsap); |
62 | 0 | serializer.writeField(SerializedFields::SSAP, header->ssap); |
63 | 0 | serializer.writeField(SerializedFields::Control, header->control); |
64 | 0 | } |
65 | | } // namespace pcpp |