/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 | allocData(sizeof(sll_header)); |
20 | |
|
21 | 0 | auto* sllHdr = reinterpret_cast<sll_header*>(m_Data); |
22 | 0 | sllHdr->packet_type = htobe16(packetType); |
23 | 0 | sllHdr->ARPHRD_type = htobe16(ARPHRDType); |
24 | 0 | m_Protocol = SLL; |
25 | 0 | } |
26 | | |
27 | | bool SllLayer::setLinkLayerAddr(uint8_t* addr, size_t addrLength) |
28 | 0 | { |
29 | 0 | if (addr == nullptr || addrLength == 0 || addrLength > 8) |
30 | 0 | { |
31 | 0 | PCPP_LOG_ERROR("Address length is out of bounds, it must be between 1 and 8"); |
32 | 0 | return false; |
33 | 0 | } |
34 | | |
35 | 0 | sll_header* sllHdr = getSllHeader(); |
36 | 0 | memcpy(sllHdr->link_layer_addr, addr, addrLength); |
37 | 0 | sllHdr->link_layer_addr_len = htobe16(addrLength); |
38 | |
|
39 | 0 | return true; |
40 | 0 | } |
41 | | |
42 | | bool SllLayer::setMacAddressAsLinkLayer(MacAddress const& macAddr) |
43 | 0 | { |
44 | 0 | uint8_t macAddrAsArr[6]; |
45 | 0 | macAddr.copyTo(macAddrAsArr); |
46 | 0 | return setLinkLayerAddr(macAddrAsArr, 6); |
47 | 0 | } |
48 | | |
49 | | void SllLayer::parseNextLayer() |
50 | 134k | { |
51 | 134k | if (m_DataLen <= sizeof(sll_header)) |
52 | 256 | return; |
53 | | |
54 | 134k | uint8_t* payload = m_Data + sizeof(sll_header); |
55 | 134k | size_t payloadLen = m_DataLen - sizeof(sll_header); |
56 | | |
57 | 134k | sll_header* hdr = getSllHeader(); |
58 | 134k | switch (be16toh(hdr->protocol_type)) |
59 | 134k | { |
60 | 51.6k | case PCPP_ETHERTYPE_IP: |
61 | 51.6k | { |
62 | 51.6k | tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen); |
63 | 51.6k | break; |
64 | 0 | } |
65 | 77.2k | case PCPP_ETHERTYPE_IPV6: |
66 | 77.2k | { |
67 | 77.2k | tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen); |
68 | 77.2k | break; |
69 | 0 | } |
70 | 0 | case PCPP_ETHERTYPE_ARP: |
71 | 0 | { |
72 | 0 | constructNextLayer<ArpLayer>(payload, payloadLen); |
73 | 0 | break; |
74 | 0 | } |
75 | 3.15k | case PCPP_ETHERTYPE_VLAN: |
76 | 3.15k | case PCPP_ETHERTYPE_IEEE_802_1AD: |
77 | 3.15k | { |
78 | 3.15k | constructNextLayer<VlanLayer>(payload, payloadLen); |
79 | 3.15k | break; |
80 | 3.15k | } |
81 | 0 | case PCPP_ETHERTYPE_PPPOES: |
82 | 0 | { |
83 | 0 | tryConstructNextLayerWithFallback<PPPoESessionLayer, PayloadLayer>(payload, payloadLen); |
84 | 0 | break; |
85 | 3.15k | } |
86 | 0 | case PCPP_ETHERTYPE_PPPOED: |
87 | 0 | { |
88 | 0 | tryConstructNextLayerWithFallback<PPPoEDiscoveryLayer, PayloadLayer>(payload, payloadLen); |
89 | 0 | break; |
90 | 3.15k | } |
91 | 0 | case PCPP_ETHERTYPE_MPLS: |
92 | 0 | { |
93 | 0 | constructNextLayer<MplsLayer>(payload, payloadLen); |
94 | 0 | break; |
95 | 3.15k | } |
96 | 2.27k | default: |
97 | 2.27k | { |
98 | 2.27k | constructNextLayer<PayloadLayer>(payload, payloadLen); |
99 | 2.27k | break; |
100 | 3.15k | } |
101 | 134k | } |
102 | 134k | } |
103 | | |
104 | | void SllLayer::computeCalculateFields() |
105 | 22.3k | { |
106 | 22.3k | if (m_NextLayer == nullptr) |
107 | 128 | return; |
108 | | |
109 | 22.2k | sll_header* hdr = getSllHeader(); |
110 | 22.2k | switch (m_NextLayer->getProtocol()) |
111 | 22.2k | { |
112 | 7.42k | case IPv4: |
113 | 7.42k | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IP); |
114 | 7.42k | break; |
115 | 13.4k | case IPv6: |
116 | 13.4k | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_IPV6); |
117 | 13.4k | break; |
118 | 0 | case ARP: |
119 | 0 | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_ARP); |
120 | 0 | break; |
121 | 567 | case VLAN: |
122 | 567 | hdr->protocol_type = htobe16(PCPP_ETHERTYPE_VLAN); |
123 | 567 | break; |
124 | 763 | default: |
125 | 763 | return; |
126 | 22.2k | } |
127 | 22.2k | } |
128 | | |
129 | | std::string SllLayer::toString() const |
130 | 44.7k | { |
131 | 44.7k | return "Linux cooked header"; |
132 | 44.7k | } |
133 | | |
134 | | } // namespace pcpp |