/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 | m_DataLen = sizeof(llc_header); |
15 | 0 | m_Data = new uint8_t[sizeof(llc_header)]; |
16 | 0 | memset(m_Data, 0, sizeof(llc_header)); |
17 | |
|
18 | 0 | m_Protocol = LLC; |
19 | | |
20 | | // Set values |
21 | 0 | llc_header* header = getLlcHeader(); |
22 | 0 | header->dsap = dsap; |
23 | 0 | header->ssap = ssap; |
24 | 0 | header->control = control; |
25 | 0 | } |
26 | | |
27 | | void LLCLayer::parseNextLayer() |
28 | 16.4k | { |
29 | 16.4k | if (m_DataLen <= sizeof(llc_header)) |
30 | 26 | return; |
31 | | |
32 | 16.4k | llc_header* hdr = getLlcHeader(); |
33 | 16.4k | uint8_t* payload = m_Data + sizeof(llc_header); |
34 | 16.4k | size_t payloadLen = m_DataLen - sizeof(llc_header); |
35 | | |
36 | 16.4k | if (hdr->dsap == 0x42 && hdr->ssap == 0x42 && StpLayer::isDataValid(payload, payloadLen)) |
37 | 7.79k | { |
38 | 7.79k | constructNextLayerFromFactory(StpLayer::parseStpLayer, payload, payloadLen); |
39 | 7.79k | } |
40 | | |
41 | 16.4k | if (!hasNextLayer()) |
42 | 9.06k | { |
43 | 9.06k | constructNextLayer<PayloadLayer>(payload, payloadLen); |
44 | 9.06k | } |
45 | 16.4k | } |
46 | | |
47 | | std::string LLCLayer::toString() const |
48 | 6.46k | { |
49 | 6.46k | return "Logical Link Control"; |
50 | 6.46k | } |
51 | | |
52 | | bool LLCLayer::isDataValid(const uint8_t* data, size_t dataLen) |
53 | 16.5k | { |
54 | 16.5k | return dataLen >= sizeof(llc_header) && !(data[0] == 0xFF && data[1] == 0xFF); |
55 | 16.5k | } |
56 | | |
57 | | } // namespace pcpp |