26 virtual uint8_t*
getDataPtr(
size_t offset = 0)
const = 0;
128 return m_Packet !=
nullptr;
139 return static_cast<uint8_t*
>(m_Data + offset);
167 bool m_IsAllocatedInPacket;
170 : m_Data(nullptr), m_DataLen(0), m_Packet(nullptr), m_Protocol(
UnknownProtocol), m_NextLayer(nullptr),
171 m_PrevLayer(nullptr), m_IsAllocatedInPacket(false)
175 : m_Data(data), m_DataLen(dataLen), m_Packet(packet), m_Protocol(protocol), m_NextLayer(nullptr),
176 m_PrevLayer(prevLayer), m_IsAllocatedInPacket(false)
180 Layer(
const Layer& other);
181 Layer& operator=(
const Layer& other);
183 void setNextLayer(Layer* nextLayer)
185 m_NextLayer = nextLayer;
187 void setPrevLayer(Layer* prevLayer)
189 m_PrevLayer = prevLayer;
192 virtual bool extendLayer(
int offsetInLayer,
size_t numOfBytesToExtend);
193 virtual bool shortenLayer(
int offsetInLayer,
size_t numOfBytesToShorten);
195 bool hasNextLayer()
const
197 return m_NextLayer !=
nullptr;
208 template <
typename T,
typename... Args>
213 throw std::runtime_error(
"Next layer already exists");
216 Layer* newLayer =
new T(data, dataLen,
this, packet, std::forward<Args>(extraArgs)...);
217 setNextLayer(newLayer);
234 template <
typename T,
typename TFallback,
typename... Args>
237 if (tryConstructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...))
242 return constructNextLayer<TFallback>(data, dataLen, packet);
255 return data !=
nullptr && dataLen >=
sizeof(T);
271 template <
typename T,
typename... Args>
272 Layer* tryConstructNextLayer(uint8_t* data,
size_t dataLen,
Packet* packet, Args&&... extraArgs)
274 if (T::isDataValid(data, dataLen))
276 return constructNextLayer<T>(data, dataLen, packet, std::forward<Args>(extraArgs)...);
282 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
uint8_t * getLayerPayload() const
Definition: Layer.h:106
virtual std::string toString() const =0
size_t getDataLen() const
Definition: Layer.h:100
uint8_t * getDataPtr(size_t offset=0) const override
Definition: Layer.h:137
uint8_t * getData() const
Definition: Layer.h:94
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:209
bool isMemberOfProtocolFamily(ProtocolTypeFamily protocolTypeFamily) const
Layer * getNextLayer() const
Definition: Layer.h:71
bool isAllocatedToPacket() const
Definition: Layer.h:126
Layer * getPrevLayer() const
Definition: Layer.h:77
ProtocolType getProtocol() const
Definition: Layer.h:83
size_t getLayerPayloadSize() const
Definition: Layer.h:112
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:235
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:253
virtual OsiModelLayer getOsiModelLayer() const =0
The main namespace for the PcapPlusPlus lib.
uint8_t ProtocolType
Definition: ProtocolType.h:13
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
uint32_t ProtocolTypeFamily
Definition: ProtocolType.h:17
const ProtocolType UnknownProtocol
Unknown protocol (or unsupported by PcapPlusPlus)
Definition: ProtocolType.h:20