27 virtual uint8_t*
getDataPtr(
size_t offset = 0)
const = 0;
71 throw std::runtime_error(
"Layer is already attached to a Packet");
206 size_t copyData(uint8_t* dest,
size_t destSize)
const;
212 return static_cast<uint8_t*
>(m_Data + offset);
244 Layer() : m_Data(nullptr), m_DataLen(0), m_Protocol(
UnknownProtocol), m_NextLayer(nullptr), m_PrevLayer(nullptr)
248 : m_Data(data), m_DataLen(dataLen), m_Protocol(protocol), m_NextLayer(nullptr), m_PrevLayer(prevLayer),
249 m_AllocationInfo{ packet, false }
253 Layer(
const Layer& other);
254 Layer& operator=(
const Layer& other);
270 void setNextLayer(
Layer* nextLayer)
272 m_NextLayer = nextLayer;
274 void setPrevLayer(Layer* prevLayer)
276 m_PrevLayer = prevLayer;
295 virtual bool extendLayer(
int offsetInLayer,
size_t numOfBytesToExtend);
296 virtual bool shortenLayer(
int offsetInLayer,
size_t numOfBytesToShorten);
298 bool hasNextLayer()
const
300 return m_NextLayer !=
nullptr;
313 template <
typename T,
typename... Args>
316 return constructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
327 template <
typename T,
typename... Args>
332 throw std::runtime_error(
"Next layer already exists");
335 Layer* newLayer =
new T(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
336 setNextLayer(newLayer);
357 template <
typename TFactory,
typename... Args>
360 return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen,
getAttachedPacket(),
361 std::forward<Args>(extraArgs)...);
380 template <
typename TFactory,
typename... Args>
386 throw std::runtime_error(
"Next layer already exists");
390 Layer* newLayer = factoryFn(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
391 setNextLayer(newLayer);
408 template <
typename T,
typename... Args>
411 return tryConstructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
426 template <
typename T,
typename... Args>
429 if (T::isDataValid(data, dataLen))
431 return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
452 template <
typename T,
typename TFallback,
typename... Args>
455 return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen,
getAttachedPacket(),
456 std::forward<Args>(extraArgs)...);
474 template <
typename T,
typename TFallback,
typename... Args>
477 if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
482 return constructNextLayer<TFallback>(data, dataLen, packet);
506 template <
typename TFallback,
typename TFactory,
typename... Args>
511 return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
512 factoryFn, data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
535 template <
typename TFallback,
typename TFactory,
typename... Args>
537 Packet* packet, Args&&... extraArgs)
539 auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
540 std::forward<Args>(extraArgs)...);
541 if (nextLayer !=
nullptr)
547 return constructNextLayer<TFallback>(data, dataLen, packet);
560 return data !=
nullptr && dataLen >=
sizeof(T);
564 inline std::ostream& operator<<(std::ostream& os,
const pcpp::Layer& layer)
virtual uint8_t * getDataPtr(size_t offset=0) const =0
void copyData(uint8_t *toArr) const
Copy the raw data of this layer to another array.
Layer * constructNextLayerFromFactory(TFactory factoryFn, uint8_t *data, size_t dataLen, Args &&... extraArgs)
Construct the next layer in the protocol stack using a factory functor.
Definition: Layer.h:358
Layer * tryConstructNextLayerFromFactoryWithFallback(TFactory factoryFn, uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Try to construct the next layer in the protocol stack using a factory functor with a fallback option.
Definition: Layer.h:536
uint8_t * getLayerPayload() const
Definition: Layer.h:160
virtual std::string toString() const =0
size_t getDataLen() const
Definition: Layer.h:154
uint8_t * getDataPtr(size_t offset=0) const override
Definition: Layer.h:210
uint8_t * getData() const
Definition: Layer.h:148
Layer * constructNextLayerFromFactory(TFactory factoryFn, uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Construct the next layer in the protocol stack using a factory functor.
Definition: Layer.h:381
Layer * tryConstructNextLayerFromFactoryWithFallback(TFactory factoryFn, uint8_t *data, size_t dataLen, Args &&... extraArgs)
Try to construct the next layer in the protocol stack using a factory functor with a fallback option.
Definition: Layer.h:507
Layer * constructNextLayer(uint8_t *data, size_t dataLen, Args &&... extraArgs)
Construct the next layer in the protocol stack. No validation is performed on the data.
Definition: Layer.h:314
virtual void parseNextLayer()=0
Each layer is responsible for parsing the next layer.
Layer * constructNextLayer(uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Definition: Layer.h:328
bool isMemberOfProtocolFamily(ProtocolTypeFamily protocolTypeFamily) const
Layer * getNextLayer() const
Definition: Layer.h:125
Layer * tryConstructNextLayerWithFallback(uint8_t *data, size_t dataLen, Args &&... extraArgs)
Try to construct the next layer in the protocol stack with a fallback option.
Definition: Layer.h:453
bool isAllocatedToPacket() const
Definition: Layer.h:180
Packet * getAttachedPacket()
Get a pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:258
Layer * getPrevLayer() const
Definition: Layer.h:131
void allocData(size_t dataLen, bool zeroInit=true)
Requests the layer to allocate a new data buffer of the specified length.
ProtocolType getProtocol() const
Definition: Layer.h:137
size_t getLayerPayloadSize() const
Definition: Layer.h:166
virtual void computeCalculateFields()=0
Each layer can compute field values automatically using this method. This is an abstract method.
Layer * tryConstructNextLayerWithFallback(uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Definition: Layer.h:475
virtual size_t getHeaderLen() const =0
static bool canReinterpretAs(const uint8_t *data, size_t dataLen)
Check if the data is large enough to reinterpret as a type.
Definition: Layer.h:558
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Args &&... extraArgs)
Definition: Layer.h:409
size_t copyData(uint8_t *dest, size_t destSize) const
Copy the raw data of this layer to another array, with a specified maximum size.
Packet const * getAttachedPacket() const
Get a pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:265
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Definition: Layer.h:427
virtual OsiModelLayer getOsiModelLayer() const =0
uint8_t ProtocolType
Definition: ProtocolType.h:35
uint32_t ProtocolTypeFamily
Definition: ProtocolType.h:39
const ProtocolType UnknownProtocol
Unknown protocol (or unsupported by PcapPlusPlus)
Definition: ProtocolType.h:42
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:267
Holds information about a Layer's data and object ownership.
Definition: Layer.h:38
Packet * attachedPacket
Pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:51
bool ownedByPacket
Controls if the layer object is considered owned by the attached Packet.
Definition: Layer.h:60
void detach()
Clears the attachment to any Packet, resetting to unmanaged state.
Definition: Layer.h:79
void attachPacket(Packet *packet, bool managed, bool force=false)
Sets the state of attachment to a specified Packet.
Definition: Layer.h:67