/src/PcapPlusPlus/Packet++/header/Layer.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <stdint.h> |
4 | | #include <stdio.h> |
5 | | #include "ProtocolType.h" |
6 | | #include <string> |
7 | | #include <stdexcept> |
8 | | #include <utility> |
9 | | |
10 | | /// @file |
11 | | |
12 | | /// @namespace pcpp |
13 | | /// @brief The main namespace for the PcapPlusPlus lib |
14 | | namespace pcpp |
15 | | { |
16 | | |
17 | | /// @class IDataContainer |
18 | | /// An interface (virtual abstract class) that indicates an object that holds a pointer to a buffer data. The Layer |
19 | | /// class is an example of such object, hence it inherits this interface |
20 | | class IDataContainer |
21 | | { |
22 | | public: |
23 | | /// Get a pointer to the data |
24 | | /// @param[in] offset Get a pointer in a certain offset. Default is 0 - get a pointer to start of data |
25 | | /// @return A pointer to the data |
26 | | virtual uint8_t* getDataPtr(size_t offset = 0) const = 0; |
27 | | |
28 | 3.89M | virtual ~IDataContainer() = default; |
29 | | }; |
30 | | |
31 | | class Packet; |
32 | | |
33 | | /// @class Layer |
34 | | /// Layer is the base class for all protocol layers. Each protocol supported in PcapPlusPlus has a class that |
35 | | /// inherits Layer. |
36 | | /// The protocol layer class expose all properties and methods relevant for viewing and editing protocol fields. |
37 | | /// For example: a pointer to a structured header (e.g tcphdr, iphdr, etc.), protocol header size, payload size, |
38 | | /// compute fields that can be automatically computed, print protocol data to string, etc. |
39 | | /// Each protocol instance is obviously part of a protocol stack (which construct a packet). This protocol stack is |
40 | | /// represented in PcapPlusPlus in a linked list, and each layer is an element in this list. That's why each layer |
41 | | /// has properties to the next and previous layer in the protocol stack. The Layer class, as a base class, is |
42 | | /// abstract and the user can't create an instance of it (it has a private constructor). Each layer holds a pointer |
43 | | /// to the relevant place in the packet. The layer sees all the data from this pointer forward until the end of the |
44 | | /// packet. Here is an example packet showing this concept: |
45 | | /// |
46 | | /// @code{.unparsed} |
47 | | /// ==================================================== |
48 | | /// |Eth |IPv4 |TCP |Packet | |
49 | | /// |Header |Header |Header |Payload | |
50 | | /// ==================================================== |
51 | | /// |
52 | | /// |--------------------------------------------------| |
53 | | /// EthLayer data |
54 | | /// |---------------------------------------| |
55 | | /// IPv4Layer data |
56 | | /// |---------------------------| |
57 | | /// TcpLayer data |
58 | | /// |----------------| |
59 | | /// PayloadLayer data |
60 | | /// @endcode |
61 | | class Layer : public IDataContainer |
62 | | { |
63 | | friend class Packet; |
64 | | |
65 | | public: |
66 | | /// A destructor for this class. Frees the data if it was allocated by the layer constructor (see |
67 | | /// isAllocatedToPacket() for more info) |
68 | | ~Layer() override; |
69 | | |
70 | | /// @return A pointer to the next layer in the protocol stack or nullptr if the layer is the last one |
71 | | Layer* getNextLayer() const |
72 | 74.2M | { |
73 | 74.2M | return m_NextLayer; |
74 | 74.2M | } |
75 | | |
76 | | /// @return A pointer to the previous layer in the protocol stack or nullptr if the layer is the first one |
77 | | Layer* getPrevLayer() const |
78 | 2.16M | { |
79 | 2.16M | return m_PrevLayer; |
80 | 2.16M | } |
81 | | |
82 | | /// @return The protocol enum |
83 | | ProtocolType getProtocol() const |
84 | 52.8M | { |
85 | 52.8M | return m_Protocol; |
86 | 52.8M | } |
87 | | |
88 | | /// Check if the layer's protocol matches a protocol family |
89 | | /// @param protocolTypeFamily The protocol family to check |
90 | | /// @return True if the layer's protocol matches the protocol family, false otherwise |
91 | | bool isMemberOfProtocolFamily(ProtocolTypeFamily protocolTypeFamily) const; |
92 | | |
93 | | /// @return A pointer to the layer raw data. In most cases it'll be a pointer to the first byte of the header |
94 | | uint8_t* getData() const |
95 | 187k | { |
96 | 187k | return m_Data; |
97 | 187k | } |
98 | | |
99 | | /// @return The length in bytes of the data from the first byte of the header until the end of the packet |
100 | | size_t getDataLen() const |
101 | 3.39M | { |
102 | 3.39M | return m_DataLen; |
103 | 3.39M | } |
104 | | |
105 | | /// @return A pointer for the layer payload, meaning the first byte after the header |
106 | | uint8_t* getLayerPayload() const |
107 | 0 | { |
108 | 0 | return m_Data + getHeaderLen(); |
109 | 0 | } |
110 | | |
111 | | /// @return The size in bytes of the payload |
112 | | size_t getLayerPayloadSize() const |
113 | 57.4k | { |
114 | 57.4k | return m_DataLen - getHeaderLen(); |
115 | 57.4k | } |
116 | | |
117 | | /// Raw data in layers can come from one of sources: |
118 | | /// 1. from an existing packet - this is the case when parsing packets received from files or the network. In |
119 | | /// this case the data was already allocated by someone else, and layer only holds the pointer to the relevant |
120 | | /// place inside this data |
121 | | /// 2. when creating packets, data is allocated when layer is created. In this case the layer is responsible for |
122 | | /// freeing it as well |
123 | | /// |
124 | | /// @return Returns true if the data was allocated by an external source (a packet) or false if it was allocated |
125 | | /// by the layer itself |
126 | | bool isAllocatedToPacket() const |
127 | 3.89M | { |
128 | 3.89M | return m_Packet != nullptr; |
129 | 3.89M | } |
130 | | |
131 | | /// Copy the raw data of this layer to another array |
132 | | /// @param[out] toArr The destination byte array |
133 | | void copyData(uint8_t* toArr) const; |
134 | | |
135 | | // implement abstract methods |
136 | | |
137 | | uint8_t* getDataPtr(size_t offset = 0) const override |
138 | 117k | { |
139 | 117k | return static_cast<uint8_t*>(m_Data + offset); |
140 | 117k | } |
141 | | |
142 | | // abstract methods |
143 | | |
144 | | /// Each layer is responsible for parsing the next layer |
145 | | virtual void parseNextLayer() = 0; |
146 | | |
147 | | /// @return The header length in bytes |
148 | | virtual size_t getHeaderLen() const = 0; |
149 | | |
150 | | /// Each layer can compute field values automatically using this method. This is an abstract method |
151 | | virtual void computeCalculateFields() = 0; |
152 | | |
153 | | /// @return A string representation of the layer most important data (should look like the layer description in |
154 | | /// Wireshark) |
155 | | virtual std::string toString() const = 0; |
156 | | |
157 | | /// @return The OSI Model layer this protocol belongs to |
158 | | virtual OsiModelLayer getOsiModelLayer() const = 0; |
159 | | |
160 | | protected: |
161 | | uint8_t* m_Data; |
162 | | size_t m_DataLen; |
163 | | Packet* m_Packet; |
164 | | ProtocolType m_Protocol; |
165 | | Layer* m_NextLayer; |
166 | | Layer* m_PrevLayer; |
167 | | bool m_IsAllocatedInPacket; |
168 | | |
169 | | Layer() |
170 | | : m_Data(nullptr), m_DataLen(0), m_Packet(nullptr), m_Protocol(UnknownProtocol), m_NextLayer(nullptr), |
171 | | m_PrevLayer(nullptr), m_IsAllocatedInPacket(false) |
172 | 0 | {} |
173 | | |
174 | | Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ProtocolType protocol = UnknownProtocol) |
175 | 3.79M | : m_Data(data), m_DataLen(dataLen), m_Packet(packet), m_Protocol(protocol), m_NextLayer(nullptr), |
176 | 3.79M | m_PrevLayer(prevLayer), m_IsAllocatedInPacket(false) |
177 | 3.79M | {} |
178 | | |
179 | | // Copy c'tor |
180 | | Layer(const Layer& other); |
181 | | Layer& operator=(const Layer& other); |
182 | | |
183 | | void setNextLayer(Layer* nextLayer) |
184 | 1.66M | { |
185 | 1.66M | m_NextLayer = nextLayer; |
186 | 1.66M | } |
187 | | void setPrevLayer(Layer* prevLayer) |
188 | 0 | { |
189 | 0 | m_PrevLayer = prevLayer; |
190 | 0 | } |
191 | | |
192 | | virtual bool extendLayer(int offsetInLayer, size_t numOfBytesToExtend); |
193 | | virtual bool shortenLayer(int offsetInLayer, size_t numOfBytesToShorten); |
194 | | |
195 | | bool hasNextLayer() const |
196 | 2.88M | { |
197 | 2.88M | return m_NextLayer != nullptr; |
198 | 2.88M | } |
199 | | |
200 | | /// Construct the next layer in the protocol stack. No validation is performed on the data. |
201 | | /// @tparam T The type of the layer to construct |
202 | | /// @tparam Args The types of the arguments to pass to the layer constructor |
203 | | /// @param[in] data The data to construct the layer from |
204 | | /// @param[in] dataLen The length of the data |
205 | | /// @param[in] packet The packet the layer belongs to |
206 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor |
207 | | /// @return The constructed layer |
208 | | template <typename T, typename... Args> |
209 | | Layer* constructNextLayer(uint8_t* data, size_t dataLen, Packet* packet, Args&&... extraArgs) |
210 | 1.52M | { |
211 | 1.52M | if (hasNextLayer()) |
212 | 0 | { |
213 | 0 | throw std::runtime_error("Next layer already exists"); |
214 | 0 | } |
215 | | |
216 | 1.52M | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); |
217 | 1.52M | setNextLayer(newLayer); |
218 | 1.52M | return newLayer; |
219 | 1.52M | } pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 86.9k | { | 211 | 86.9k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 86.9k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 86.9k | setNextLayer(newLayer); | 218 | 86.9k | return newLayer; | 219 | 86.9k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::UdpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 233k | { | 211 | 233k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 233k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 233k | setNextLayer(newLayer); | 218 | 233k | return newLayer; | 219 | 233k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::TcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 320k | { | 211 | 320k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 320k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 320k | setNextLayer(newLayer); | 218 | 320k | return newLayer; | 219 | 320k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IcmpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 38.9k | { | 211 | 38.9k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 38.9k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 38.9k | setNextLayer(newLayer); | 218 | 38.9k | return newLayer; | 219 | 38.9k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IPv4Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 462k | { | 211 | 462k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 462k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 462k | setNextLayer(newLayer); | 218 | 462k | return newLayer; | 219 | 462k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IPv6Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 52.2k | { | 211 | 52.2k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 52.2k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 52.2k | setNextLayer(newLayer); | 218 | 52.2k | return newLayer; | 219 | 52.2k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GREv0Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 3.24k | { | 211 | 3.24k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 3.24k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 3.24k | setNextLayer(newLayer); | 218 | 3.24k | return newLayer; | 219 | 3.24k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GREv1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 63.5k | { | 211 | 63.5k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 63.5k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 63.5k | setNextLayer(newLayer); | 218 | 63.5k | return newLayer; | 219 | 63.5k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 3.17k | { | 211 | 3.17k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 3.17k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 3.17k | setNextLayer(newLayer); | 218 | 3.17k | return newLayer; | 219 | 3.17k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 7.03k | { | 211 | 7.03k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 7.03k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 7.03k | setNextLayer(newLayer); | 218 | 7.03k | return newLayer; | 219 | 7.03k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV3QueryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 1.12k | { | 211 | 1.12k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 1.12k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 1.12k | setNextLayer(newLayer); | 218 | 1.12k | return newLayer; | 219 | 1.12k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV3ReportLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 2.60k | { | 211 | 2.60k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 2.60k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 2.60k | setNextLayer(newLayer); | 218 | 2.60k | return newLayer; | 219 | 2.60k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::AuthenticationHeaderLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 5.01k | { | 211 | 5.01k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 5.01k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 5.01k | setNextLayer(newLayer); | 218 | 5.01k | return newLayer; | 219 | 5.01k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::ESPLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 917 | { | 211 | 917 | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 917 | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 917 | setNextLayer(newLayer); | 218 | 917 | return newLayer; | 219 | 917 | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VrrpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 3.32k | { | 211 | 3.32k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 3.32k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 3.32k | setNextLayer(newLayer); | 218 | 3.32k | return newLayer; | 219 | 3.32k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VrrpV3Layer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::Packet*, pcpp::IPAddress::AddressType&&) Line | Count | Source | 210 | 4.47k | { | 211 | 4.47k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 4.47k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 4.47k | setNextLayer(newLayer); | 218 | 4.47k | return newLayer; | 219 | 4.47k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::HttpRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 6.32k | { | 211 | 6.32k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 6.32k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 6.32k | setNextLayer(newLayer); | 218 | 6.32k | return newLayer; | 219 | 6.32k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::HttpResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 11.8k | { | 211 | 11.8k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 11.8k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 11.8k | setNextLayer(newLayer); | 218 | 11.8k | return newLayer; | 219 | 11.8k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SipRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SipResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DnsOverTcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 23.7k | { | 211 | 23.7k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 23.7k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 23.7k | setNextLayer(newLayer); | 218 | 23.7k | return newLayer; | 219 | 23.7k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::TelnetLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 47.6k | { | 211 | 47.6k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 47.6k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 47.6k | setNextLayer(newLayer); | 218 | 47.6k | return newLayer; | 219 | 47.6k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::FtpResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 305 | { | 211 | 305 | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 305 | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 305 | setNextLayer(newLayer); | 218 | 305 | return newLayer; | 219 | 305 | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::FtpRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::FtpDataLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 3.01k | { | 211 | 3.01k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 3.01k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 3.01k | setNextLayer(newLayer); | 218 | 3.01k | return newLayer; | 219 | 3.01k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::TpktLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 3.44k | { | 211 | 3.44k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 3.44k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 3.44k | setNextLayer(newLayer); | 218 | 3.44k | return newLayer; | 219 | 3.44k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SmtpResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SmtpRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GtpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::ArpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 1.42k | { | 211 | 1.42k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 1.42k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 1.42k | setNextLayer(newLayer); | 218 | 1.42k | return newLayer; | 219 | 1.42k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VlanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 136k | { | 211 | 136k | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 136k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 136k | setNextLayer(newLayer); | 218 | 136k | return newLayer; | 219 | 136k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PPPoESessionLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 4 | { | 211 | 4 | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 4 | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 4 | setNextLayer(newLayer); | 218 | 4 | return newLayer; | 219 | 4 | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PPPoEDiscoveryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 210 | 4 | { | 211 | 4 | if (hasNextLayer()) | 212 | 0 | { | 213 | 0 | throw std::runtime_error("Next layer already exists"); | 214 | 0 | } | 215 | | | 216 | 4 | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 217 | 4 | setNextLayer(newLayer); | 218 | 4 | return newLayer; | 219 | 4 | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::MplsLayer>(unsigned char*, unsigned long, pcpp::Packet*) Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::WakeOnLanLayer>(unsigned char*, unsigned long, pcpp::Packet*) |
220 | | |
221 | | /// Try to construct the next layer in the protocol stack with a fallback option. |
222 | | /// |
223 | | /// The method checks if the data is valid for the layer type T before constructing it by calling |
224 | | /// T::isDataValid(data, dataLen). If the data is invalid, it constructs the layer of type TFallback. |
225 | | /// |
226 | | /// @tparam T The type of the layer to construct |
227 | | /// @tparam TFallback The fallback layer type to construct if T fails |
228 | | /// @tparam Args The types of the extra arguments to pass to the layer constructor of T |
229 | | /// @param[in] data The data to construct the layer from |
230 | | /// @param[in] dataLen The length of the data |
231 | | /// @param[in] packet The packet the layer belongs to |
232 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor of T |
233 | | /// @return The constructed layer of type T or TFallback |
234 | | template <typename T, typename TFallback, typename... Args> |
235 | | Layer* tryConstructNextLayerWithFallback(uint8_t* data, size_t dataLen, Packet* packet, Args&&... extraArgs) |
236 | 1.35M | { |
237 | 1.35M | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) |
238 | 1.34M | { |
239 | 1.34M | return m_NextLayer; |
240 | 1.34M | } |
241 | | |
242 | 12.2k | return constructNextLayer<TFallback>(data, dataLen, packet); |
243 | 1.35M | } pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::UdpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 235k | { | 237 | 235k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 233k | { | 239 | 233k | return m_NextLayer; | 240 | 233k | } | 241 | | | 242 | 1.90k | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 235k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::TcpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 327k | { | 237 | 327k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 320k | { | 239 | 320k | return m_NextLayer; | 240 | 320k | } | 241 | | | 242 | 7.26k | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 327k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IcmpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 39.5k | { | 237 | 39.5k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 38.9k | { | 239 | 38.9k | return m_NextLayer; | 240 | 38.9k | } | 241 | | | 242 | 557 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 39.5k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IPv4Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 464k | { | 237 | 464k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 462k | { | 239 | 462k | return m_NextLayer; | 240 | 462k | } | 241 | | | 242 | 1.99k | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 464k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IPv6Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 52.3k | { | 237 | 52.3k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 52.2k | { | 239 | 52.2k | return m_NextLayer; | 240 | 52.2k | } | 241 | | | 242 | 143 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 52.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GREv0Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 3.24k | { | 237 | 3.24k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 3.24k | { | 239 | 3.24k | return m_NextLayer; | 240 | 3.24k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 3.24k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GREv1Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 63.5k | { | 237 | 63.5k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 63.5k | { | 239 | 63.5k | return m_NextLayer; | 240 | 63.5k | } | 241 | | | 242 | 32 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 63.5k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV1Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 3.17k | { | 237 | 3.17k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 3.17k | { | 239 | 3.17k | return m_NextLayer; | 240 | 3.17k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 3.17k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV2Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 7.03k | { | 237 | 7.03k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 7.03k | { | 239 | 7.03k | return m_NextLayer; | 240 | 7.03k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 7.03k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV3QueryLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 1.12k | { | 237 | 1.12k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 1.12k | { | 239 | 1.12k | return m_NextLayer; | 240 | 1.12k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 1.12k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV3ReportLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 2.60k | { | 237 | 2.60k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 2.60k | { | 239 | 2.60k | return m_NextLayer; | 240 | 2.60k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 2.60k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::AuthenticationHeaderLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 5.28k | { | 237 | 5.28k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 5.01k | { | 239 | 5.01k | return m_NextLayer; | 240 | 5.01k | } | 241 | | | 242 | 270 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 5.28k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::ESPLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 917 | { | 237 | 917 | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 917 | { | 239 | 917 | return m_NextLayer; | 240 | 917 | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 917 | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VrrpV2Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 3.32k | { | 237 | 3.32k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 3.32k | { | 239 | 3.32k | return m_NextLayer; | 240 | 3.32k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 3.32k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VrrpV3Layer, pcpp::PayloadLayer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::Packet*, pcpp::IPAddress::AddressType&&) Line | Count | Source | 236 | 4.47k | { | 237 | 4.47k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 4.47k | { | 239 | 4.47k | return m_NextLayer; | 240 | 4.47k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 4.47k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::ArpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 1.42k | { | 237 | 1.42k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 1.42k | { | 239 | 1.42k | return m_NextLayer; | 240 | 1.42k | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 1.42k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VlanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 136k | { | 237 | 136k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 136k | { | 239 | 136k | return m_NextLayer; | 240 | 136k | } | 241 | | | 242 | 66 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 136k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPPoESessionLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 4 | { | 237 | 4 | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 4 | { | 239 | 4 | return m_NextLayer; | 240 | 4 | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 4 | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPPoEDiscoveryLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 4 | { | 237 | 4 | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 4 | { | 239 | 4 | return m_NextLayer; | 240 | 4 | } | 241 | | | 242 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 4 | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::MplsLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::WakeOnLanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 236 | 69 | { | 237 | 69 | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 238 | 0 | { | 239 | 0 | return m_NextLayer; | 240 | 0 | } | 241 | | | 242 | 69 | return constructNextLayer<TFallback>(data, dataLen, packet); | 243 | 69 | } |
|
244 | | |
245 | | /// @brief Check if the data is large enough to reinterpret as a type |
246 | | /// |
247 | | /// The data must be non-null and at least as large as the type |
248 | | /// |
249 | | /// @tparam T The type to reinterpret as |
250 | | /// @param data The data to check |
251 | | /// @param dataLen The length of the data |
252 | | /// @return True if the data is large enough to reinterpret as T, false otherwise |
253 | | template <typename T> static bool canReinterpretAs(const uint8_t* data, size_t dataLen) |
254 | 1.12M | { |
255 | 1.12M | return data != nullptr && dataLen >= sizeof(T); |
256 | 1.12M | } bool pcpp::Layer::canReinterpretAs<pcpp::arphdr>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 1.42k | { | 255 | 1.42k | return data != nullptr && dataLen >= sizeof(T); | 256 | 1.42k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::iphdr>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 723k | { | 255 | 723k | return data != nullptr && dataLen >= sizeof(T); | 256 | 723k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::vrrp_header>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 7.79k | { | 255 | 7.79k | return data != nullptr && dataLen >= sizeof(T); | 256 | 7.79k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::ip6_hdr>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 148k | { | 255 | 148k | return data != nullptr && dataLen >= sizeof(T); | 256 | 148k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::vlan_header>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 136k | { | 255 | 136k | return data != nullptr && dataLen >= sizeof(T); | 256 | 136k | } |
Unexecuted instantiation: bool pcpp::Layer::canReinterpretAs<pcpp::MplsLayer::mpls_header>(unsigned char const*, unsigned long) bool pcpp::Layer::canReinterpretAs<pcpp::igmp_header>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 10.2k | { | 255 | 10.2k | return data != nullptr && dataLen >= sizeof(T); | 256 | 10.2k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::igmpv3_query_header>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 1.12k | { | 255 | 1.12k | return data != nullptr && dataLen >= sizeof(T); | 256 | 1.12k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::igmpv3_report_header>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 2.60k | { | 255 | 2.60k | return data != nullptr && dataLen >= sizeof(T); | 256 | 2.60k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::tpkthdr>(unsigned char const*, unsigned long) Line | Count | Source | 254 | 89.0k | { | 255 | 89.0k | return data != nullptr && dataLen >= sizeof(T); | 256 | 89.0k | } |
Unexecuted instantiation: bool pcpp::Layer::canReinterpretAs<pcpp::stp_tcn_bpdu>(unsigned char const*, unsigned long) Unexecuted instantiation: bool pcpp::Layer::canReinterpretAs<pcpp::stp_conf_bpdu>(unsigned char const*, unsigned long) Unexecuted instantiation: bool pcpp::Layer::canReinterpretAs<pcpp::rstp_conf_bpdu>(unsigned char const*, unsigned long) Unexecuted instantiation: bool pcpp::Layer::canReinterpretAs<pcpp::mstp_conf_bpdu>(unsigned char const*, unsigned long) |
257 | | |
258 | | private: |
259 | | /// Try to construct the next layer in the protocol stack. |
260 | | /// |
261 | | /// The method checks if the data is valid for the layer type T before constructing it by calling |
262 | | /// T::isDataValid(data, dataLen). If the data is invalid, a nullptr is returned. |
263 | | /// |
264 | | /// @tparam T The type of the layer to construct |
265 | | /// @tparam Args The types of the extra arguments to pass to the layer constructor |
266 | | /// @param[in] data The data to construct the layer from |
267 | | /// @param[in] dataLen The length of the data |
268 | | /// @param[in] packet The packet the layer belongs to |
269 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor |
270 | | /// @return The constructed layer or nullptr if the data is invalid |
271 | | template <typename T, typename... Args> |
272 | | Layer* tryConstructNextLayer(uint8_t* data, size_t dataLen, Packet* packet, Args&&... extraArgs) |
273 | 1.35M | { |
274 | 1.35M | if (T::isDataValid(data, dataLen)) |
275 | 1.34M | { |
276 | 1.34M | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); |
277 | 1.34M | } |
278 | 12.2k | return nullptr; |
279 | 1.35M | } pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::UdpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 235k | { | 274 | 235k | if (T::isDataValid(data, dataLen)) | 275 | 233k | { | 276 | 233k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 233k | } | 278 | 1.90k | return nullptr; | 279 | 235k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::TcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 327k | { | 274 | 327k | if (T::isDataValid(data, dataLen)) | 275 | 320k | { | 276 | 320k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 320k | } | 278 | 7.26k | return nullptr; | 279 | 327k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IcmpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 39.5k | { | 274 | 39.5k | if (T::isDataValid(data, dataLen)) | 275 | 38.9k | { | 276 | 38.9k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 38.9k | } | 278 | 557 | return nullptr; | 279 | 39.5k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IPv4Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 464k | { | 274 | 464k | if (T::isDataValid(data, dataLen)) | 275 | 462k | { | 276 | 462k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 462k | } | 278 | 1.99k | return nullptr; | 279 | 464k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IPv6Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 52.3k | { | 274 | 52.3k | if (T::isDataValid(data, dataLen)) | 275 | 52.2k | { | 276 | 52.2k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 52.2k | } | 278 | 143 | return nullptr; | 279 | 52.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::GREv0Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 3.24k | { | 274 | 3.24k | if (T::isDataValid(data, dataLen)) | 275 | 3.24k | { | 276 | 3.24k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 3.24k | } | 278 | 0 | return nullptr; | 279 | 3.24k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::GREv1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 63.5k | { | 274 | 63.5k | if (T::isDataValid(data, dataLen)) | 275 | 63.5k | { | 276 | 63.5k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 63.5k | } | 278 | 32 | return nullptr; | 279 | 63.5k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 3.17k | { | 274 | 3.17k | if (T::isDataValid(data, dataLen)) | 275 | 3.17k | { | 276 | 3.17k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 3.17k | } | 278 | 0 | return nullptr; | 279 | 3.17k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 7.03k | { | 274 | 7.03k | if (T::isDataValid(data, dataLen)) | 275 | 7.03k | { | 276 | 7.03k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 7.03k | } | 278 | 0 | return nullptr; | 279 | 7.03k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV3QueryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 1.12k | { | 274 | 1.12k | if (T::isDataValid(data, dataLen)) | 275 | 1.12k | { | 276 | 1.12k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 1.12k | } | 278 | 0 | return nullptr; | 279 | 1.12k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV3ReportLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 2.60k | { | 274 | 2.60k | if (T::isDataValid(data, dataLen)) | 275 | 2.60k | { | 276 | 2.60k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 2.60k | } | 278 | 0 | return nullptr; | 279 | 2.60k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::AuthenticationHeaderLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 5.28k | { | 274 | 5.28k | if (T::isDataValid(data, dataLen)) | 275 | 5.01k | { | 276 | 5.01k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 5.01k | } | 278 | 270 | return nullptr; | 279 | 5.28k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::ESPLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 917 | { | 274 | 917 | if (T::isDataValid(data, dataLen)) | 275 | 917 | { | 276 | 917 | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 917 | } | 278 | 0 | return nullptr; | 279 | 917 | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VrrpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 3.32k | { | 274 | 3.32k | if (T::isDataValid(data, dataLen)) | 275 | 3.32k | { | 276 | 3.32k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 3.32k | } | 278 | 0 | return nullptr; | 279 | 3.32k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VrrpV3Layer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::Packet*, pcpp::IPAddress::AddressType&&) Line | Count | Source | 273 | 4.47k | { | 274 | 4.47k | if (T::isDataValid(data, dataLen)) | 275 | 4.47k | { | 276 | 4.47k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 4.47k | } | 278 | 0 | return nullptr; | 279 | 4.47k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::ArpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 1.42k | { | 274 | 1.42k | if (T::isDataValid(data, dataLen)) | 275 | 1.42k | { | 276 | 1.42k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 1.42k | } | 278 | 0 | return nullptr; | 279 | 1.42k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VlanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 136k | { | 274 | 136k | if (T::isDataValid(data, dataLen)) | 275 | 136k | { | 276 | 136k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 136k | } | 278 | 66 | return nullptr; | 279 | 136k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::PPPoESessionLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 4 | { | 274 | 4 | if (T::isDataValid(data, dataLen)) | 275 | 4 | { | 276 | 4 | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 4 | } | 278 | 0 | return nullptr; | 279 | 4 | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::PPPoEDiscoveryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 4 | { | 274 | 4 | if (T::isDataValid(data, dataLen)) | 275 | 4 | { | 276 | 4 | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 4 | } | 278 | 0 | return nullptr; | 279 | 4 | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::MplsLayer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::WakeOnLanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 273 | 69 | { | 274 | 69 | if (T::isDataValid(data, dataLen)) | 275 | 0 | { | 276 | 0 | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 277 | 0 | } | 278 | 69 | return nullptr; | 279 | 69 | } |
|
280 | | }; |
281 | | |
282 | | inline std::ostream& operator<<(std::ostream& os, const pcpp::Layer& layer) |
283 | 0 | { |
284 | 0 | os << layer.toString(); |
285 | 0 | return os; |
286 | 0 | } |
287 | | } // namespace pcpp |