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 "Serializers.h"
6 #include <vector>
7 
9 
12 namespace pcpp
13 {
19  {
31 
38  };
39 
48  class Packet
49  {
50  friend class Layer;
51 
52  private:
53  RawPacket* m_RawPacket;
54  Layer* m_FirstLayer;
55  Layer* m_LastLayer;
56  size_t m_MaxPacketLen;
57  bool m_FreeRawPacket;
58  bool m_CanReallocateData;
59 
60  public:
66  explicit Packet(size_t maxPacketLen = 1, LinkLayerType linkType = LINKTYPE_ETHERNET);
67 
77  Packet(uint8_t* buffer, size_t bufferSize, LinkLayerType linkType = LINKTYPE_ETHERNET);
78 
95  explicit Packet(RawPacket* rawPacket, bool freeRawPacket = false, ProtocolType parseUntil = UnknownProtocol,
96  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
97 
99  explicit Packet(RawPacket* rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil,
100  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
101 
111  explicit Packet(RawPacket* rawPacket, ProtocolType parseUntil);
112 
122  explicit Packet(RawPacket* rawPacket, ProtocolTypeFamily parseUntilFamily);
123 
135  explicit Packet(RawPacket* rawPacket, OsiModelLayer parseUntilLayer);
136 
141  virtual ~Packet()
142  {
143  destructPacketData();
144  }
145 
149  Packet(const Packet& other)
150  {
151  copyDataFrom(other);
152  }
153 
160  Packet& operator=(const Packet& other);
161 
165  {
166  return m_RawPacket;
167  }
168 
181  void setRawPacket(RawPacket* rawPacket, bool freeRawPacket, ProtocolTypeFamily parseUntil = UnknownProtocol,
182  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
183 
197  void parsePacket(PacketParseOptions options, bool incrementalParsing = true);
198 
202  {
203  return m_RawPacket;
204  }
205 
209  {
210  return m_FirstLayer;
211  }
212 
216  {
217  return m_LastLayer;
218  }
219 
228  bool addLayer(Layer* newLayer, bool ownInPacket = false)
229  {
230  return insertLayer(m_LastLayer, newLayer, ownInPacket);
231  }
232 
243  bool insertLayer(Layer* prevLayer, Layer* newLayer, bool ownInPacket = false);
244 
257  bool removeLayer(ProtocolType layerType, int index = 0);
258 
264 
270 
280 
291  Layer* detachLayer(ProtocolType layerType, int index = 0);
292 
301  bool detachLayer(Layer* layer)
302  {
303  return removeLayer(layer, false);
304  }
305 
312  Layer* getLayerOfType(ProtocolType layerType, int index = 0) const;
313 
319  template <class TLayer> TLayer* getLayerOfType(bool reverseOrder = false) const;
320 
327  template <class TLayer> TLayer* getNextLayerOfType(Layer* startLayer) const;
328 
335  template <class TLayer> TLayer* getPrevLayerOfType(Layer* startLayer) const;
336 
340  bool isPacketOfType(ProtocolType protocolType) const;
341 
345  bool isPacketOfType(ProtocolTypeFamily protocolTypeFamily) const;
346 
350 
358  std::string toString(bool timeAsLocalTime = true) const;
359 
364  void toStringList(std::vector<std::string>& result, bool timeAsLocalTime = true) const;
365 
369  {
372  struct TimestampObject : ObjectFieldDescriptor<TimestampObject>
373  {
375 
377  static std::vector<FieldDescriptor> all()
378  {
379  return { Sec, NSec };
380  }
381 
383  static const FieldDescriptor Sec;
384 
386  static const FieldDescriptor NSec;
387  };
388 
390  static std::vector<FieldDescriptor> all()
391  {
393  }
394 
397 
400 
403 
406 
408  static const FieldDescriptor Layers;
409  };
410 
413  void serialize(ISerializer& serializer) const;
414 
415  private:
416  void copyDataFrom(const Packet& other);
417 
418  void destructPacketData();
419  void destroyAllLayers();
420 
421  bool extendLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToExtend);
422  bool shortenLayer(Layer* layer, int offsetInLayer, size_t numOfBytesToShorten);
423 
424  void reallocateRawData(size_t newSize);
425 
426  bool removeLayer(Layer* layer, bool tryToDelete);
427 
428  std::string printPacketInfo(bool timeAsLocalTime) const;
429 
430  Layer* createFirstLayer(LinkLayerType linkType);
431 
432  template <typename TLayer, typename NextLayerFn>
433  static TLayer* searchLayerStackForType(Layer* startLayer, NextLayerFn nextLayerFn, bool skipFirst);
434  }; // class Packet
435 
436  // implementation of inline methods
437 
438  template <class TLayer> TLayer* Packet::getLayerOfType(bool reverse) const
439  {
440  if (!reverse)
441  {
442  return searchLayerStackForType<TLayer>(
443  m_FirstLayer, [](Layer* layer) { return layer->getNextLayer(); }, false);
444  }
445 
446  // lookup in reverse order
447  return searchLayerStackForType<TLayer>(m_LastLayer, [](Layer* layer) { return layer->getPrevLayer(); }, false);
448  }
449 
450  template <class TLayer> TLayer* Packet::getNextLayerOfType(Layer* curLayer) const
451  {
452  return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getNextLayer(); }, true);
453  }
454 
455  template <class TLayer> TLayer* Packet::getPrevLayerOfType(Layer* curLayer) const
456  {
457  return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getPrevLayer(); }, true);
458  }
459 
460  template <typename TLayer, typename NextLayerFn>
461  TLayer* Packet::searchLayerStackForType(Layer* curLayer, NextLayerFn nextLayerFn, bool skipFirst)
462  {
463  if (curLayer == nullptr)
464  return nullptr;
465 
466  if (skipFirst)
467  {
468  curLayer = nextLayerFn(curLayer);
469  }
470 
471  while (curLayer != nullptr)
472  {
473  auto* curLayerCasted = dynamic_cast<TLayer*>(curLayer);
474  if (curLayerCasted != nullptr)
475  return curLayerCasted;
476 
477  curLayer = nextLayerFn(curLayer);
478  }
479 
480  return nullptr;
481  }
482 
483  inline std::ostream& operator<<(std::ostream& os, const pcpp::Packet& packet)
484  {
485  os << packet.toString();
486  return os;
487  }
488 } // namespace pcpp
Definition: Serializers.h:78
Definition: Layer.h:117
Layer * getNextLayer() const
Definition: Layer.h:126
Layer * getPrevLayer() const
Definition: Layer.h:132
Definition: Packet.h:49
bool isPacketOfType(ProtocolType protocolType) const
bool insertLayer(Layer *prevLayer, Layer *newLayer, bool ownInPacket=false)
Packet(const Packet &other)
Definition: Packet.h:149
const RawPacket * getRawPacketReadOnly() const
Definition: Packet.h:201
void serialize(ISerializer &serializer) const
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:141
Layer * detachLayer(ProtocolType layerType, int index=0)
RawPacket * getRawPacket() const
Definition: Packet.h:164
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:455
Packet(RawPacket *rawPacket, OsiModelLayer parseUntilLayer)
Layer * getLastLayer() const
Definition: Packet.h:215
std::string toString(bool timeAsLocalTime=true) const
TLayer * getNextLayerOfType(Layer *startLayer) const
Definition: Packet.h:450
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:228
bool detachLayer(Layer *layer)
Definition: Packet.h:301
Packet(RawPacket *rawPacket, ProtocolTypeFamily parseUntilFamily)
Layer * getFirstLayer() const
Definition: Packet.h:208
Definition: RawPacket.h:522
uint8_t ProtocolType
Definition: ProtocolType.h:38
uint32_t ProtocolTypeFamily
Definition: ProtocolType.h:42
const ProtocolType UnknownProtocol
Unknown protocol (or unsupported by PcapPlusPlus)
Definition: ProtocolType.h:45
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:415
@ OsiModelLayerUnknown
Unknown / null layer.
Definition: ProtocolType.h:433
LinkLayerType
An enum describing all known link layer type. Taken from: http://www.tcpdump.org/linktypes....
Definition: RawPacket.h:23
@ LINKTYPE_ETHERNET
IEEE 802.3 Ethernet.
Definition: RawPacket.h:27
Definition: Serializers.h:18
Definition: Serializers.h:49
ObjectFieldDescriptor(uint16_t fieldId, std::string fieldName)
Definition: Serializers.h:53
static const FieldDescriptor Sec
Field descriptor for the timestamp seconds.
Definition: Packet.h:383
static const FieldDescriptor NSec
Field descriptor for the timestamp nanoseconds.
Definition: Packet.h:386
static std::vector< FieldDescriptor > all()
Definition: Packet.h:377
Definition: Packet.h:369
static std::vector< FieldDescriptor > all()
Definition: Packet.h:390
static const FieldDescriptor LinkLayerName
Field descriptor for the packet link layer name.
Definition: Packet.h:405
static const FieldDescriptor FrameLength
Field descriptor for the packet frame length.
Definition: Packet.h:399
static const FieldDescriptor Layers
Field descriptor for the packet layers.
Definition: Packet.h:408
static const TimestampObject Timestamp
Field descriptor for the packet timestamp.
Definition: Packet.h:396
static const FieldDescriptor LinkLayer
Field descriptor for the packet link layer type.
Definition: Packet.h:402
Options struct for configuring packet parsing behavior.
Definition: Packet.h:19
ProtocolTypeFamily parseUntilProtocol
Defines the protocol type up to and including which the packet should be parsed (inclusive).
Definition: Packet.h:30
OsiModelLayer parseUntilLayer
Defines an OSI model layer up to and including which the packet should be parsed (inclusive).
Definition: Packet.h:37