27 virtual uint8_t*
getDataPtr(
size_t offset = 0)
const = 0;
71 throw std::runtime_error(
"Layer is already attached to a Packet");
193 return static_cast<uint8_t*
>(m_Data + offset);
225 Layer() : m_Data(nullptr), m_DataLen(0), m_Protocol(
UnknownProtocol), m_NextLayer(nullptr), m_PrevLayer(nullptr)
229 : m_Data(data), m_DataLen(dataLen), m_Protocol(protocol), m_NextLayer(nullptr), m_PrevLayer(prevLayer),
230 m_AllocationInfo{ packet, false }
234 Layer(
const Layer& other);
235 Layer& operator=(
const Layer& other);
251 void setNextLayer(
Layer* nextLayer)
253 m_NextLayer = nextLayer;
255 void setPrevLayer(Layer* prevLayer)
257 m_PrevLayer = prevLayer;
260 virtual bool extendLayer(
int offsetInLayer,
size_t numOfBytesToExtend);
261 virtual bool shortenLayer(
int offsetInLayer,
size_t numOfBytesToShorten);
263 bool hasNextLayer()
const
265 return m_NextLayer !=
nullptr;
278 template <
typename T,
typename... Args>
281 return constructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
292 template <
typename T,
typename... Args>
297 throw std::runtime_error(
"Next layer already exists");
300 Layer* newLayer =
new T(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
301 setNextLayer(newLayer);
322 template <
typename TFactory,
typename... Args>
325 return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen,
getAttachedPacket(),
326 std::forward<Args>(extraArgs)...);
345 template <
typename TFactory,
typename... Args>
351 throw std::runtime_error(
"Next layer already exists");
355 Layer* newLayer = factoryFn(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
356 setNextLayer(newLayer);
373 template <
typename T,
typename... Args>
376 return tryConstructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
391 template <
typename T,
typename... Args>
394 if (T::isDataValid(data, dataLen))
396 return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
417 template <
typename T,
typename TFallback,
typename... Args>
420 return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen,
getAttachedPacket(),
421 std::forward<Args>(extraArgs)...);
439 template <
typename T,
typename TFallback,
typename... Args>
442 if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
447 return constructNextLayer<TFallback>(data, dataLen, packet);
471 template <
typename TFallback,
typename TFactory,
typename... Args>
476 return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
477 factoryFn, data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
500 template <
typename TFallback,
typename TFactory,
typename... Args>
502 Packet* packet, Args&&... extraArgs)
504 auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
505 std::forward<Args>(extraArgs)...);
506 if (nextLayer !=
nullptr)
512 return constructNextLayer<TFallback>(data, dataLen, packet);
525 return data !=
nullptr && dataLen >=
sizeof(T);
529 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
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:323
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:501
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:191
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:346
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:472
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:279
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:293
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:418
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:239
Layer * getPrevLayer() const
Definition: Layer.h:131
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:440
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:523
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Args &&... extraArgs)
Definition: Layer.h:374
Packet const * getAttachedPacket() const
Get a pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:246
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Definition: Layer.h:392
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