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 
98  explicit Packet(RawPacket* rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil,
99  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
100 
110  explicit Packet(RawPacket* rawPacket, ProtocolType parseUntil);
111 
121  explicit Packet(RawPacket* rawPacket, ProtocolTypeFamily parseUntilFamily);
122 
134  explicit Packet(RawPacket* rawPacket, OsiModelLayer parseUntilLayer);
135 
140  virtual ~Packet()
141  {
142  destructPacketData();
143  }
144 
148  Packet(const Packet& other)
149  {
150  copyDataFrom(other);
151  }
152 
159  Packet& operator=(const Packet& other);
160 
164  {
165  return m_RawPacket;
166  }
167 
180  void setRawPacket(RawPacket* rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil = UnknownProtocol,
181  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
182 
196  void parsePacket(PacketParseOptions options, bool incrementalParsing = true);
197 
201  {
202  return m_RawPacket;
203  }
204 
208  {
209  return m_FirstLayer;
210  }
211 
215  {
216  return m_LastLayer;
217  }
218 
227  bool addLayer(Layer* newLayer, bool ownInPacket = false)
228  {
229  return insertLayer(m_LastLayer, newLayer, ownInPacket);
230  }
231 
242  bool insertLayer(Layer* prevLayer, Layer* newLayer, bool ownInPacket = false);
243 
256  bool removeLayer(ProtocolType layerType, int index = 0);
257 
263 
269 
279 
290  Layer* detachLayer(ProtocolType layerType, int index = 0);
291 
300  bool detachLayer(Layer* layer)
301  {
302  return removeLayer(layer, false);
303  }
304 
311  Layer* getLayerOfType(ProtocolType layerType, int index = 0) const;
312 
318  template <class TLayer> TLayer* getLayerOfType(bool reverseOrder = false) const;
319 
326  template <class TLayer> TLayer* getNextLayerOfType(Layer* startLayer) const;
327 
334  template <class TLayer> TLayer* getPrevLayerOfType(Layer* startLayer) const;
335 
339  bool isPacketOfType(ProtocolType protocolType) const;
340 
344  bool isPacketOfType(ProtocolTypeFamily protocolTypeFamily) const;
345 
349 
357  std::string toString(bool timeAsLocalTime = true) const;
358 
363  void toStringList(std::vector<std::string>& result, bool timeAsLocalTime = true) const;
364 
365  private:
366  void copyDataFrom(const Packet& other);
367 
368  void destructPacketData();
369  void destroyAllLayers();
370 
371  bool extendLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToExtend);
372  bool shortenLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToShorten);
373 
374  void reallocateRawData(size_t newSize);
375 
376  bool removeLayer(Layer* layer, bool tryToDelete);
377 
378  std::string printPacketInfo(bool timeAsLocalTime) const;
379 
380  Layer* createFirstLayer(LinkLayerType linkType);
381 
382  template <typename TLayer, typename NextLayerFn>
383  static TLayer* searchLayerStackForType(Layer* startLayer, NextLayerFn nextLayerFn, bool skipFirst);
384  }; // class Packet
385 
386  // implementation of inline methods
387 
388  template <class TLayer> TLayer* Packet::getLayerOfType(bool reverse) const
389  {
390  if (!reverse)
391  {
392  return searchLayerStackForType<TLayer>(
393  m_FirstLayer, [](Layer* layer) { return layer->getNextLayer(); }, false);
394  }
395 
396  // lookup in reverse order
397  return searchLayerStackForType<TLayer>(m_LastLayer, [](Layer* layer) { return layer->getPrevLayer(); }, false);
398  }
399 
400  template <class TLayer> TLayer* Packet::getNextLayerOfType(Layer* curLayer) const
401  {
402  return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getNextLayer(); }, true);
403  }
404 
405  template <class TLayer> TLayer* Packet::getPrevLayerOfType(Layer* curLayer) const
406  {
407  return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getPrevLayer(); }, true);
408  }
409 
410  template <typename TLayer, typename NextLayerFn>
411  TLayer* Packet::searchLayerStackForType(Layer* curLayer, NextLayerFn nextLayerFn, bool skipFirst)
412  {
413  if (curLayer == nullptr)
414  return nullptr;
415 
416  if (skipFirst)
417  {
418  curLayer = nextLayerFn(curLayer);
419  }
420 
421  while (curLayer != nullptr)
422  {
423  auto* curLayerCasted = dynamic_cast<TLayer*>(curLayer);
424  if (curLayerCasted != nullptr)
425  return curLayerCasted;
426 
427  curLayer = nextLayerFn(curLayer);
428  }
429 
430  return nullptr;
431  }
432 
433  inline std::ostream& operator<<(std::ostream& os, const pcpp::Packet& packet)
434  {
435  os << packet.toString();
436  return os;
437  }
438 } // namespace pcpp
Definition: Layer.h:116
Layer * getNextLayer() const
Definition: Layer.h:125
Layer * getPrevLayer() const
Definition: Layer.h:131
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:148
const RawPacket * getRawPacketReadOnly() const
Definition: Packet.h:200
Packet & operator=(const Packet &other)
bool removeLayer(ProtocolType layerType, int index=0)
bool removeFirstLayer()
Packet(RawPacket *rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil, OsiModelLayer parseUntilLayer=OsiModelLayerUnknown)
virtual ~Packet()
Definition: Packet.h:140
Layer * detachLayer(ProtocolType layerType, int index=0)
RawPacket * getRawPacket() const
Definition: Packet.h:163
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:405
Packet(RawPacket *rawPacket, OsiModelLayer parseUntilLayer)
Layer * getLastLayer() const
Definition: Packet.h:214
std::string toString(bool timeAsLocalTime=true) const
TLayer * getNextLayerOfType(Layer *startLayer) const
Definition: Packet.h:400
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:227
bool detachLayer(Layer *layer)
Definition: Packet.h:300
Packet(RawPacket *rawPacket, ProtocolTypeFamily parseUntilFamily)
Layer * getFirstLayer() const
Definition: Packet.h:207
Definition: RawPacket.h:290
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:267
@ OsiModelLayerUnknown
Unknown / null layer.
Definition: ProtocolType.h:283
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