/src/PcapPlusPlus/Packet++/src/NullLoopbackLayer.cpp
Line | Count | Source |
1 | | #include "NullLoopbackLayer.h" |
2 | | #include "EthLayer.h" |
3 | | #include "IPv4Layer.h" |
4 | | #include "IPv6Layer.h" |
5 | | #include "PayloadLayer.h" |
6 | | |
7 | | namespace pcpp |
8 | | { |
9 | | |
10 | 0 | #define BSWAP16(x) (((x) >> 8) | ((x) << 8)) |
11 | 0 | #define BSWAP32(x) (((x) >> 24) | (((x) & 0x00FF'0000) >> 8) | (((x) & 0x0000'FF00) << 8) | ((x) << 24)) |
12 | | |
13 | 0 | #define IEEE_802_3_MAX_LEN 0x5dc |
14 | | |
15 | | NullLoopbackLayer::NullLoopbackLayer(uint32_t family) |
16 | 0 | { |
17 | 0 | const size_t dataLen = sizeof(uint32_t); |
18 | 0 | m_DataLen = dataLen; |
19 | 0 | m_Data = new uint8_t[dataLen]; |
20 | 0 | memset(m_Data, 0, dataLen); |
21 | 0 | m_Protocol = NULL_LOOPBACK; |
22 | |
|
23 | 0 | setFamily(family); |
24 | 0 | } |
25 | | |
26 | | uint32_t NullLoopbackLayer::getFamily() const |
27 | 0 | { |
28 | 0 | uint32_t family = *(reinterpret_cast<uint32_t*>(m_Data)); |
29 | 0 | if ((family & 0xFFFF'0000) != 0) |
30 | 0 | { |
31 | 0 | if ((family & 0xFF00'0000) == 0 && (family & 0x00FF'0000) < 0x0006'0000) |
32 | 0 | { |
33 | 0 | family >>= 16; |
34 | 0 | } |
35 | 0 | else |
36 | 0 | { |
37 | 0 | family = BSWAP32(family); |
38 | 0 | } |
39 | 0 | } |
40 | 0 | else if ((family & 0x0000'00FF) == 0 && (family & 0x0000'FF00) < 0x0000'0600) |
41 | 0 | { |
42 | 0 | family = BSWAP16(family & 0xFFFF); |
43 | 0 | } |
44 | |
|
45 | 0 | return family; |
46 | 0 | } |
47 | | |
48 | | void NullLoopbackLayer::setFamily(uint32_t family) |
49 | 0 | { |
50 | 0 | *m_Data = family; |
51 | 0 | } |
52 | | |
53 | | void NullLoopbackLayer::parseNextLayer() |
54 | 0 | { |
55 | 0 | uint8_t* payload = m_Data + sizeof(uint32_t); |
56 | 0 | size_t payloadLen = m_DataLen - sizeof(uint32_t); |
57 | |
|
58 | 0 | uint32_t family = getFamily(); |
59 | 0 | if (family > IEEE_802_3_MAX_LEN) |
60 | 0 | { |
61 | 0 | uint16_t ethType = static_cast<uint16_t>(family); |
62 | 0 | switch (ethType) |
63 | 0 | { |
64 | 0 | case PCPP_ETHERTYPE_IP: |
65 | 0 | m_NextLayer = IPv4Layer::isDataValid(payload, payloadLen) |
66 | 0 | ? static_cast<Layer*>(new IPv4Layer(payload, payloadLen, this, m_Packet)) |
67 | 0 | : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet)); |
68 | 0 | return; |
69 | 0 | case PCPP_ETHERTYPE_IPV6: |
70 | 0 | m_NextLayer = IPv6Layer::isDataValid(payload, payloadLen) |
71 | 0 | ? static_cast<Layer*>(new IPv6Layer(payload, payloadLen, this, m_Packet)) |
72 | 0 | : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet)); |
73 | 0 | return; |
74 | 0 | default: |
75 | 0 | m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); |
76 | 0 | return; |
77 | 0 | } |
78 | 0 | } |
79 | | |
80 | 0 | switch (family) |
81 | 0 | { |
82 | 0 | case PCPP_BSD_AF_INET: |
83 | 0 | m_NextLayer = IPv4Layer::isDataValid(payload, payloadLen) |
84 | 0 | ? static_cast<Layer*>(new IPv4Layer(payload, payloadLen, this, m_Packet)) |
85 | 0 | : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet)); |
86 | 0 | break; |
87 | 0 | case PCPP_BSD_AF_INET6_BSD: |
88 | 0 | case PCPP_BSD_AF_INET6_FREEBSD: |
89 | 0 | case PCPP_BSD_AF_INET6_DARWIN: |
90 | 0 | m_NextLayer = IPv6Layer::isDataValid(payload, payloadLen) |
91 | 0 | ? static_cast<Layer*>(new IPv6Layer(payload, payloadLen, this, m_Packet)) |
92 | 0 | : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet)); |
93 | 0 | break; |
94 | 0 | default: |
95 | 0 | m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); |
96 | 0 | } |
97 | 0 | } |
98 | | |
99 | | std::string NullLoopbackLayer::toString() const |
100 | 0 | { |
101 | 0 | return "Null/Loopback"; |
102 | 0 | } |
103 | | |
104 | | } // namespace pcpp |