28 virtual uint8_t*
getDataPtr(
size_t offset = 0)
const = 0;
72 throw std::runtime_error(
"Layer is already attached to a Packet");
207 size_t copyData(uint8_t* dest,
size_t destSize)
const;
214 static std::vector<FieldDescriptor>
all()
229 static constexpr uint16_t
MaxID = 1;
240 return static_cast<uint8_t*
>(m_Data + offset);
272 Layer() : m_Data(nullptr), m_DataLen(0), m_Protocol(
UnknownProtocol), m_NextLayer(nullptr), m_PrevLayer(nullptr)
276 : m_Data(data), m_DataLen(dataLen), m_Protocol(protocol), m_NextLayer(nullptr), m_PrevLayer(prevLayer),
277 m_AllocationInfo{ packet, false }
281 Layer(
const Layer& other);
282 Layer& operator=(
const Layer& other);
298 void setNextLayer(
Layer* nextLayer)
300 m_NextLayer = nextLayer;
302 void setPrevLayer(Layer* prevLayer)
304 m_PrevLayer = prevLayer;
323 virtual bool extendLayer(
int offsetInLayer,
size_t numOfBytesToExtend);
324 virtual bool shortenLayer(
int offsetInLayer,
size_t numOfBytesToShorten);
326 bool hasNextLayer()
const
328 return m_NextLayer !=
nullptr;
341 template <
typename T,
typename... Args>
344 return constructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
355 template <
typename T,
typename... Args>
360 throw std::runtime_error(
"Next layer already exists");
363 Layer* newLayer =
new T(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
364 setNextLayer(newLayer);
385 template <
typename TFactory,
typename... Args>
388 return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen,
getAttachedPacket(),
389 std::forward<Args>(extraArgs)...);
408 template <
typename TFactory,
typename... Args>
414 throw std::runtime_error(
"Next layer already exists");
418 Layer* newLayer = factoryFn(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
419 setNextLayer(newLayer);
436 template <
typename T,
typename... Args>
439 return tryConstructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
454 template <
typename T,
typename... Args>
457 if (T::isDataValid(data, dataLen))
459 return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
480 template <
typename T,
typename TFallback,
typename... Args>
483 return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen,
getAttachedPacket(),
484 std::forward<Args>(extraArgs)...);
502 template <
typename T,
typename TFallback,
typename... Args>
505 if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
510 return constructNextLayer<TFallback>(data, dataLen, packet);
534 template <
typename TFallback,
typename TFactory,
typename... Args>
539 return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
540 factoryFn, data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
563 template <
typename TFallback,
typename TFactory,
typename... Args>
565 Packet* packet, Args&&... extraArgs)
567 auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
568 std::forward<Args>(extraArgs)...);
569 if (nextLayer !=
nullptr)
575 return constructNextLayer<TFallback>(data, dataLen, packet);
588 return data !=
nullptr && dataLen >=
sizeof(T);
600 inline std::ostream& operator<<(std::ostream& os,
const pcpp::Layer& layer)
virtual uint8_t * getDataPtr(size_t offset=0) const =0
Definition: Serializers.h:78
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:386
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:564
uint8_t * getLayerPayload() const
Definition: Layer.h:161
virtual std::string toString() const =0
size_t getDataLen() const
Definition: Layer.h:155
uint8_t * getDataPtr(size_t offset=0) const override
Definition: Layer.h:238
uint8_t * getData() const
Definition: Layer.h:149
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:409
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:535
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:342
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:356
bool isMemberOfProtocolFamily(ProtocolTypeFamily protocolTypeFamily) const
Layer * getNextLayer() const
Definition: Layer.h:126
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:481
void serialize(ISerializer &serializer) const
virtual void serializeLayer(ObjectScope &serializer) const
Definition: Layer.h:596
bool isAllocatedToPacket() const
Definition: Layer.h:181
Packet * getAttachedPacket()
Get a pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:286
Layer * getPrevLayer() const
Definition: Layer.h:132
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:138
size_t getLayerPayloadSize() const
Definition: Layer.h:167
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:503
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:586
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Args &&... extraArgs)
Definition: Layer.h:437
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:293
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Definition: Layer.h:455
virtual OsiModelLayer getOsiModelLayer() const =0
Definition: Serializers.h:230
uint8_t ProtocolType
Definition: ProtocolType.h:38
uint32_t ProtocolTypeFamily
Definition: ProtocolType.h:42
const ProtocolType UnknownProtocol
Unknown protocol (or unsupported by PcapPlusPlus)
Definition: ProtocolType.h:45
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:420
Definition: Serializers.h:18
static std::vector< FieldDescriptor > all()
Definition: Layer.h:214
static const FieldDescriptor ProtocolId
Field descriptor for the layer protocol ID.
Definition: Layer.h:223
static const FieldDescriptor ProtocolName
Field descriptor for the layer protocol name.
Definition: Layer.h:220
static constexpr uint16_t MaxID
Maximum field ID used by the layer.
Definition: Layer.h:229
static const FieldDescriptor Length
Field descriptor for the layer length.
Definition: Layer.h:226
Holds information about a Layer's data and object ownership.
Definition: Layer.h:39
Packet * attachedPacket
Pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:52
bool ownedByPacket
Controls if the layer object is considered owned by the attached Packet.
Definition: Layer.h:61
void detach()
Clears the attachment to any Packet, resetting to unmanaged state.
Definition: Layer.h:80
void attachPacket(Packet *packet, bool managed, bool force=false)
Sets the state of attachment to a specified Packet.
Definition: Layer.h:68