PcapPlusPlus  Next
Packet.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "RawPacket.h"
4 #include "Layer.h"
5 #include <vector>
6 
8 
11 namespace pcpp
12 {
21  class Packet
22  {
23  friend class Layer;
24 
25  private:
26  RawPacket* m_RawPacket;
27  Layer* m_FirstLayer;
28  Layer* m_LastLayer;
29  size_t m_MaxPacketLen;
30  bool m_FreeRawPacket;
31  bool m_CanReallocateData;
32 
33  public:
39  explicit Packet(size_t maxPacketLen = 1, LinkLayerType linkType = LINKTYPE_ETHERNET);
40 
50  Packet(uint8_t* buffer, size_t bufferSize, LinkLayerType linkType = LINKTYPE_ETHERNET);
51 
68  explicit Packet(RawPacket* rawPacket, bool freeRawPacket = false, ProtocolType parseUntil = UnknownProtocol,
69  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
70 
80  explicit Packet(RawPacket* rawPacket, ProtocolType parseUntil);
81 
91  explicit Packet(RawPacket* rawPacket, ProtocolTypeFamily parseUntilFamily);
92 
104  explicit Packet(RawPacket* rawPacket, OsiModelLayer parseUntilLayer);
105 
110  virtual ~Packet()
111  {
112  destructPacketData();
113  }
114 
118  Packet(const Packet& other)
119  {
120  copyDataFrom(other);
121  }
122 
129  Packet& operator=(const Packet& other);
130 
134  {
135  return m_RawPacket;
136  }
137 
150  void setRawPacket(RawPacket* rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil = UnknownProtocol,
151  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
152 
156  {
157  return m_RawPacket;
158  }
159 
163  {
164  return m_FirstLayer;
165  }
166 
170  {
171  return m_LastLayer;
172  }
173 
182  bool addLayer(Layer* newLayer, bool ownInPacket = false)
183  {
184  return insertLayer(m_LastLayer, newLayer, ownInPacket);
185  }
186 
197  bool insertLayer(Layer* prevLayer, Layer* newLayer, bool ownInPacket = false);
198 
211  bool removeLayer(ProtocolType layerType, int index = 0);
212 
218 
224 
234 
245  Layer* detachLayer(ProtocolType layerType, int index = 0);
246 
255  bool detachLayer(Layer* layer)
256  {
257  return removeLayer(layer, false);
258  }
259 
266  Layer* getLayerOfType(ProtocolType layerType, int index = 0) const;
267 
273  template <class TLayer> TLayer* getLayerOfType(bool reverseOrder = false) const;
274 
281  template <class TLayer> TLayer* getNextLayerOfType(Layer* startLayer) const;
282 
289  template <class TLayer> TLayer* getPrevLayerOfType(Layer* startLayer) const;
290 
294  bool isPacketOfType(ProtocolType protocolType) const;
295 
299  bool isPacketOfType(ProtocolTypeFamily protocolTypeFamily) const;
300 
304 
312  std::string toString(bool timeAsLocalTime = true) const;
313 
318  void toStringList(std::vector<std::string>& result, bool timeAsLocalTime = true) const;
319 
320  private:
321  void copyDataFrom(const Packet& other);
322 
323  void destructPacketData();
324 
325  bool extendLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToExtend);
326  bool shortenLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToShorten);
327 
328  void reallocateRawData(size_t newSize);
329 
330  bool removeLayer(Layer* layer, bool tryToDelete);
331 
332  std::string printPacketInfo(bool timeAsLocalTime) const;
333 
334  Layer* createFirstLayer(LinkLayerType linkType);
335  }; // class Packet
336 
337  // implementation of inline methods
338 
339  template <class TLayer> TLayer* Packet::getLayerOfType(bool reverse) const
340  {
341  if (!reverse)
342  {
343  if (dynamic_cast<TLayer*>(getFirstLayer()) != nullptr)
344  return dynamic_cast<TLayer*>(getFirstLayer());
345 
346  return getNextLayerOfType<TLayer>(getFirstLayer());
347  }
348 
349  // lookup in reverse order
350  if (dynamic_cast<TLayer*>(getLastLayer()) != nullptr)
351  return dynamic_cast<TLayer*>(getLastLayer());
352 
353  return getPrevLayerOfType<TLayer>(getLastLayer());
354  }
355 
356  template <class TLayer> TLayer* Packet::getNextLayerOfType(Layer* curLayer) const
357  {
358  if (curLayer == nullptr)
359  return nullptr;
360 
361  curLayer = curLayer->getNextLayer();
362  while ((curLayer != nullptr) && (dynamic_cast<TLayer*>(curLayer) == nullptr))
363  {
364  curLayer = curLayer->getNextLayer();
365  }
366 
367  return dynamic_cast<TLayer*>(curLayer);
368  }
369 
370  template <class TLayer> TLayer* Packet::getPrevLayerOfType(Layer* curLayer) const
371  {
372  if (curLayer == nullptr)
373  return nullptr;
374 
375  curLayer = curLayer->getPrevLayer();
376  while (curLayer != nullptr && dynamic_cast<TLayer*>(curLayer) == nullptr)
377  {
378  curLayer = curLayer->getPrevLayer();
379  }
380 
381  return dynamic_cast<TLayer*>(curLayer);
382  }
383 
384  inline std::ostream& operator<<(std::ostream& os, const pcpp::Packet& packet)
385  {
386  os << packet.toString();
387  return os;
388  }
389 } // namespace pcpp
Definition: Layer.h:60
Layer * getNextLayer() const
Definition: Layer.h:69
Layer * getPrevLayer() const
Definition: Layer.h:75
Definition: Packet.h:22
bool isPacketOfType(ProtocolType protocolType) const
bool insertLayer(Layer *prevLayer, Layer *newLayer, bool ownInPacket=false)
Packet(const Packet &other)
Definition: Packet.h:118
const RawPacket * getRawPacketReadOnly() const
Definition: Packet.h:155
Packet & operator=(const Packet &other)
bool removeLayer(ProtocolType layerType, int index=0)
bool removeFirstLayer()
virtual ~Packet()
Definition: Packet.h:110
Layer * detachLayer(ProtocolType layerType, int index=0)
RawPacket * getRawPacket() const
Definition: Packet.h:133
bool isPacketOfType(ProtocolTypeFamily protocolTypeFamily) const
Packet(uint8_t *buffer, size_t bufferSize, LinkLayerType linkType=LINKTYPE_ETHERNET)
bool removeAllLayersAfter(Layer *layer)
void setRawPacket(RawPacket *rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil=UnknownProtocol, OsiModelLayer parseUntilLayer=OsiModelLayerUnknown)
Layer * getLayerOfType(ProtocolType layerType, int index=0) const
TLayer * getPrevLayerOfType(Layer *startLayer) const
Definition: Packet.h:370
Packet(RawPacket *rawPacket, OsiModelLayer parseUntilLayer)
Layer * getLastLayer() const
Definition: Packet.h:169
std::string toString(bool timeAsLocalTime=true) const
TLayer * getNextLayerOfType(Layer *startLayer) const
Definition: Packet.h:356
Packet(RawPacket *rawPacket, ProtocolType parseUntil)
Packet(RawPacket *rawPacket, bool freeRawPacket=false, ProtocolType parseUntil=UnknownProtocol, OsiModelLayer parseUntilLayer=OsiModelLayerUnknown)
void computeCalculateFields()
void toStringList(std::vector< std::string > &result, bool timeAsLocalTime=true) const
bool removeLastLayer()
Packet(size_t maxPacketLen=1, LinkLayerType linkType=LINKTYPE_ETHERNET)
bool addLayer(Layer *newLayer, bool ownInPacket=false)
Definition: Packet.h:182
bool detachLayer(Layer *layer)
Definition: Packet.h:255
Packet(RawPacket *rawPacket, ProtocolTypeFamily parseUntilFamily)
Layer * getFirstLayer() const
Definition: Packet.h:162
Definition: RawPacket.h:259
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
@ OsiModelLayerUnknown
Unknown / null layer.
Definition: ProtocolType.h:241
uint32_t ProtocolTypeFamily
Definition: ProtocolType.h:17
LinkLayerType
An enum describing all known link layer type. Taken from: http://www.tcpdump.org/linktypes....
Definition: RawPacket.h:20
@ LINKTYPE_ETHERNET
IEEE 802.3 Ethernet.
Definition: RawPacket.h:24
const ProtocolType UnknownProtocol
Unknown protocol (or unsupported by PcapPlusPlus)
Definition: ProtocolType.h:20