/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 | 111 | #define BSWAP16(x) (((x) >> 8) | ((x) << 8)) |
11 | 13.0k | #define BSWAP32(x) (((x) >> 24) | (((x) & 0x00FF'0000) >> 8) | (((x) & 0x0000'FF00) << 8) | ((x) << 24)) |
12 | | |
13 | 14.9k | #define IEEE_802_3_MAX_LEN 0x5dc |
14 | | |
15 | | NullLoopbackLayer::NullLoopbackLayer(uint32_t family) |
16 | 0 | { |
17 | 0 | allocData(sizeof(uint32_t)); |
18 | 0 | m_Protocol = NULL_LOOPBACK; |
19 | |
|
20 | 0 | setFamily(family); |
21 | 0 | } |
22 | | |
23 | | uint32_t NullLoopbackLayer::getFamily() const |
24 | 14.9k | { |
25 | 14.9k | uint32_t family = *(reinterpret_cast<uint32_t*>(m_Data)); |
26 | 14.9k | if ((family & 0xFFFF'0000) != 0) |
27 | 13.8k | { |
28 | 13.8k | if ((family & 0xFF00'0000) == 0 && (family & 0x00FF'0000) < 0x0006'0000) |
29 | 759 | { |
30 | 759 | family >>= 16; |
31 | 759 | } |
32 | 13.0k | else |
33 | 13.0k | { |
34 | 13.0k | family = BSWAP32(family); |
35 | 13.0k | } |
36 | 13.8k | } |
37 | 1.12k | else if ((family & 0x0000'00FF) == 0 && (family & 0x0000'FF00) < 0x0000'0600) |
38 | 111 | { |
39 | 111 | family = BSWAP16(family & 0xFFFF); |
40 | 111 | } |
41 | | |
42 | 14.9k | return family; |
43 | 14.9k | } |
44 | | |
45 | | void NullLoopbackLayer::setFamily(uint32_t family) |
46 | 0 | { |
47 | 0 | *m_Data = family; |
48 | 0 | } |
49 | | |
50 | | void NullLoopbackLayer::parseNextLayer() |
51 | 14.9k | { |
52 | 14.9k | uint8_t* payload = m_Data + sizeof(uint32_t); |
53 | 14.9k | size_t payloadLen = m_DataLen - sizeof(uint32_t); |
54 | | |
55 | 14.9k | uint32_t family = getFamily(); |
56 | 14.9k | if (family > IEEE_802_3_MAX_LEN) |
57 | 11.4k | { |
58 | 11.4k | uint16_t ethType = static_cast<uint16_t>(family); |
59 | 11.4k | switch (ethType) |
60 | 11.4k | { |
61 | 8.80k | case PCPP_ETHERTYPE_IP: |
62 | 8.80k | { |
63 | 8.80k | tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen); |
64 | 8.80k | return; |
65 | 0 | } |
66 | 0 | case PCPP_ETHERTYPE_IPV6: |
67 | 0 | { |
68 | 0 | tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen); |
69 | 0 | return; |
70 | 0 | } |
71 | 2.67k | default: |
72 | 2.67k | { |
73 | 2.67k | constructNextLayer<PayloadLayer>(payload, payloadLen); |
74 | 2.67k | return; |
75 | 0 | } |
76 | 11.4k | } |
77 | 11.4k | } |
78 | | |
79 | 3.44k | switch (family) |
80 | 3.44k | { |
81 | 289 | case PCPP_BSD_AF_INET: |
82 | 289 | { |
83 | 289 | tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen); |
84 | 289 | break; |
85 | 0 | } |
86 | 580 | case PCPP_BSD_AF_INET6_BSD: |
87 | 580 | case PCPP_BSD_AF_INET6_FREEBSD: |
88 | 2.26k | case PCPP_BSD_AF_INET6_DARWIN: |
89 | 2.26k | { |
90 | 2.26k | tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen); |
91 | 2.26k | break; |
92 | 580 | } |
93 | 900 | default: |
94 | 900 | { |
95 | 900 | constructNextLayer<PayloadLayer>(payload, payloadLen); |
96 | 900 | break; |
97 | 580 | } |
98 | 3.44k | } |
99 | 3.44k | } |
100 | | |
101 | | std::string NullLoopbackLayer::toString() const |
102 | 6.97k | { |
103 | 6.97k | return "Null/Loopback"; |
104 | 6.97k | } |
105 | | |
106 | | } // namespace pcpp |