/src/PcapPlusPlus/Packet++/header/Layer.h
Line | Count | Source |
1 | | #pragma once |
2 | | |
3 | | #include <stdint.h> |
4 | | #include <stdio.h> |
5 | | #include "ProtocolType.h" |
6 | | #include <ostream> |
7 | | #include <string> |
8 | | #include <stdexcept> |
9 | | #include <utility> |
10 | | |
11 | | /// @file |
12 | | |
13 | | /// @namespace pcpp |
14 | | /// @brief The main namespace for the PcapPlusPlus lib |
15 | | namespace pcpp |
16 | | { |
17 | | |
18 | | /// @class IDataContainer |
19 | | /// An interface (virtual abstract class) that indicates an object that holds a pointer to a buffer data. The Layer |
20 | | /// class is an example of such object, hence it inherits this interface |
21 | | class IDataContainer |
22 | | { |
23 | | public: |
24 | | /// Get a pointer to the data |
25 | | /// @param[in] offset Get a pointer in a certain offset. Default is 0 - get a pointer to start of data |
26 | | /// @return A pointer to the data |
27 | | virtual uint8_t* getDataPtr(size_t offset = 0) const = 0; |
28 | | |
29 | 9.05M | virtual ~IDataContainer() = default; |
30 | | }; |
31 | | |
32 | | class Packet; |
33 | | |
34 | | namespace internal |
35 | | { |
36 | | /// @brief Holds information about a Layer's data and object ownership. |
37 | | struct LayerAllocationInfo |
38 | | { |
39 | | /// @brief Pointer to the Packet this layer is attached to (if any). |
40 | | /// |
41 | | /// If the layer is attached to a Packet, the layer's memory span (data) is considered managed by the |
42 | | /// Packet. The Packet is responsible for keeping the layer's memory span valid and updating it should it |
43 | | /// become necessary as long as the layer is attached to it. |
44 | | /// |
45 | | /// In an event the Packet is destroyed, all of its attached layers's memory views are considered invalid. |
46 | | /// Accessing layer data after the Packet is destroyed results in undefined behavior. |
47 | | /// |
48 | | /// If nullptr, the layer is not attached to any Packet and is considered unmanaged. |
49 | | /// It also means the layer's memory span is considered owned by the layer itself and will be freed when |
50 | | /// the layer is destroyed. |
51 | | Packet* attachedPacket = nullptr; |
52 | | |
53 | | /// @brief Controls if the layer object is considered owned by the attached Packet |
54 | | /// |
55 | | /// If 'true', the Layer object is considered owned by the attached Packet and will be freed by it on Packet |
56 | | /// destruction. |
57 | | /// |
58 | | /// If 'false', the Layer object is considered unmanaged and the user is responsible for freeing it. |
59 | | /// This is commonly the case for layers created on the stack and attached to a Packet. |
60 | | bool ownedByPacket = false; |
61 | | |
62 | | /// @brief Sets the state of attachment to a specified Packet |
63 | | /// @param packet Pointer to the Packet this layer is attached to (or nullptr if not attached to any Packet) |
64 | | /// @param managed True if the layer object's lifetime is to be managed by the Packet, false otherwise |
65 | | /// @param force If true, bypasses the check for existing attachment. Default is false. |
66 | | /// @throws std::runtime_error if the layer is already attached to a Packet and 'force' is false |
67 | | void attachPacket(Packet* packet, bool managed, bool force = false) |
68 | 0 | { |
69 | 0 | if (!force && attachedPacket != nullptr) |
70 | 0 | { |
71 | 0 | throw std::runtime_error("Layer is already attached to a Packet"); |
72 | 0 | } |
73 | 0 |
|
74 | 0 | attachedPacket = packet; |
75 | 0 | ownedByPacket = managed; |
76 | 0 | } |
77 | | |
78 | | /// @brief Clears the attachment to any Packet, resetting to unmanaged state. |
79 | | void detach() |
80 | 0 | { |
81 | 0 | attachedPacket = nullptr; |
82 | 0 | ownedByPacket = false; |
83 | 0 | } |
84 | | }; |
85 | | } // namespace internal |
86 | | |
87 | | /// @class Layer |
88 | | /// Layer is the base class for all protocol layers. Each protocol supported in PcapPlusPlus has a class that |
89 | | /// inherits Layer. |
90 | | /// The protocol layer class expose all properties and methods relevant for viewing and editing protocol fields. |
91 | | /// For example: a pointer to a structured header (e.g tcphdr, iphdr, etc.), protocol header size, payload size, |
92 | | /// compute fields that can be automatically computed, print protocol data to string, etc. |
93 | | /// Each protocol instance is obviously part of a protocol stack (which construct a packet). This protocol stack is |
94 | | /// represented in PcapPlusPlus in a linked list, and each layer is an element in this list. That's why each layer |
95 | | /// has properties to the next and previous layer in the protocol stack. The Layer class, as a base class, is |
96 | | /// abstract and the user can't create an instance of it (it has a private constructor). Each layer holds a pointer |
97 | | /// to the relevant place in the packet. The layer sees all the data from this pointer forward until the end of the |
98 | | /// packet. Here is an example packet showing this concept: |
99 | | /// |
100 | | /// @code{.unparsed} |
101 | | /// ==================================================== |
102 | | /// |Eth |IPv4 |TCP |Packet | |
103 | | /// |Header |Header |Header |Payload | |
104 | | /// ==================================================== |
105 | | /// |
106 | | /// |--------------------------------------------------| |
107 | | /// EthLayer data |
108 | | /// |---------------------------------------| |
109 | | /// IPv4Layer data |
110 | | /// |---------------------------| |
111 | | /// TcpLayer data |
112 | | /// |----------------| |
113 | | /// PayloadLayer data |
114 | | /// @endcode |
115 | | class Layer : public IDataContainer |
116 | | { |
117 | | friend class Packet; |
118 | | |
119 | | public: |
120 | | /// A destructor for this class. Frees the data if it was allocated by the layer constructor (see |
121 | | /// isAllocatedToPacket() for more info) |
122 | | ~Layer() override; |
123 | | |
124 | | /// @return A pointer to the next layer in the protocol stack or nullptr if the layer is the last one |
125 | | Layer* getNextLayer() const |
126 | 170M | { |
127 | 170M | return m_NextLayer; |
128 | 170M | } |
129 | | |
130 | | /// @return A pointer to the previous layer in the protocol stack or nullptr if the layer is the first one |
131 | | Layer* getPrevLayer() const |
132 | 3.22M | { |
133 | 3.22M | return m_PrevLayer; |
134 | 3.22M | } |
135 | | |
136 | | /// @return The protocol enum |
137 | | ProtocolType getProtocol() const |
138 | 122M | { |
139 | 122M | return m_Protocol; |
140 | 122M | } |
141 | | |
142 | | /// Check if the layer's protocol matches a protocol family |
143 | | /// @param protocolTypeFamily The protocol family to check |
144 | | /// @return True if the layer's protocol matches the protocol family, false otherwise |
145 | | bool isMemberOfProtocolFamily(ProtocolTypeFamily protocolTypeFamily) const; |
146 | | |
147 | | /// @return A pointer to the layer raw data. In most cases it'll be a pointer to the first byte of the header |
148 | | uint8_t* getData() const |
149 | 528k | { |
150 | 528k | return m_Data; |
151 | 528k | } |
152 | | |
153 | | /// @return The length in bytes of the data from the first byte of the header until the end of the packet |
154 | | size_t getDataLen() const |
155 | 6.44M | { |
156 | 6.44M | return m_DataLen; |
157 | 6.44M | } |
158 | | |
159 | | /// @return A pointer for the layer payload, meaning the first byte after the header |
160 | | uint8_t* getLayerPayload() const |
161 | 0 | { |
162 | 0 | return m_Data + getHeaderLen(); |
163 | 0 | } |
164 | | |
165 | | /// @return The size in bytes of the payload |
166 | | size_t getLayerPayloadSize() const |
167 | 113k | { |
168 | 113k | return m_DataLen - getHeaderLen(); |
169 | 113k | } |
170 | | |
171 | | /// Raw data in layers can come from one of sources: |
172 | | /// 1. from an existing packet - this is the case when parsing packets received from files or the network. In |
173 | | /// this case the data was already allocated by someone else, and layer only holds the pointer to the relevant |
174 | | /// place inside this data |
175 | | /// 2. when creating packets, data is allocated when layer is created. In this case the layer is responsible for |
176 | | /// freeing it as well |
177 | | /// |
178 | | /// @return Returns true if the data was allocated by an external source (a packet) or false if it was allocated |
179 | | /// by the layer itself |
180 | | bool isAllocatedToPacket() const |
181 | 9.05M | { |
182 | 9.05M | return m_AllocationInfo.attachedPacket != nullptr; |
183 | 9.05M | } |
184 | | |
185 | | /// @brief Copy the raw data of this layer to another array |
186 | | /// |
187 | | /// @warning The method does not perform any bounds checking on the destination array. The caller MUST ensure |
188 | | /// that the destination array has enough space to hold the getDataLen() bytes. |
189 | | /// |
190 | | /// @warning Prefer the overload of copyData() that accepts a destination size to ensure safe copying of data. |
191 | | /// |
192 | | /// @param[out] toArr The destination byte array |
193 | | void copyData(uint8_t* toArr) const; |
194 | | |
195 | | /// @brief Copy the raw data of this layer to another array, with a specified maximum size. |
196 | | /// |
197 | | /// The method copies up to 'destSize' bytes of the layer's raw data into the provided destination array. |
198 | | /// If the layer's data length is greater than 'destSize', only the first 'destSize' bytes will be copied. |
199 | | /// |
200 | | /// To ensure sufficient space is available in the destination array, use getDataLen() to determine the actual |
201 | | /// length of the layer's data before calling this method. |
202 | | /// |
203 | | /// @param[out] dest The destination byte array |
204 | | /// @param[in] destSize The maximum number of bytes to copy |
205 | | /// @return The number of bytes copied to the destination array. |
206 | | size_t copyData(uint8_t* dest, size_t destSize) const; |
207 | | |
208 | | // implement abstract methods |
209 | | |
210 | | uint8_t* getDataPtr(size_t offset = 0) const override |
211 | 217k | { |
212 | 217k | return static_cast<uint8_t*>(m_Data + offset); |
213 | 217k | } |
214 | | |
215 | | // abstract methods |
216 | | |
217 | | /// Each layer is responsible for parsing the next layer |
218 | | virtual void parseNextLayer() = 0; |
219 | | |
220 | | /// @return The header length in bytes |
221 | | virtual size_t getHeaderLen() const = 0; |
222 | | |
223 | | /// Each layer can compute field values automatically using this method. This is an abstract method |
224 | | virtual void computeCalculateFields() = 0; |
225 | | |
226 | | /// @return A string representation of the layer most important data (should look like the layer description in |
227 | | /// Wireshark) |
228 | | virtual std::string toString() const = 0; |
229 | | |
230 | | /// @return The OSI Model layer this protocol belongs to |
231 | | virtual OsiModelLayer getOsiModelLayer() const = 0; |
232 | | |
233 | | protected: |
234 | | uint8_t* m_Data; |
235 | | size_t m_DataLen; |
236 | | ProtocolType m_Protocol; |
237 | | Layer* m_NextLayer; |
238 | | Layer* m_PrevLayer; |
239 | | |
240 | | private: |
241 | | internal::LayerAllocationInfo m_AllocationInfo; |
242 | | |
243 | | protected: |
244 | | Layer() : m_Data(nullptr), m_DataLen(0), m_Protocol(UnknownProtocol), m_NextLayer(nullptr), m_PrevLayer(nullptr) |
245 | 0 | {} |
246 | | |
247 | | Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ProtocolType protocol = UnknownProtocol) |
248 | 8.81M | : m_Data(data), m_DataLen(dataLen), m_Protocol(protocol), m_NextLayer(nullptr), m_PrevLayer(prevLayer), |
249 | 8.81M | m_AllocationInfo{ packet, false } |
250 | 8.81M | {} |
251 | | |
252 | | // Copy c'tor |
253 | | Layer(const Layer& other); |
254 | | Layer& operator=(const Layer& other); |
255 | | |
256 | | /// @brief Get a pointer to the Packet this layer is attached to (if any). |
257 | | /// @return A pointer to the Packet this layer is attached to, or nullptr if the layer is not attached. |
258 | | Packet* getAttachedPacket() |
259 | 8.29M | { |
260 | 8.29M | return m_AllocationInfo.attachedPacket; |
261 | 8.29M | } |
262 | | |
263 | | /// @brief Get a pointer to the Packet this layer is attached to (if any). |
264 | | /// @return A const pointer to the Packet this layer is attached to, or nullptr if the layer is not attached. |
265 | | Packet const* getAttachedPacket() const |
266 | 9.80k | { |
267 | 9.80k | return m_AllocationInfo.attachedPacket; |
268 | 9.80k | } |
269 | | |
270 | | void setNextLayer(Layer* nextLayer) |
271 | 6.99M | { |
272 | 6.99M | m_NextLayer = nextLayer; |
273 | 6.99M | } |
274 | | void setPrevLayer(Layer* prevLayer) |
275 | 0 | { |
276 | 0 | m_PrevLayer = prevLayer; |
277 | 0 | } |
278 | | |
279 | | // ------ Memory Control Methods ----- |
280 | | // Used by derived classes to request buffer size changes. |
281 | | |
282 | | /// @brief Requests the layer to allocate a new data buffer of the specified length. |
283 | | /// |
284 | | /// If the layer is not attached to a Packet, it will allocate a new buffer of the specified length. |
285 | | /// If the layer is attached to a Packet, it will throw a std::logic_error, as that case is not yet supported. |
286 | | /// |
287 | | /// The primary use case for this method is initial allocation of the data buffer in derived classes. |
288 | | /// |
289 | | /// @param[in] dataLen The length of the new data buffer. |
290 | | /// @param[in] zeroInit If true, the new buffer will be zero-initialized. |
291 | | /// @throws std::runtime_error if the layer already has allocated data. |
292 | | /// @throws std::logic_error if the layer is attached to a Packet (not yet supported). |
293 | | void allocData(size_t dataLen, bool zeroInit = true); |
294 | | |
295 | | virtual bool extendLayer(int offsetInLayer, size_t numOfBytesToExtend); |
296 | | virtual bool shortenLayer(int offsetInLayer, size_t numOfBytesToShorten); |
297 | | |
298 | | bool hasNextLayer() const |
299 | 12.5M | { |
300 | 12.5M | return m_NextLayer != nullptr; |
301 | 12.5M | } |
302 | | |
303 | | /// @brief Construct the next layer in the protocol stack. No validation is performed on the data. |
304 | | /// |
305 | | /// This overload infers the Packet from the current layer. |
306 | | /// |
307 | | /// @tparam T The type of the layer to construct |
308 | | /// @tparam Args The types of the arguments to pass to the layer constructor |
309 | | /// @param data The data to construct the layer from |
310 | | /// @param dataLen The length of the data |
311 | | /// @param extraArgs Extra arguments to be forwarded to the layer constructor |
312 | | /// @return The constructed layer |
313 | | template <typename T, typename... Args> |
314 | | Layer* constructNextLayer(uint8_t* data, size_t dataLen, Args&&... extraArgs) |
315 | 706k | { |
316 | 706k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); |
317 | 706k | } pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VlanLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 80.8k | { | 316 | 80.8k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 80.8k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::MplsLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 104k | { | 316 | 104k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 104k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 189k | { | 316 | 189k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 189k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VrrpV3Layer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::IPAddress::AddressType&&) Line | Count | Source | 315 | 14.1k | { | 316 | 14.1k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 14.1k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::ArpLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 7.56k | { | 316 | 7.56k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 7.56k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DnsLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 95.7k | { | 316 | 95.7k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 95.7k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::RadiusLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 37.3k | { | 316 | 37.3k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 37.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GtpV1Layer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 46.1k | { | 316 | 46.1k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 46.1k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GtpV2Layer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 8.79k | { | 316 | 8.79k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 8.79k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DhcpV6Layer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 24.4k | { | 316 | 24.4k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 24.4k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::NtpLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 21.1k | { | 316 | 21.1k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 21.1k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::WakeOnLanLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 1.09k | { | 316 | 1.09k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 1.09k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::EthLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 6.40k | { | 316 | 6.40k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 6.40k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SdpLayer>(unsigned char*, unsigned long) Line | Count | Source | 315 | 68.5k | { | 316 | 68.5k | return constructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 317 | 68.5k | } |
|
318 | | |
319 | | /// Construct the next layer in the protocol stack. No validation is performed on the data. |
320 | | /// @tparam T The type of the layer to construct |
321 | | /// @tparam Args The types of the arguments to pass to the layer constructor |
322 | | /// @param[in] data The data to construct the layer from |
323 | | /// @param[in] dataLen The length of the data |
324 | | /// @param[in] packet The packet the layer belongs to |
325 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor |
326 | | /// @return The constructed layer |
327 | | template <typename T, typename... Args> |
328 | | Layer* constructNextLayer(uint8_t* data, size_t dataLen, Packet* packet, Args&&... extraArgs) |
329 | 5.73M | { |
330 | 5.73M | if (hasNextLayer()) |
331 | 0 | { |
332 | 0 | throw std::runtime_error("Next layer already exists"); |
333 | 0 | } |
334 | | |
335 | 5.73M | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); |
336 | 5.73M | setNextLayer(newLayer); |
337 | 5.73M | return newLayer; |
338 | 5.73M | } pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IPv4Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 1.64M | { | 330 | 1.64M | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 1.64M | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 1.64M | setNextLayer(newLayer); | 337 | 1.64M | return newLayer; | 338 | 1.64M | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 569k | { | 330 | 569k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 569k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 569k | setNextLayer(newLayer); | 337 | 569k | return newLayer; | 338 | 569k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IPv6Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 323k | { | 330 | 323k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 323k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 323k | setNextLayer(newLayer); | 337 | 323k | return newLayer; | 338 | 323k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VlanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 280k | { | 330 | 280k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 280k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 280k | setNextLayer(newLayer); | 337 | 280k | return newLayer; | 338 | 280k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::MplsLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 107k | { | 330 | 107k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 107k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 107k | setNextLayer(newLayer); | 337 | 107k | return newLayer; | 338 | 107k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PPP_PPTPLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 90.5k | { | 330 | 90.5k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 90.5k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 90.5k | setNextLayer(newLayer); | 337 | 90.5k | return newLayer; | 338 | 90.5k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::EthLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 6.40k | { | 330 | 6.40k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 6.40k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 6.40k | setNextLayer(newLayer); | 337 | 6.40k | return newLayer; | 338 | 6.40k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::EthDot3Layer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GtpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 16.4k | { | 330 | 16.4k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 16.4k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 16.4k | setNextLayer(newLayer); | 337 | 16.4k | return newLayer; | 338 | 16.4k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::UdpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 597k | { | 330 | 597k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 597k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 597k | setNextLayer(newLayer); | 337 | 597k | return newLayer; | 338 | 597k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::TcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 1.06M | { | 330 | 1.06M | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 1.06M | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 1.06M | setNextLayer(newLayer); | 337 | 1.06M | return newLayer; | 338 | 1.06M | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IcmpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 59.5k | { | 330 | 59.5k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 59.5k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 59.5k | setNextLayer(newLayer); | 337 | 59.5k | return newLayer; | 338 | 59.5k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GREv0Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 26.0k | { | 330 | 26.0k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 26.0k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 26.0k | setNextLayer(newLayer); | 337 | 26.0k | return newLayer; | 338 | 26.0k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GREv1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 111k | { | 330 | 111k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 111k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 111k | setNextLayer(newLayer); | 337 | 111k | return newLayer; | 338 | 111k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 4.98k | { | 330 | 4.98k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 4.98k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 4.98k | setNextLayer(newLayer); | 337 | 4.98k | return newLayer; | 338 | 4.98k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 13.3k | { | 330 | 13.3k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 13.3k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 13.3k | setNextLayer(newLayer); | 337 | 13.3k | return newLayer; | 338 | 13.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV3QueryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 1.85k | { | 330 | 1.85k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 1.85k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 1.85k | setNextLayer(newLayer); | 337 | 1.85k | return newLayer; | 338 | 1.85k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::IgmpV3ReportLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 3.69k | { | 330 | 3.69k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 3.69k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 3.69k | setNextLayer(newLayer); | 337 | 3.69k | return newLayer; | 338 | 3.69k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::AuthenticationHeaderLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 5.66k | { | 330 | 5.66k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 5.66k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 5.66k | setNextLayer(newLayer); | 337 | 5.66k | return newLayer; | 338 | 5.66k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::ESPLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 5.30k | { | 330 | 5.30k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 5.30k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 5.30k | setNextLayer(newLayer); | 337 | 5.30k | return newLayer; | 338 | 5.30k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VrrpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 13.6k | { | 330 | 13.6k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 13.6k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 13.6k | setNextLayer(newLayer); | 337 | 13.6k | return newLayer; | 338 | 13.6k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VrrpV3Layer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::Packet*, pcpp::IPAddress::AddressType&&) Line | Count | Source | 329 | 21.7k | { | 330 | 21.7k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 21.7k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 21.7k | setNextLayer(newLayer); | 337 | 21.7k | return newLayer; | 338 | 21.7k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::ArpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 21.9k | { | 330 | 21.9k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 21.9k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 21.9k | setNextLayer(newLayer); | 337 | 21.9k | return newLayer; | 338 | 21.9k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PPPoESessionLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 77.5k | { | 330 | 77.5k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 77.5k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 77.5k | setNextLayer(newLayer); | 337 | 77.5k | return newLayer; | 338 | 77.5k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::PPPoEDiscoveryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 5.24k | { | 330 | 5.24k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 5.24k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 5.24k | setNextLayer(newLayer); | 337 | 5.24k | return newLayer; | 338 | 5.24k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::LLCLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 15.7k | { | 330 | 15.7k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 15.7k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 15.7k | setNextLayer(newLayer); | 337 | 15.7k | return newLayer; | 338 | 15.7k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::HttpRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 79.2k | { | 330 | 79.2k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 79.2k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 79.2k | setNextLayer(newLayer); | 337 | 79.2k | return newLayer; | 338 | 79.2k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::HttpResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 24.6k | { | 330 | 24.6k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 24.6k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 24.6k | setNextLayer(newLayer); | 337 | 24.6k | return newLayer; | 338 | 24.6k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SipRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SipResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 3.08k | { | 330 | 3.08k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 3.08k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 3.08k | setNextLayer(newLayer); | 337 | 3.08k | return newLayer; | 338 | 3.08k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DnsOverTcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 20.6k | { | 330 | 20.6k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 20.6k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 20.6k | setNextLayer(newLayer); | 337 | 20.6k | return newLayer; | 338 | 20.6k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::TelnetLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 59.9k | { | 330 | 59.9k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 59.9k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 59.9k | setNextLayer(newLayer); | 337 | 59.9k | return newLayer; | 338 | 59.9k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::FtpResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 23.7k | { | 330 | 23.7k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 23.7k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 23.7k | setNextLayer(newLayer); | 337 | 23.7k | return newLayer; | 338 | 23.7k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::FtpRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 6.09k | { | 330 | 6.09k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 6.09k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 6.09k | setNextLayer(newLayer); | 337 | 6.09k | return newLayer; | 338 | 6.09k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::FtpDataLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 4.60k | { | 330 | 4.60k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 4.60k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 4.60k | setNextLayer(newLayer); | 337 | 4.60k | return newLayer; | 338 | 4.60k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::TpktLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 31.5k | { | 330 | 31.5k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 31.5k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 31.5k | setNextLayer(newLayer); | 337 | 31.5k | return newLayer; | 338 | 31.5k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SmtpResponseLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 4.19k | { | 330 | 4.19k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 4.19k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 4.19k | setNextLayer(newLayer); | 337 | 4.19k | return newLayer; | 338 | 4.19k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SmtpRequestLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 8.04k | { | 330 | 8.04k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 8.04k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 8.04k | setNextLayer(newLayer); | 337 | 8.04k | return newLayer; | 338 | 8.04k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::ModbusLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 1.70k | { | 330 | 1.70k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 1.70k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 1.70k | setNextLayer(newLayer); | 337 | 1.70k | return newLayer; | 338 | 1.70k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::CotpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 28.1k | { | 330 | 28.1k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 28.1k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 28.1k | setNextLayer(newLayer); | 337 | 28.1k | return newLayer; | 338 | 28.1k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DhcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 32.3k | { | 330 | 32.3k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 32.3k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 32.3k | setNextLayer(newLayer); | 337 | 32.3k | return newLayer; | 338 | 32.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::VxlanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 6.40k | { | 330 | 6.40k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 6.40k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 6.40k | setNextLayer(newLayer); | 337 | 6.40k | return newLayer; | 338 | 6.40k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DnsLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 95.7k | { | 330 | 95.7k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 95.7k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 95.7k | setNextLayer(newLayer); | 337 | 95.7k | return newLayer; | 338 | 95.7k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::RadiusLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 37.3k | { | 330 | 37.3k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 37.3k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 37.3k | setNextLayer(newLayer); | 337 | 37.3k | return newLayer; | 338 | 37.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::GtpV1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 46.1k | { | 330 | 46.1k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 46.1k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 46.1k | setNextLayer(newLayer); | 337 | 46.1k | return newLayer; | 338 | 46.1k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::DhcpV6Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 24.4k | { | 330 | 24.4k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 24.4k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 24.4k | setNextLayer(newLayer); | 337 | 24.4k | return newLayer; | 338 | 24.4k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::NtpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 21.1k | { | 330 | 21.1k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 21.1k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 21.1k | setNextLayer(newLayer); | 337 | 21.1k | return newLayer; | 338 | 21.1k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::WakeOnLanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 1.15k | { | 330 | 1.15k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 1.15k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 1.15k | setNextLayer(newLayer); | 337 | 1.15k | return newLayer; | 338 | 1.15k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::S7CommLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 17.4k | { | 330 | 17.4k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 17.4k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 17.4k | setNextLayer(newLayer); | 337 | 17.4k | return newLayer; | 338 | 17.4k | } |
pcpp::Layer* pcpp::Layer::constructNextLayer<pcpp::SdpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 329 | 68.5k | { | 330 | 68.5k | if (hasNextLayer()) | 331 | 0 | { | 332 | 0 | throw std::runtime_error("Next layer already exists"); | 333 | 0 | } | 334 | | | 335 | 68.5k | Layer* newLayer = new T(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 336 | 68.5k | setNextLayer(newLayer); | 337 | 68.5k | return newLayer; | 338 | 68.5k | } |
|
339 | | |
340 | | /// @brief Construct the next layer in the protocol stack using a factory functor. |
341 | | /// |
342 | | /// No validation is performed on the data, outside of what the factory functor may perform. |
343 | | /// If the factory returns a nullptr, no next layer is set. |
344 | | /// |
345 | | /// The factory functor is expected to have the following signature: |
346 | | /// Layer* factoryFn(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ...); |
347 | | /// |
348 | | /// This overload infers the Packet from the current layer. |
349 | | /// |
350 | | /// @tparam TFactory The factory functor type. |
351 | | /// @tparam ...Args Parameter pack for extra arguments to pass to the factory functor. |
352 | | /// @param[in] factoryFn The factory functor to create the layer. |
353 | | /// @param[in] data The data to construct the layer from |
354 | | /// @param[in] dataLen The length of the data |
355 | | /// @param[in] extraArgs Extra arguments to be forwarded to the factory. |
356 | | /// @return The return value of the factory functor. |
357 | | template <typename TFactory, typename... Args> |
358 | | Layer* constructNextLayerFromFactory(TFactory factoryFn, uint8_t* data, size_t dataLen, Args&&... extraArgs) |
359 | 829k | { |
360 | 829k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), |
361 | 829k | std::forward<Args>(extraArgs)...); |
362 | 829k | } pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 359 | 165k | { | 360 | 165k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), | 361 | 165k | std::forward<Args>(extraArgs)...); | 362 | 165k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::Layer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::Layer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 359 | 119k | { | 360 | 119k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), | 361 | 119k | std::forward<Args>(extraArgs)...); | 362 | 119k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::SSLLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SSLLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 359 | 488k | { | 360 | 488k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), | 361 | 488k | std::forward<Args>(extraArgs)...); | 362 | 488k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::SSHLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SSHLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 359 | 31.3k | { | 360 | 31.3k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), | 361 | 31.3k | std::forward<Args>(extraArgs)...); | 362 | 31.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 359 | 20.3k | { | 360 | 20.3k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), | 361 | 20.3k | std::forward<Args>(extraArgs)...); | 362 | 20.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::StpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::StpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 359 | 5.18k | { | 360 | 5.18k | return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, getAttachedPacket(), | 361 | 5.18k | std::forward<Args>(extraArgs)...); | 362 | 5.18k | } |
|
363 | | |
364 | | /// @brief Construct the next layer in the protocol stack using a factory functor. |
365 | | /// |
366 | | /// No validation is performed on the data, outside of what the factory functor may perform. |
367 | | /// If the factory returns a nullptr, no next layer is set. |
368 | | /// |
369 | | /// The factory functor is expected to have the following signature: |
370 | | /// Layer* factoryFn(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ...); |
371 | | /// |
372 | | /// @tparam TFactory The factory functor type. |
373 | | /// @tparam ...Args Parameter pack for extra arguments to pass to the factory functor. |
374 | | /// @param[in] factoryFn The factory functor to create the layer. |
375 | | /// @param[in] data The data to construct the layer from |
376 | | /// @param[in] dataLen The length of the data |
377 | | /// @param[in] packet The packet the layer belongs to |
378 | | /// @param[in] extraArgs Extra arguments to be forwarded to the factory. |
379 | | /// @return The return value of the factory functor. |
380 | | template <typename TFactory, typename... Args> |
381 | | Layer* constructNextLayerFromFactory(TFactory factoryFn, uint8_t* data, size_t dataLen, Packet* packet, |
382 | | Args&&... extraArgs) |
383 | 1.20M | { |
384 | 1.20M | if (hasNextLayer()) |
385 | 0 | { |
386 | 0 | throw std::runtime_error("Next layer already exists"); |
387 | 0 | } |
388 | | |
389 | | // cppcheck-suppress redundantInitialization |
390 | 1.20M | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); |
391 | 1.20M | setNextLayer(newLayer); |
392 | 1.20M | return newLayer; |
393 | 1.20M | } pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 244k | { | 384 | 244k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 244k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 244k | setNextLayer(newLayer); | 392 | 244k | return newLayer; | 393 | 244k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::Layer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::Layer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 119k | { | 384 | 119k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 119k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 119k | setNextLayer(newLayer); | 392 | 119k | return newLayer; | 393 | 119k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::SSLLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SSLLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 488k | { | 384 | 488k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 488k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 488k | setNextLayer(newLayer); | 392 | 488k | return newLayer; | 393 | 488k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::SSHLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SSHLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 31.3k | { | 384 | 31.3k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 31.3k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 31.3k | setNextLayer(newLayer); | 392 | 31.3k | return newLayer; | 393 | 31.3k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::DoIpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::DoIpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 52.2k | { | 384 | 52.2k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 52.2k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 52.2k | setNextLayer(newLayer); | 392 | 52.2k | return newLayer; | 393 | 52.2k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 58.4k | { | 384 | 58.4k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 58.4k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 58.4k | setNextLayer(newLayer); | 392 | 58.4k | return newLayer; | 393 | 58.4k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::PostgresLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::PostgresLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 76 | { | 384 | 76 | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 76 | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 76 | setNextLayer(newLayer); | 392 | 76 | return newLayer; | 393 | 76 | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::MySqlLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::MySqlLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 9.58k | { | 384 | 9.58k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 9.58k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 9.58k | setNextLayer(newLayer); | 392 | 9.58k | return newLayer; | 393 | 9.58k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*, unsigned short, unsigned short), unsigned short&, unsigned short&>(pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*, unsigned short, unsigned short), unsigned char*, unsigned long, pcpp::Packet*, unsigned short&, unsigned short&) Line | Count | Source | 383 | 112k | { | 384 | 112k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 112k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 112k | setNextLayer(newLayer); | 392 | 112k | return newLayer; | 393 | 112k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::WireGuardLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::WireGuardLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 3.33k | { | 384 | 3.33k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 3.33k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 3.33k | setNextLayer(newLayer); | 392 | 3.33k | return newLayer; | 393 | 3.33k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 81.5k | { | 384 | 81.5k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 81.5k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 81.5k | setNextLayer(newLayer); | 392 | 81.5k | return newLayer; | 393 | 81.5k | } |
pcpp::Layer* pcpp::Layer::constructNextLayerFromFactory<pcpp::StpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::StpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 383 | 5.18k | { | 384 | 5.18k | if (hasNextLayer()) | 385 | 0 | { | 386 | 0 | throw std::runtime_error("Next layer already exists"); | 387 | 0 | } | 388 | | | 389 | | // cppcheck-suppress redundantInitialization | 390 | 5.18k | Layer* newLayer = factoryFn(data, dataLen, this, packet, std::forward<Args>(extraArgs)...); | 391 | 5.18k | setNextLayer(newLayer); | 392 | 5.18k | return newLayer; | 393 | 5.18k | } |
|
394 | | |
395 | | /// Try to construct the next layer in the protocol stack. |
396 | | /// |
397 | | /// This overload infers the Packet from the current layer. |
398 | | /// |
399 | | /// The method checks if the data is valid for the layer type T before constructing it by calling |
400 | | /// T::isDataValid(data, dataLen). If the data is invalid, no layer is constructed and a nullptr is returned. |
401 | | /// |
402 | | /// @tparam T The type of the layer to construct |
403 | | /// @tparam Args The types of the extra arguments to pass to the layer constructor |
404 | | /// @param[in] data The data to construct the layer from |
405 | | /// @param[in] dataLen The length of the data |
406 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor |
407 | | /// @return The constructed layer or nullptr if the data is invalid |
408 | | template <typename T, typename... Args> |
409 | | Layer* tryConstructNextLayer(uint8_t* data, size_t dataLen, Args&&... extraArgs) |
410 | 0 | { |
411 | 0 | return tryConstructNextLayer<T>(data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); |
412 | 0 | } |
413 | | |
414 | | /// Try to construct the next layer in the protocol stack. |
415 | | /// |
416 | | /// The method checks if the data is valid for the layer type T before constructing it by calling |
417 | | /// T::isDataValid(data, dataLen). If the data is invalid, no layer is constructed and a nullptr is returned. |
418 | | /// |
419 | | /// @tparam T The type of the layer to construct |
420 | | /// @tparam Args The types of the extra arguments to pass to the layer constructor |
421 | | /// @param[in] data The data to construct the layer from |
422 | | /// @param[in] dataLen The length of the data |
423 | | /// @param[in] packet The packet the layer belongs to |
424 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor |
425 | | /// @return The constructed layer or nullptr if the data is invalid |
426 | | template <typename T, typename... Args> |
427 | | Layer* tryConstructNextLayer(uint8_t* data, size_t dataLen, Packet* packet, Args&&... extraArgs) |
428 | 4.43M | { |
429 | 4.43M | if (T::isDataValid(data, dataLen)) |
430 | 4.37M | { |
431 | 4.37M | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); |
432 | 4.37M | } |
433 | 52.8k | return nullptr; |
434 | 4.43M | } pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IPv4Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 1.66M | { | 429 | 1.66M | if (T::isDataValid(data, dataLen)) | 430 | 1.64M | { | 431 | 1.64M | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 1.64M | } | 433 | 21.4k | return nullptr; | 434 | 1.66M | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IPv6Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 327k | { | 429 | 327k | if (T::isDataValid(data, dataLen)) | 430 | 323k | { | 431 | 323k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 323k | } | 433 | 4.10k | return nullptr; | 434 | 327k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::PPP_PPTPLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 90.9k | { | 429 | 90.9k | if (T::isDataValid(data, dataLen)) | 430 | 90.5k | { | 431 | 90.5k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 90.5k | } | 433 | 392 | return nullptr; | 434 | 90.9k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::EthLayer>(unsigned char*, unsigned long, pcpp::Packet*) Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::EthDot3Layer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::GtpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 9.10k | { | 429 | 9.10k | if (T::isDataValid(data, dataLen)) | 430 | 7.68k | { | 431 | 7.68k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 7.68k | } | 433 | 1.42k | return nullptr; | 434 | 9.10k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::UdpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 599k | { | 429 | 599k | if (T::isDataValid(data, dataLen)) | 430 | 597k | { | 431 | 597k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 597k | } | 433 | 2.50k | return nullptr; | 434 | 599k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::TcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 1.07M | { | 429 | 1.07M | if (T::isDataValid(data, dataLen)) | 430 | 1.06M | { | 431 | 1.06M | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 1.06M | } | 433 | 13.3k | return nullptr; | 434 | 1.07M | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IcmpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 60.3k | { | 429 | 60.3k | if (T::isDataValid(data, dataLen)) | 430 | 59.5k | { | 431 | 59.5k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 59.5k | } | 433 | 845 | return nullptr; | 434 | 60.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::GREv0Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 26.0k | { | 429 | 26.0k | if (T::isDataValid(data, dataLen)) | 430 | 26.0k | { | 431 | 26.0k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 26.0k | } | 433 | 0 | return nullptr; | 434 | 26.0k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::GREv1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 111k | { | 429 | 111k | if (T::isDataValid(data, dataLen)) | 430 | 111k | { | 431 | 111k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 111k | } | 433 | 0 | return nullptr; | 434 | 111k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV1Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 4.98k | { | 429 | 4.98k | if (T::isDataValid(data, dataLen)) | 430 | 4.98k | { | 431 | 4.98k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 4.98k | } | 433 | 0 | return nullptr; | 434 | 4.98k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 13.3k | { | 429 | 13.3k | if (T::isDataValid(data, dataLen)) | 430 | 13.3k | { | 431 | 13.3k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 13.3k | } | 433 | 0 | return nullptr; | 434 | 13.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV3QueryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 1.85k | { | 429 | 1.85k | if (T::isDataValid(data, dataLen)) | 430 | 1.85k | { | 431 | 1.85k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 1.85k | } | 433 | 0 | return nullptr; | 434 | 1.85k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::IgmpV3ReportLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 3.69k | { | 429 | 3.69k | if (T::isDataValid(data, dataLen)) | 430 | 3.69k | { | 431 | 3.69k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 3.69k | } | 433 | 0 | return nullptr; | 434 | 3.69k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::AuthenticationHeaderLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 5.81k | { | 429 | 5.81k | if (T::isDataValid(data, dataLen)) | 430 | 5.66k | { | 431 | 5.66k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 5.66k | } | 433 | 149 | return nullptr; | 434 | 5.81k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::ESPLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 5.30k | { | 429 | 5.30k | if (T::isDataValid(data, dataLen)) | 430 | 5.30k | { | 431 | 5.30k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 5.30k | } | 433 | 0 | return nullptr; | 434 | 5.30k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VrrpV2Layer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 13.6k | { | 429 | 13.6k | if (T::isDataValid(data, dataLen)) | 430 | 13.6k | { | 431 | 13.6k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 13.6k | } | 433 | 0 | return nullptr; | 434 | 13.6k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VrrpV3Layer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::Packet*, pcpp::IPAddress::AddressType&&) Line | Count | Source | 428 | 7.57k | { | 429 | 7.57k | if (T::isDataValid(data, dataLen)) | 430 | 7.57k | { | 431 | 7.57k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 7.57k | } | 433 | 0 | return nullptr; | 434 | 7.57k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::PPPoESessionLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 77.7k | { | 429 | 77.7k | if (T::isDataValid(data, dataLen)) | 430 | 77.5k | { | 431 | 77.5k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 77.5k | } | 433 | 128 | return nullptr; | 434 | 77.7k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::PPPoEDiscoveryLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 5.24k | { | 429 | 5.24k | if (T::isDataValid(data, dataLen)) | 430 | 5.24k | { | 431 | 5.24k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 5.24k | } | 433 | 0 | return nullptr; | 434 | 5.24k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::LLCLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 17.3k | { | 429 | 17.3k | if (T::isDataValid(data, dataLen)) | 430 | 15.7k | { | 431 | 15.7k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 15.7k | } | 433 | 1.54k | return nullptr; | 434 | 17.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::CotpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 31.4k | { | 429 | 31.4k | if (T::isDataValid(data, dataLen)) | 430 | 28.1k | { | 431 | 28.1k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 28.1k | } | 433 | 3.23k | return nullptr; | 434 | 31.4k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::DhcpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 32.6k | { | 429 | 32.6k | if (T::isDataValid(data, dataLen)) | 430 | 32.3k | { | 431 | 32.3k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 32.3k | } | 433 | 336 | return nullptr; | 434 | 32.6k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VxlanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 6.40k | { | 429 | 6.40k | if (T::isDataValid(data, dataLen)) | 430 | 6.40k | { | 431 | 6.40k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 6.40k | } | 433 | 0 | return nullptr; | 434 | 6.40k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::S7CommLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 19.7k | { | 429 | 19.7k | if (T::isDataValid(data, dataLen)) | 430 | 17.4k | { | 431 | 17.4k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 17.4k | } | 433 | 2.35k | return nullptr; | 434 | 19.7k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::ArpLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 14.9k | { | 429 | 14.9k | if (T::isDataValid(data, dataLen)) | 430 | 14.4k | { | 431 | 14.4k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 14.4k | } | 433 | 480 | return nullptr; | 434 | 14.9k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::VlanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 200k | { | 429 | 200k | if (T::isDataValid(data, dataLen)) | 430 | 200k | { | 431 | 200k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 200k | } | 433 | 258 | return nullptr; | 434 | 200k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::MplsLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 2.50k | { | 429 | 2.50k | if (T::isDataValid(data, dataLen)) | 430 | 2.50k | { | 431 | 2.50k | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 2.50k | } | 433 | 0 | return nullptr; | 434 | 2.50k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayer<pcpp::WakeOnLanLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 428 | 345 | { | 429 | 345 | if (T::isDataValid(data, dataLen)) | 430 | 63 | { | 431 | 63 | return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...); | 432 | 63 | } | 433 | 282 | return nullptr; | 434 | 345 | } |
|
435 | | |
436 | | /// @brief Try to construct the next layer in the protocol stack with a fallback option. |
437 | | /// |
438 | | /// This overload infers the Packet from the current layer. |
439 | | /// |
440 | | /// The method checks if the data is valid for the layer type T before constructing it by calling |
441 | | /// T::isDataValid(data, dataLen). If the data is invalid, it constructs the layer of type TFallback. |
442 | | /// |
443 | | /// @tparam T The type of the layer to construct |
444 | | /// @tparam TFallback The fallback layer type to construct if T fails |
445 | | /// @tparam Args The types of the extra arguments to pass to the layer constructor of T |
446 | | /// @param[in] data The data to construct the layer from |
447 | | /// @param[in] dataLen The length of the data |
448 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor of T |
449 | | /// @return The constructed layer of type T or TFallback |
450 | | /// @remarks The parameters extraArgs are forwarded to the factory function, but not to the TFallback |
451 | | /// constructor. |
452 | | template <typename T, typename TFallback, typename... Args> |
453 | | Layer* tryConstructNextLayerWithFallback(uint8_t* data, size_t dataLen, Args&&... extraArgs) |
454 | 2.78M | { |
455 | 2.78M | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), |
456 | 2.78M | std::forward<Args>(extraArgs)...); |
457 | 2.78M | } pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IPv4Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 1.66M | { | 455 | 1.66M | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 1.66M | std::forward<Args>(extraArgs)...); | 457 | 1.66M | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IPv6Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 320k | { | 455 | 320k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 320k | std::forward<Args>(extraArgs)...); | 457 | 320k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPP_PPTPLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 90.9k | { | 455 | 90.9k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 90.9k | std::forward<Args>(extraArgs)...); | 457 | 90.9k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::EthDot3Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long) pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GtpV2Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 9.10k | { | 455 | 9.10k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 9.10k | std::forward<Args>(extraArgs)...); | 457 | 9.10k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::UdpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 42.3k | { | 455 | 42.3k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 42.3k | std::forward<Args>(extraArgs)...); | 457 | 42.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::TcpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 229k | { | 455 | 229k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 229k | std::forward<Args>(extraArgs)...); | 457 | 229k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GREv0Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 9.76k | { | 455 | 9.76k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 9.76k | std::forward<Args>(extraArgs)...); | 457 | 9.76k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GREv1Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 5.30k | { | 455 | 5.30k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 5.30k | std::forward<Args>(extraArgs)...); | 457 | 5.30k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::AuthenticationHeaderLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::ESPLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 3.16k | { | 455 | 3.16k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 3.16k | std::forward<Args>(extraArgs)...); | 457 | 3.16k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPPoESessionLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 77.7k | { | 455 | 77.7k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 77.7k | std::forward<Args>(extraArgs)...); | 457 | 77.7k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPPoEDiscoveryLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 5.24k | { | 455 | 5.24k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 5.24k | std::forward<Args>(extraArgs)...); | 457 | 5.24k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::LLCLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 17.3k | { | 455 | 17.3k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 17.3k | std::forward<Args>(extraArgs)...); | 457 | 17.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::CotpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 31.4k | { | 455 | 31.4k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 31.4k | std::forward<Args>(extraArgs)...); | 457 | 31.4k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::DhcpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 32.6k | { | 455 | 32.6k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 32.6k | std::forward<Args>(extraArgs)...); | 457 | 32.6k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VxlanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 6.40k | { | 455 | 6.40k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 6.40k | std::forward<Args>(extraArgs)...); | 457 | 6.40k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::S7CommLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 19.7k | { | 455 | 19.7k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 19.7k | std::forward<Args>(extraArgs)...); | 457 | 19.7k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::ArpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 14.9k | { | 455 | 14.9k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 14.9k | std::forward<Args>(extraArgs)...); | 457 | 14.9k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VlanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 200k | { | 455 | 200k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 200k | std::forward<Args>(extraArgs)...); | 457 | 200k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::MplsLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 2.50k | { | 455 | 2.50k | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 2.50k | std::forward<Args>(extraArgs)...); | 457 | 2.50k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::WakeOnLanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long) Line | Count | Source | 454 | 345 | { | 455 | 345 | return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen, getAttachedPacket(), | 456 | 345 | std::forward<Args>(extraArgs)...); | 457 | 345 | } |
|
458 | | |
459 | | /// Try to construct the next layer in the protocol stack with a fallback option. |
460 | | /// |
461 | | /// The method checks if the data is valid for the layer type T before constructing it by calling |
462 | | /// T::isDataValid(data, dataLen). If the data is invalid, it constructs the layer of type TFallback. |
463 | | /// |
464 | | /// @tparam T The type of the layer to construct |
465 | | /// @tparam TFallback The fallback layer type to construct if T fails |
466 | | /// @tparam Args The types of the extra arguments to pass to the layer constructor of T |
467 | | /// @param[in] data The data to construct the layer from |
468 | | /// @param[in] dataLen The length of the data |
469 | | /// @param[in] packet The packet the layer belongs to |
470 | | /// @param[in] extraArgs Extra arguments to be forwarded to the layer constructor of T |
471 | | /// @return The constructed layer of type T or TFallback |
472 | | /// @remarks The parameters extraArgs are forwarded to the factory function, but not to the TFallback |
473 | | /// constructor. |
474 | | template <typename T, typename TFallback, typename... Args> |
475 | | Layer* tryConstructNextLayerWithFallback(uint8_t* data, size_t dataLen, Packet* packet, Args&&... extraArgs) |
476 | 4.43M | { |
477 | 4.43M | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) |
478 | 4.37M | { |
479 | 4.37M | return m_NextLayer; |
480 | 4.37M | } |
481 | | |
482 | 52.8k | return constructNextLayer<TFallback>(data, dataLen, packet); |
483 | 4.43M | } pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IPv4Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 1.66M | { | 477 | 1.66M | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 1.64M | { | 479 | 1.64M | return m_NextLayer; | 480 | 1.64M | } | 481 | | | 482 | 21.4k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 1.66M | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IPv6Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 327k | { | 477 | 327k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 323k | { | 479 | 323k | return m_NextLayer; | 480 | 323k | } | 481 | | | 482 | 4.10k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 327k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPP_PPTPLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 90.9k | { | 477 | 90.9k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 90.5k | { | 479 | 90.5k | return m_NextLayer; | 480 | 90.5k | } | 481 | | | 482 | 392 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 90.9k | } |
Unexecuted instantiation: pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::EthDot3Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GtpV2Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 9.10k | { | 477 | 9.10k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 7.68k | { | 479 | 7.68k | return m_NextLayer; | 480 | 7.68k | } | 481 | | | 482 | 1.42k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 9.10k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::UdpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 599k | { | 477 | 599k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 597k | { | 479 | 597k | return m_NextLayer; | 480 | 597k | } | 481 | | | 482 | 2.50k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 599k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::TcpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 1.07M | { | 477 | 1.07M | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 1.06M | { | 479 | 1.06M | return m_NextLayer; | 480 | 1.06M | } | 481 | | | 482 | 13.3k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 1.07M | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IcmpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 60.3k | { | 477 | 60.3k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 59.5k | { | 479 | 59.5k | return m_NextLayer; | 480 | 59.5k | } | 481 | | | 482 | 845 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 60.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GREv0Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 26.0k | { | 477 | 26.0k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 26.0k | { | 479 | 26.0k | return m_NextLayer; | 480 | 26.0k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 26.0k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::GREv1Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 111k | { | 477 | 111k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 111k | { | 479 | 111k | return m_NextLayer; | 480 | 111k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 111k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV1Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 4.98k | { | 477 | 4.98k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 4.98k | { | 479 | 4.98k | return m_NextLayer; | 480 | 4.98k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 4.98k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV2Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 13.3k | { | 477 | 13.3k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 13.3k | { | 479 | 13.3k | return m_NextLayer; | 480 | 13.3k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 13.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV3QueryLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 1.85k | { | 477 | 1.85k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 1.85k | { | 479 | 1.85k | return m_NextLayer; | 480 | 1.85k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 1.85k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::IgmpV3ReportLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 3.69k | { | 477 | 3.69k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 3.69k | { | 479 | 3.69k | return m_NextLayer; | 480 | 3.69k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 3.69k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::AuthenticationHeaderLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 5.81k | { | 477 | 5.81k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 5.66k | { | 479 | 5.66k | return m_NextLayer; | 480 | 5.66k | } | 481 | | | 482 | 149 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 5.81k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::ESPLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 5.30k | { | 477 | 5.30k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 5.30k | { | 479 | 5.30k | return m_NextLayer; | 480 | 5.30k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 5.30k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VrrpV2Layer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 13.6k | { | 477 | 13.6k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 13.6k | { | 479 | 13.6k | return m_NextLayer; | 480 | 13.6k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 13.6k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VrrpV3Layer, pcpp::PayloadLayer, pcpp::IPAddress::AddressType>(unsigned char*, unsigned long, pcpp::Packet*, pcpp::IPAddress::AddressType&&) Line | Count | Source | 476 | 7.57k | { | 477 | 7.57k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 7.57k | { | 479 | 7.57k | return m_NextLayer; | 480 | 7.57k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 7.57k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPPoESessionLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 77.7k | { | 477 | 77.7k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 77.5k | { | 479 | 77.5k | return m_NextLayer; | 480 | 77.5k | } | 481 | | | 482 | 128 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 77.7k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::PPPoEDiscoveryLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 5.24k | { | 477 | 5.24k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 5.24k | { | 479 | 5.24k | return m_NextLayer; | 480 | 5.24k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 5.24k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::LLCLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 17.3k | { | 477 | 17.3k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 15.7k | { | 479 | 15.7k | return m_NextLayer; | 480 | 15.7k | } | 481 | | | 482 | 1.54k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 17.3k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::CotpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 31.4k | { | 477 | 31.4k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 28.1k | { | 479 | 28.1k | return m_NextLayer; | 480 | 28.1k | } | 481 | | | 482 | 3.23k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 31.4k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::DhcpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 32.6k | { | 477 | 32.6k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 32.3k | { | 479 | 32.3k | return m_NextLayer; | 480 | 32.3k | } | 481 | | | 482 | 336 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 32.6k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VxlanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 6.40k | { | 477 | 6.40k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 6.40k | { | 479 | 6.40k | return m_NextLayer; | 480 | 6.40k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 6.40k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::S7CommLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 19.7k | { | 477 | 19.7k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 17.4k | { | 479 | 17.4k | return m_NextLayer; | 480 | 17.4k | } | 481 | | | 482 | 2.35k | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 19.7k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::ArpLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 14.9k | { | 477 | 14.9k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 14.4k | { | 479 | 14.4k | return m_NextLayer; | 480 | 14.4k | } | 481 | | | 482 | 480 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 14.9k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::VlanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 200k | { | 477 | 200k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 200k | { | 479 | 200k | return m_NextLayer; | 480 | 200k | } | 481 | | | 482 | 258 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 200k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::MplsLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 2.50k | { | 477 | 2.50k | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 2.50k | { | 479 | 2.50k | return m_NextLayer; | 480 | 2.50k | } | 481 | | | 482 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 2.50k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerWithFallback<pcpp::WakeOnLanLayer, pcpp::PayloadLayer>(unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 476 | 345 | { | 477 | 345 | if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...)) | 478 | 63 | { | 479 | 63 | return m_NextLayer; | 480 | 63 | } | 481 | | | 482 | 282 | return constructNextLayer<TFallback>(data, dataLen, packet); | 483 | 345 | } |
|
484 | | |
485 | | /// @brief Try to construct the next layer in the protocol stack using a factory functor with a fallback option. |
486 | | /// |
487 | | /// The method will attempt to construct the next layer using the provided factory function. |
488 | | /// If the factory function returns nullptr, indicating failure to create the layer, the method will then |
489 | | /// construct a layer of type TFallback. |
490 | | /// |
491 | | /// The factory functor is expected to have the following signature: |
492 | | /// Layer* factoryFn(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ...); |
493 | | /// |
494 | | /// This overload infers the Packet from the current layer. |
495 | | /// |
496 | | /// @tparam TFallback The fallback layer type to construct if the factory fails. |
497 | | /// @tparam TFactory The factory functor type. |
498 | | /// @tparam ...Args Parameter pack for extra arguments to pass to the factory functor. |
499 | | /// @param[in] factoryFn The factory functor to create the layer. |
500 | | /// @param[in] data The data to construct the layer from |
501 | | /// @param[in] dataLen The length of the data |
502 | | /// @param[in] extraArgs Extra arguments to be forwarded to the factory. |
503 | | /// @return The return value of the factory functor. |
504 | | /// @remarks The parameters extraArgs are forwarded to the factory function, but not to the TFallback |
505 | | /// constructor. |
506 | | template <typename TFallback, typename TFactory, typename... Args> |
507 | | Layer* tryConstructNextLayerFromFactoryWithFallback(TFactory factoryFn, uint8_t* data, size_t dataLen, |
508 | | Args&&... extraArgs) |
509 | 376k | { |
510 | | // Note that the fallback is first to allow template argument deduction of the factory type. |
511 | 376k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( |
512 | 376k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); |
513 | 376k | } pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 79.2k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 79.2k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 79.2k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 79.2k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::DoIpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::DoIpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 52.2k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 52.2k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 52.2k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 52.2k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 38.1k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 38.1k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 38.1k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 38.1k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::PostgresLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::PostgresLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 76 | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 76 | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 76 | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 76 | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::MySqlLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::MySqlLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 9.58k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 9.58k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 9.58k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 9.58k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*, unsigned short, unsigned short), unsigned short&, unsigned short&>(pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*, unsigned short, unsigned short), unsigned char*, unsigned long, unsigned short&, unsigned short&) Line | Count | Source | 509 | 112k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 112k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 112k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 112k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::WireGuardLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::WireGuardLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 3.33k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 3.33k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 3.33k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 3.33k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long) Line | Count | Source | 509 | 81.5k | { | 510 | | // Note that the fallback is first to allow template argument deduction of the factory type. | 511 | 81.5k | return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>( | 512 | 81.5k | factoryFn, data, dataLen, getAttachedPacket(), std::forward<Args>(extraArgs)...); | 513 | 81.5k | } |
|
514 | | |
515 | | /// @brief Try to construct the next layer in the protocol stack using a factory functor with a fallback option. |
516 | | /// |
517 | | /// The method will attempt to construct the next layer using the provided factory function. |
518 | | /// If the factory function returns nullptr, indicating failure to create the layer, the method will then |
519 | | /// construct a layer of type TFallback. |
520 | | /// |
521 | | /// The factory functor is expected to have the following signature: |
522 | | /// Layer* factoryFn(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ...); |
523 | | /// |
524 | | /// @tparam TFallback The fallback layer type to construct if the factory fails. |
525 | | /// @tparam TFactory The factory functor type. |
526 | | /// @tparam ...Args Parameter pack for extra arguments to pass to the factory functor. |
527 | | /// @param[in] factoryFn The factory functor to create the layer. |
528 | | /// @param[in] data The data to construct the layer from |
529 | | /// @param[in] dataLen The length of the data |
530 | | /// @param[in] packet The packet the layer belongs to |
531 | | /// @param[in] extraArgs Extra arguments to be forwarded to the factory. |
532 | | /// @return The return value of the factory functor. |
533 | | /// @remarks The parameters extraArgs are forwarded to the factory function, but not to the TFallback |
534 | | /// constructor. |
535 | | template <typename TFallback, typename TFactory, typename... Args> |
536 | | Layer* tryConstructNextLayerFromFactoryWithFallback(TFactory factoryFn, uint8_t* data, size_t dataLen, |
537 | | Packet* packet, Args&&... extraArgs) |
538 | 376k | { |
539 | 376k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, |
540 | 376k | std::forward<Args>(extraArgs)...); |
541 | 376k | if (nextLayer != nullptr) |
542 | 277k | { |
543 | 277k | return nextLayer; |
544 | 277k | } |
545 | | |
546 | | // factory failed, construct fallback layer |
547 | 99.2k | return constructNextLayer<TFallback>(data, dataLen, packet); |
548 | 376k | } pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::BgpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 79.2k | { | 539 | 79.2k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 79.2k | std::forward<Args>(extraArgs)...); | 541 | 79.2k | if (nextLayer != nullptr) | 542 | 74.1k | { | 543 | 74.1k | return nextLayer; | 544 | 74.1k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 5.12k | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 79.2k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::DoIpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::DoIpLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 52.2k | { | 539 | 52.2k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 52.2k | std::forward<Args>(extraArgs)...); | 541 | 52.2k | if (nextLayer != nullptr) | 542 | 52.0k | { | 543 | 52.0k | return nextLayer; | 544 | 52.0k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 182 | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 52.2k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::LdapLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 38.1k | { | 539 | 38.1k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 38.1k | std::forward<Args>(extraArgs)...); | 541 | 38.1k | if (nextLayer != nullptr) | 542 | 27.9k | { | 543 | 27.9k | return nextLayer; | 544 | 27.9k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 10.2k | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 38.1k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::PostgresLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::PostgresLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 76 | { | 539 | 76 | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 76 | std::forward<Args>(extraArgs)...); | 541 | 76 | if (nextLayer != nullptr) | 542 | 76 | { | 543 | 76 | return nextLayer; | 544 | 76 | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 76 | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::MySqlLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::MySqlLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 9.58k | { | 539 | 9.58k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 9.58k | std::forward<Args>(extraArgs)...); | 541 | 9.58k | if (nextLayer != nullptr) | 542 | 9.58k | { | 543 | 9.58k | return nextLayer; | 544 | 9.58k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 9.58k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*, unsigned short, unsigned short), unsigned short&, unsigned short&>(pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*, unsigned short, unsigned short), unsigned char*, unsigned long, pcpp::Packet*, unsigned short&, unsigned short&) Line | Count | Source | 538 | 112k | { | 539 | 112k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 112k | std::forward<Args>(extraArgs)...); | 541 | 112k | if (nextLayer != nullptr) | 542 | 107k | { | 543 | 107k | return nextLayer; | 544 | 107k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 4.75k | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 112k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::WireGuardLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::WireGuardLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 3.33k | { | 539 | 3.33k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 3.33k | std::forward<Args>(extraArgs)...); | 541 | 3.33k | if (nextLayer != nullptr) | 542 | 3.33k | { | 543 | 3.33k | return nextLayer; | 544 | 3.33k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 0 | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 3.33k | } |
pcpp::Layer* pcpp::Layer::tryConstructNextLayerFromFactoryWithFallback<pcpp::PayloadLayer, pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*)>(pcpp::SipLayer* (*)(unsigned char*, unsigned long, pcpp::Layer*, pcpp::Packet*), unsigned char*, unsigned long, pcpp::Packet*) Line | Count | Source | 538 | 81.5k | { | 539 | 81.5k | auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet, | 540 | 81.5k | std::forward<Args>(extraArgs)...); | 541 | 81.5k | if (nextLayer != nullptr) | 542 | 2.51k | { | 543 | 2.51k | return nextLayer; | 544 | 2.51k | } | 545 | | | 546 | | // factory failed, construct fallback layer | 547 | 79.0k | return constructNextLayer<TFallback>(data, dataLen, packet); | 548 | 81.5k | } |
|
549 | | |
550 | | /// @brief Check if the data is large enough to reinterpret as a type |
551 | | /// |
552 | | /// The data must be non-null and at least as large as the type |
553 | | /// |
554 | | /// @tparam T The type to reinterpret as |
555 | | /// @param data The data to check |
556 | | /// @param dataLen The length of the data |
557 | | /// @return True if the data is large enough to reinterpret as T, false otherwise |
558 | | template <typename T> static bool canReinterpretAs(const uint8_t* data, size_t dataLen) |
559 | 3.11M | { |
560 | 3.11M | return data != nullptr && dataLen >= sizeof(T); |
561 | 3.11M | } bool pcpp::Layer::canReinterpretAs<pcpp::arphdr>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 14.9k | { | 560 | 14.9k | return data != nullptr && dataLen >= sizeof(T); | 561 | 14.9k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::iphdr>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 1.70M | { | 560 | 1.70M | return data != nullptr && dataLen >= sizeof(T); | 561 | 1.70M | } |
bool pcpp::Layer::canReinterpretAs<pcpp::dhcp_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 32.6k | { | 560 | 32.6k | return data != nullptr && dataLen >= sizeof(T); | 561 | 32.6k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::vrrp_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 21.2k | { | 560 | 21.2k | return data != nullptr && dataLen >= sizeof(T); | 561 | 21.2k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::ip6_hdr>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 329k | { | 560 | 329k | return data != nullptr && dataLen >= sizeof(T); | 561 | 329k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::vlan_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 200k | { | 560 | 200k | return data != nullptr && dataLen >= sizeof(T); | 561 | 200k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::MplsLayer::mpls_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 2.50k | { | 560 | 2.50k | return data != nullptr && dataLen >= sizeof(T); | 561 | 2.50k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::igmp_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 18.2k | { | 560 | 18.2k | return data != nullptr && dataLen >= sizeof(T); | 561 | 18.2k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::igmpv3_query_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 1.85k | { | 560 | 1.85k | return data != nullptr && dataLen >= sizeof(T); | 561 | 1.85k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::igmpv3_report_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 3.69k | { | 560 | 3.69k | return data != nullptr && dataLen >= sizeof(T); | 561 | 3.69k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::ssl_tls_record_layer>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 488k | { | 560 | 488k | return data != nullptr && dataLen >= sizeof(T); | 561 | 488k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::tpkthdr>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 286k | { | 560 | 286k | return data != nullptr && dataLen >= sizeof(T); | 561 | 286k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::vxlan_header>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 6.40k | { | 560 | 6.40k | return data != nullptr && dataLen >= sizeof(T); | 561 | 6.40k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::stp_tcn_bpdu>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 1.60k | { | 560 | 1.60k | return data != nullptr && dataLen >= sizeof(T); | 561 | 1.60k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::stp_conf_bpdu>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 2.25k | { | 560 | 2.25k | return data != nullptr && dataLen >= sizeof(T); | 561 | 2.25k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::rstp_conf_bpdu>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 1.11k | { | 560 | 1.11k | return data != nullptr && dataLen >= sizeof(T); | 561 | 1.11k | } |
bool pcpp::Layer::canReinterpretAs<pcpp::mstp_conf_bpdu>(unsigned char const*, unsigned long) Line | Count | Source | 559 | 68 | { | 560 | 68 | return data != nullptr && dataLen >= sizeof(T); | 561 | 68 | } |
|
562 | | }; |
563 | | |
564 | | inline std::ostream& operator<<(std::ostream& os, const pcpp::Layer& layer) |
565 | 0 | { |
566 | 0 | os << layer.toString(); |
567 | 0 | return os; |
568 | 0 | } |
569 | | } // namespace pcpp |