/src/PcapPlusPlus/Packet++/src/SllLayer.cpp
Line | Count | Source |
1 | 0 | #define LOG_MODULE PacketLogModuleSllLayer |
2 | | |
3 | | #include "SllLayer.h" |
4 | | #include "Logger.h" |
5 | | #include "IPv4Layer.h" |
6 | | #include "IPv6Layer.h" |
7 | | #include "PayloadLayer.h" |
8 | | #include "ArpLayer.h" |
9 | | #include "VlanLayer.h" |
10 | | #include "PPPoELayer.h" |
11 | | #include "MplsLayer.h" |
12 | | #include "EndianPortable.h" |
13 | | |
14 | | namespace pcpp |
15 | | { |
16 | | |
17 | | SllLayer::SllLayer(uint16_t packetType, uint16_t ARPHRDType) |
18 | 0 | { |
19 | 0 | const size_t headerLen = sizeof(sll_header); |
20 | 0 | m_DataLen = headerLen; |
21 | 0 | m_Data = new uint8_t[headerLen]; |
22 | 0 | memset(m_Data, 0, headerLen); |
23 | 0 | auto* sllHdr = reinterpret_cast<sll_header*>(m_Data); |
24 | 0 | sllHdr->packet_type = htobe16(packetType); |
25 | 0 | sllHdr->ARPHRD_type = htobe16(ARPHRDType); |
26 | 0 | m_Protocol = SLL; |
27 | 0 | } |
28 | | |
29 | | bool SllLayer::setLinkLayerAddr(uint8_t* addr, size_t addrLength) |
30 | 0 | { |
31 | 0 | if (addr == nullptr || addrLength == 0 || addrLength > 8) |
32 | 0 | { |
33 | 0 | PCPP_LOG_ERROR("Address length is out of bounds, it must be between 1 and 8"); |
34 | 0 | return false; |
35 | 0 | } |
36 | | |
37 | 0 | sll_header* sllHdr = getSllHeader(); |
38 | 0 | memcpy(sllHdr->link_layer_addr, addr, addrLength); |
39 | 0 | sllHdr->link_layer_addr_len = htobe16(addrLength); |
40 | |
|
41 | 0 | return true; |
42 | 0 | } |
43 | | |
44 | | bool SllLayer::setMacAddressAsLinkLayer(MacAddress const& macAddr) |
45 | 0 | { |
46 | 0 | uint8_t macAddrAsArr[6]; |
47 | 0 | macAddr.copyTo(macAddrAsArr); |
48 | 0 | return setLinkLayerAddr(macAddrAsArr, 6); |
49 | 0 | } |
50 | | |
51 | | void SllLayer::parseNextLayer() |
52 | 148k | { |
53 | 148k | if (m_DataLen <= sizeof(sll_header)) |
54 | 640 | return; |
55 | | |
56 | 148k | uint8_t* payload = m_Data + sizeof(sll_header); |
57 | 148k | size_t payloadLen = m_DataLen - sizeof(sll_header); |
58 | | |
59 | 148k | sll_header* hdr = getSllHeader(); |
60 | 148k | switch (be16toh(hdr->protocol_type)) |
61 | 148k | { |
62 | 70.8k | case PCPP_ETHERTYPE_IP: |
63 | 70.8k | { |
64 | 70.8k | tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen); |
65 | 70.8k | break; |
66 | 0 | } |
67 | 67.1k | case PCPP_ETHERTYPE_IPV6: |
68 | 67.1k | { |
69 | 67.1k | tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen); |
70 | 67.1k | break; |
71 | 0 | } |
72 | 2.16k | case PCPP_ETHERTYPE_ARP: |
73 | 2.16k | { |
74 | 2.16k | constructNextLayer<ArpLayer>(payload, payloadLen); |
75 | 2.16k | break; |
76 | 0 | } |
77 | 2.04k | case PCPP_ETHERTYPE_VLAN: |
78 | 2.05k | case PCPP_ETHERTYPE_IEEE_802_1AD: |
79 | 2.05k | { |
80 | 2.05k | constructNextLayer<VlanLayer>(payload, payloadLen); |
81 | 2.05k | break; |
82 | 2.04k | } |
83 | 7 | case PCPP_ETHERTYPE_PPPOES: |
84 | 7 | { |
85 | 7 | tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen); |
86 | 7 | break; |
87 | 2.04k | } |
88 | 7 | case PCPP_ETHERTYPE_PPPOED: |
89 | 7 | { |
90 | 7 | tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen); |
91 | 7 | break; |
92 | 2.04k | } |
93 | 1.17k | case PCPP_ETHERTYPE_MPLS: |
94 | 1.17k | { |
95 | 1.17k | constructNextLayer<MplsLayer>(payload, payloadLen); |
96 | 1.17k | break; |
97 | 2.04k | } |
98 | 4.86k | default: |
99 | 4.86k | { |
100 | 4.86k | constructNextLayer<PayloadLayer>(payload, payloadLen); |
101 | 4.86k | break; |
102 | 2.04k | } |
103 | 148k | } |
104 | 148k | } |
105 | | |
106 | | void SllLayer::computeCalculateFields() |
107 | 26.2k | { |
108 | 26.2k | if (m_NextLayer == nullptr) |
109 | 320 | return; |
110 | | |
111 | 25.9k | sll_header* hdr = getSllHeader(); |
112 | 25.9k | switch (m_NextLayer->getProtocol()) |
113 | 25.9k | { |
114 | 11.3k | case IPv4: |
115 | 11.3k | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP); |
116 | 11.3k | break; |
117 | 11.8k | case IPv6: |
118 | 11.8k | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6); |
119 | 11.8k | break; |
120 | 597 | case ARP: |
121 | 597 | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP); |
122 | 597 | break; |
123 | 261 | case VLAN: |
124 | 261 | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN); |
125 | 261 | break; |
126 | 1.97k | default: |
127 | 1.97k | return; |
128 | 25.9k | } |
129 | 25.9k | } |
130 | | |
131 | | std::string SllLayer::toString() const |
132 | 52.5k | { |
133 | 52.5k | return "Linux cooked header"; |
134 | 52.5k | } |
135 | | |
136 | | } // namespace pcpp |