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 {
18  {
30 
37  };
38 
47  class Packet
48  {
49  friend class Layer;
50 
51  private:
52  RawPacket* m_RawPacket;
53  Layer* m_FirstLayer;
54  Layer* m_LastLayer;
55  size_t m_MaxPacketLen;
56  bool m_FreeRawPacket;
57  bool m_CanReallocateData;
58 
59  public:
65  explicit Packet(size_t maxPacketLen = 1, LinkLayerType linkType = LINKTYPE_ETHERNET);
66 
76  Packet(uint8_t* buffer, size_t bufferSize, LinkLayerType linkType = LINKTYPE_ETHERNET);
77 
94  explicit Packet(RawPacket* rawPacket, bool freeRawPacket = false, ProtocolType parseUntil = UnknownProtocol,
95  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
96 
106  explicit Packet(RawPacket* rawPacket, ProtocolType parseUntil);
107 
117  explicit Packet(RawPacket* rawPacket, ProtocolTypeFamily parseUntilFamily);
118 
130  explicit Packet(RawPacket* rawPacket, OsiModelLayer parseUntilLayer);
131 
136  virtual ~Packet()
137  {
138  destructPacketData();
139  }
140 
144  Packet(const Packet& other)
145  {
146  copyDataFrom(other);
147  }
148 
155  Packet& operator=(const Packet& other);
156 
160  {
161  return m_RawPacket;
162  }
163 
176  void setRawPacket(RawPacket* rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil = UnknownProtocol,
177  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
178 
192  void parsePacket(PacketParseOptions options, bool incrementalParsing = true);
193 
197  {
198  return m_RawPacket;
199  }
200 
204  {
205  return m_FirstLayer;
206  }
207 
211  {
212  return m_LastLayer;
213  }
214 
223  bool addLayer(Layer* newLayer, bool ownInPacket = false)
224  {
225  return insertLayer(m_LastLayer, newLayer, ownInPacket);
226  }
227 
238  bool insertLayer(Layer* prevLayer, Layer* newLayer, bool ownInPacket = false);
239 
252  bool removeLayer(ProtocolType layerType, int index = 0);
253 
259 
265 
275 
286  Layer* detachLayer(ProtocolType layerType, int index = 0);
287 
296  bool detachLayer(Layer* layer)
297  {
298  return removeLayer(layer, false);
299  }
300 
307  Layer* getLayerOfType(ProtocolType layerType, int index = 0) const;
308 
314  template <class TLayer> TLayer* getLayerOfType(bool reverseOrder = false) const;
315 
322  template <class TLayer> TLayer* getNextLayerOfType(Layer* startLayer) const;
323 
330  template <class TLayer> TLayer* getPrevLayerOfType(Layer* startLayer) const;
331 
335  bool isPacketOfType(ProtocolType protocolType) const;
336 
340  bool isPacketOfType(ProtocolTypeFamily protocolTypeFamily) const;
341 
345 
353  std::string toString(bool timeAsLocalTime = true) const;
354 
359  void toStringList(std::vector<std::string>& result, bool timeAsLocalTime = true) const;
360 
361  private:
362  void copyDataFrom(const Packet& other);
363 
364  void destructPacketData();
365  void destroyAllLayers();
366 
367  bool extendLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToExtend);
368  bool shortenLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToShorten);
369 
370  void reallocateRawData(size_t newSize);
371 
372  bool removeLayer(Layer* layer, bool tryToDelete);
373 
374  std::string printPacketInfo(bool timeAsLocalTime) const;
375 
376  Layer* createFirstLayer(LinkLayerType linkType);
377 
378  template <typename TLayer, typename NextLayerFn>
379  static TLayer* searchLayerStackForType(Layer* startLayer, NextLayerFn nextLayerFn, bool skipFirst);
380  }; // class Packet
381 
382  // implementation of inline methods
383 
384  template <class TLayer> TLayer* Packet::getLayerOfType(bool reverse) const
385  {
386  if (!reverse)
387  {
388  return searchLayerStackForType<TLayer>(
389  m_FirstLayer, [](Layer* layer) { return layer->getNextLayer(); }, false);
390  }
391 
392  // lookup in reverse order
393  return searchLayerStackForType<TLayer>(m_LastLayer, [](Layer* layer) { return layer->getPrevLayer(); }, false);
394  }
395 
396  template <class TLayer> TLayer* Packet::getNextLayerOfType(Layer* curLayer) const
397  {
398  return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getNextLayer(); }, true);
399  }
400 
401  template <class TLayer> TLayer* Packet::getPrevLayerOfType(Layer* curLayer) const
402  {
403  return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getPrevLayer(); }, true);
404  }
405 
406  template <typename TLayer, typename NextLayerFn>
407  TLayer* Packet::searchLayerStackForType(Layer* curLayer, NextLayerFn nextLayerFn, bool skipFirst)
408  {
409  if (curLayer == nullptr)
410  return nullptr;
411 
412  if (skipFirst)
413  {
414  curLayer = nextLayerFn(curLayer);
415  }
416 
417  while (curLayer != nullptr)
418  {
419  auto* curLayerCasted = dynamic_cast<TLayer*>(curLayer);
420  if (curLayerCasted != nullptr)
421  return curLayerCasted;
422 
423  curLayer = nextLayerFn(curLayer);
424  }
425 
426  return nullptr;
427  }
428 
429  inline std::ostream& operator<<(std::ostream& os, const pcpp::Packet& packet)
430  {
431  os << packet.toString();
432  return os;
433  }
434 } // namespace pcpp
Definition: Layer.h:115
Layer * getNextLayer() const
Definition: Layer.h:124
Layer * getPrevLayer() const
Definition: Layer.h:130
Definition: Packet.h:48
bool isPacketOfType(ProtocolType protocolType) const
bool insertLayer(Layer *prevLayer, Layer *newLayer, bool ownInPacket=false)
Packet(const Packet &other)
Definition: Packet.h:144
const RawPacket * getRawPacketReadOnly() const
Definition: Packet.h:196
Packet & operator=(const Packet &other)
bool removeLayer(ProtocolType layerType, int index=0)
bool removeFirstLayer()
virtual ~Packet()
Definition: Packet.h:136
Layer * detachLayer(ProtocolType layerType, int index=0)
RawPacket * getRawPacket() const
Definition: Packet.h:159
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:401
Packet(RawPacket *rawPacket, OsiModelLayer parseUntilLayer)
Layer * getLastLayer() const
Definition: Packet.h:210
std::string toString(bool timeAsLocalTime=true) const
TLayer * getNextLayerOfType(Layer *startLayer) const
Definition: Packet.h:396
Packet(RawPacket *rawPacket, ProtocolType parseUntil)
void parsePacket(PacketParseOptions options, bool incrementalParsing=true)
Parse the packet according to the provided options.
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:223
bool detachLayer(Layer *layer)
Definition: Packet.h:296
Packet(RawPacket *rawPacket, ProtocolTypeFamily parseUntilFamily)
Layer * getFirstLayer() const
Definition: Packet.h:203
Definition: RawPacket.h:261
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
@ OsiModelLayerUnknown
Unknown / null layer.
Definition: ProtocolType.h:277
LinkLayerType
An enum describing all known link layer type. Taken from: http://www.tcpdump.org/linktypes....
Definition: RawPacket.h:22
@ LINKTYPE_ETHERNET
IEEE 802.3 Ethernet.
Definition: RawPacket.h:26
Options struct for configuring packet parsing behavior.
Definition: Packet.h:18
ProtocolTypeFamily parseUntilProtocol
Defines the protocol type up to and including which the packet should be parsed (inclusive).
Definition: Packet.h:29
OsiModelLayer parseUntilLayer
Defines an OSI model layer up to and including which the packet should be parsed (inclusive).
Definition: Packet.h:36