26 virtual uint8_t*
getDataPtr(
size_t offset = 0)
const = 0;
70 throw std::runtime_error(
"Layer is already attached to a Packet");
192 return static_cast<uint8_t*
>(m_Data + offset);
224 Layer() : m_Data(nullptr), m_DataLen(0), m_Protocol(
UnknownProtocol), m_NextLayer(nullptr), m_PrevLayer(nullptr)
228 : m_Data(data), m_DataLen(dataLen), m_Protocol(protocol), m_NextLayer(nullptr), m_PrevLayer(prevLayer),
229 m_AllocationInfo{ packet, false }
233 Layer(
const Layer& other);
234 Layer& operator=(
const Layer& other);
250 void setNextLayer(
Layer* nextLayer)
252 m_NextLayer = nextLayer;
254 void setPrevLayer(Layer* prevLayer)
256 m_PrevLayer = prevLayer;
259 virtual bool extendLayer(
int offsetInLayer,
size_t numOfBytesToExtend);
260 virtual bool shortenLayer(
int offsetInLayer,
size_t numOfBytesToShorten);
262 bool hasNextLayer()
const
264 return m_NextLayer !=
nullptr;
277 template <
typename T,
typename... Args>
280 return constructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
291 template <
typename T,
typename... Args>
296 throw std::runtime_error(
"Next layer already exists");
299 Layer* newLayer =
new T(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
300 setNextLayer(newLayer);
321 template <
typename TFactory,
typename... Args>
324 return constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen,
getAttachedPacket(),
325 std::forward<Args>(extraArgs)...);
344 template <
typename TFactory,
typename... Args>
350 throw std::runtime_error(
"Next layer already exists");
354 Layer* newLayer = factoryFn(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
355 setNextLayer(newLayer);
372 template <
typename T,
typename... Args>
375 return tryConstructNextLayer<T>(data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
390 template <
typename T,
typename... Args>
393 if (T::isDataValid(data, dataLen))
395 return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
416 template <
typename T,
typename TFallback,
typename... Args>
419 return tryConstructNextLayerWithFallback<T, TFallback>(data, dataLen,
getAttachedPacket(),
420 std::forward<Args>(extraArgs)...);
438 template <
typename T,
typename TFallback,
typename... Args>
441 if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
446 return constructNextLayer<TFallback>(data, dataLen, packet);
470 template <
typename TFallback,
typename TFactory,
typename... Args>
475 return tryConstructNextLayerFromFactoryWithFallback<TFallback, TFactory>(
476 factoryFn, data, dataLen,
getAttachedPacket(), std::forward<Args>(extraArgs)...);
499 template <
typename TFallback,
typename TFactory,
typename... Args>
501 Packet* packet, Args&&... extraArgs)
503 auto nextLayer = constructNextLayerFromFactory<TFactory>(factoryFn, data, dataLen, packet,
504 std::forward<Args>(extraArgs)...);
505 if (nextLayer !=
nullptr)
511 return constructNextLayer<TFallback>(data, dataLen, packet);
524 return data !=
nullptr && dataLen >=
sizeof(T);
528 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:322
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:500
uint8_t * getLayerPayload() const
Definition: Layer.h:159
virtual std::string toString() const =0
size_t getDataLen() const
Definition: Layer.h:153
uint8_t * getDataPtr(size_t offset=0) const override
Definition: Layer.h:190
uint8_t * getData() const
Definition: Layer.h:147
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:345
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:471
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:278
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:292
bool isMemberOfProtocolFamily(ProtocolTypeFamily protocolTypeFamily) const
Layer * getNextLayer() const
Definition: Layer.h:124
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:417
bool isAllocatedToPacket() const
Definition: Layer.h:179
Packet * getAttachedPacket()
Get a pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:238
Layer * getPrevLayer() const
Definition: Layer.h:130
ProtocolType getProtocol() const
Definition: Layer.h:136
size_t getLayerPayloadSize() const
Definition: Layer.h:165
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:439
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:522
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Args &&... extraArgs)
Definition: Layer.h:373
Packet const * getAttachedPacket() const
Get a pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:245
Layer * tryConstructNextLayer(uint8_t *data, size_t dataLen, Packet *packet, Args &&... extraArgs)
Definition: Layer.h:391
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:261
Holds information about a Layer's data and object ownership.
Definition: Layer.h:37
Packet * attachedPacket
Pointer to the Packet this layer is attached to (if any).
Definition: Layer.h:50
bool ownedByPacket
Controls if the layer object is considered owned by the attached Packet.
Definition: Layer.h:59
void detach()
Clears the attachment to any Packet, resetting to unmanaged state.
Definition: Layer.h:78
void attachPacket(Packet *packet, bool managed, bool force=false)
Sets the state of attachment to a specified Packet.
Definition: Layer.h:66