PcapPlusPlus  Next
IPReassembly.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Packet.h"
4 #include "LRUList.h"
5 #include "IpAddress.h"
6 #include "PointerVector.h"
7 #include <unordered_map>
8 
41 
44 namespace pcpp
45 {
46 
49 #define PCPP_IP_REASSEMBLY_DEFAULT_MAX_PACKETS_TO_STORE 500000
50 
63  {
64  public:
68  class PacketKey
69  {
70  public:
72  virtual ~PacketKey() = default;
73 
75  virtual uint32_t getHashValue() const = 0;
76 
78  virtual ProtocolType getProtocolType() const = 0;
79 
81  virtual PacketKey* clone() const = 0;
82 
83  protected:
84  // private c'tor
85  PacketKey() = default;
86 
87  // private copy c'tor
88  PacketKey(const PacketKey& other) = default;
89  };
90 
94  class IPv4PacketKey : public PacketKey
95  {
96  public:
98  IPv4PacketKey() : m_IpID(0), m_SrcIP(IPv4Address::Zero), m_DstIP(IPv4Address::Zero)
99  {}
100 
105  IPv4PacketKey(uint16_t ipid, IPv4Address srcip, IPv4Address dstip)
106  : m_IpID(ipid), m_SrcIP(srcip), m_DstIP(dstip)
107  {}
108 
112  : PacketKey(other), m_IpID(other.m_IpID), m_SrcIP(other.m_SrcIP), m_DstIP(other.m_DstIP)
113  {}
114 
118  {
119  m_IpID = other.m_IpID;
120  m_SrcIP = other.m_SrcIP;
121  m_DstIP = other.m_DstIP;
122  return *this;
123  }
124 
126  uint16_t getIpID() const
127  {
128  return m_IpID;
129  }
130 
133  {
134  return m_SrcIP;
135  }
136 
139  {
140  return m_DstIP;
141  }
142 
145  void setIpID(uint16_t ipID)
146  {
147  m_IpID = ipID;
148  }
149 
152  void setSrcIP(const IPv4Address& srcIP)
153  {
154  m_SrcIP = srcIP;
155  }
156 
159  void setDstIP(const IPv4Address& dstIP)
160  {
161  m_DstIP = dstIP;
162  }
163 
164  // implement abstract methods
165 
166  uint32_t getHashValue() const override;
167 
169  ProtocolType getProtocolType() const override
170  {
171  return IPv4;
172  }
173 
174  PacketKey* clone() const override
175  {
176  return new IPv4PacketKey(*this);
177  }
178 
179  private:
180  uint16_t m_IpID;
181  IPv4Address m_SrcIP;
182  IPv4Address m_DstIP;
183  };
184 
188  class IPv6PacketKey : public PacketKey
189  {
190  public:
192  IPv6PacketKey() : m_FragmentID(0), m_SrcIP(IPv6Address::Zero), m_DstIP(IPv6Address::Zero)
193  {}
194 
199  IPv6PacketKey(uint32_t fragmentID, IPv6Address srcip, IPv6Address dstip)
200  : m_FragmentID(fragmentID), m_SrcIP(srcip), m_DstIP(dstip)
201  {}
202 
206  : PacketKey(other), m_FragmentID(other.m_FragmentID), m_SrcIP(other.m_SrcIP), m_DstIP(other.m_DstIP)
207  {}
208 
212  {
213  m_FragmentID = other.m_FragmentID;
214  m_SrcIP = other.m_SrcIP;
215  m_DstIP = other.m_DstIP;
216  return *this;
217  }
218 
220  uint32_t getFragmentID() const
221  {
222  return m_FragmentID;
223  }
224 
227  {
228  return m_SrcIP;
229  }
230 
233  {
234  return m_DstIP;
235  }
236 
239  void setFragmentID(uint32_t fragID)
240  {
241  m_FragmentID = fragID;
242  }
243 
246  void setSrcIP(const IPv6Address& srcIP)
247  {
248  m_SrcIP = srcIP;
249  }
250 
253  void setDstIP(const IPv6Address& dstIP)
254  {
255  m_DstIP = dstIP;
256  }
257 
258  // implement abstract methods
259 
260  uint32_t getHashValue() const override;
261 
263  ProtocolType getProtocolType() const override
264  {
265  return IPv6;
266  }
267 
268  PacketKey* clone() const override
269  {
270  return new IPv6PacketKey(*this);
271  }
272 
273  private:
274  uint32_t m_FragmentID;
275  IPv6Address m_SrcIP;
276  IPv6Address m_DstIP;
277  };
278 
287  typedef void (*OnFragmentsClean)(const PacketKey* key, void* userCookie);
288 
291  {
295  NON_FRAGMENT = 0x01,
299  FRAGMENT = 0x04,
306  REASSEMBLED = 0x20
307  };
308 
317  explicit IPReassembly(OnFragmentsClean onFragmentsCleanCallback = nullptr, void* callbackUserCookie = nullptr,
318  size_t maxPacketsToStore = PCPP_IP_REASSEMBLY_DEFAULT_MAX_PACKETS_TO_STORE)
319  : m_PacketLRU(maxPacketsToStore), m_OnFragmentsCleanCallback(onFragmentsCleanCallback),
320  m_CallbackUserCookie(callbackUserCookie)
321  {}
322 
325 
362  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
363 
403  OsiModelLayer parseUntilLayer = OsiModelLayerUnknown);
404 
414 
418  void removePacket(const PacketKey& key);
419 
421  size_t getMaxCapacity() const
422  {
423  return m_PacketLRU.getMaxSize();
424  }
425 
427  size_t getCurrentCapacity() const
428  {
429  return m_FragmentMap.size();
430  }
431 
432  private:
433  struct IPFragment
434  {
435  uint16_t fragmentOffset;
436  bool lastFragment;
437  uint8_t* fragmentData;
438  size_t fragmentDataLen;
439  IPFragment()
440  {
441  fragmentOffset = 0;
442  lastFragment = false;
443  fragmentData = nullptr;
444  fragmentDataLen = 0;
445  }
446  ~IPFragment()
447  {
448  delete[] fragmentData;
449  }
450  };
451 
452  struct IPFragmentData
453  {
454  uint16_t currentOffset;
455  RawPacket* data;
456  bool deleteData;
457  uint32_t fragmentID;
458  PacketKey* packetKey;
459  PointerVector<IPFragment> outOfOrderFragments;
460  IPFragmentData(PacketKey* pktKey, uint32_t fragId)
461  {
462  currentOffset = 0;
463  data = nullptr;
464  deleteData = true;
465  fragmentID = fragId;
466  packetKey = pktKey;
467  }
468  ~IPFragmentData()
469  {
470  delete packetKey;
471  if (deleteData && data != nullptr)
472  {
473  delete data;
474  }
475  }
476  };
477 
478  LRUList<uint32_t> m_PacketLRU;
479  std::unordered_map<uint32_t, IPFragmentData*> m_FragmentMap;
480  OnFragmentsClean m_OnFragmentsCleanCallback;
481  void* m_CallbackUserCookie;
482 
483  void addNewFragment(uint32_t hash, IPFragmentData* fragData);
484  bool matchOutOfOrderFragments(IPFragmentData* fragData);
485  };
486 
487 } // namespace pcpp
#define PCPP_IP_REASSEMBLY_DEFAULT_MAX_PACKETS_TO_STORE
Definition: IPReassembly.h:49
Definition: IPReassembly.h:95
uint32_t getHashValue() const override
void setDstIP(const IPv4Address &dstIP)
Definition: IPReassembly.h:159
IPv4PacketKey & operator=(const IPv4PacketKey &other)
Definition: IPReassembly.h:117
uint16_t getIpID() const
Definition: IPReassembly.h:126
ProtocolType getProtocolType() const override
Definition: IPReassembly.h:169
void setSrcIP(const IPv4Address &srcIP)
Definition: IPReassembly.h:152
IPv4PacketKey(uint16_t ipid, IPv4Address srcip, IPv4Address dstip)
Definition: IPReassembly.h:105
IPv4Address getSrcIP() const
Definition: IPReassembly.h:132
IPv4Address getDstIP() const
Definition: IPReassembly.h:138
IPv4PacketKey()
A default c'tor which zeros all members.
Definition: IPReassembly.h:98
void setIpID(uint16_t ipID)
Definition: IPReassembly.h:145
PacketKey * clone() const override
Definition: IPReassembly.h:174
IPv4PacketKey(const IPv4PacketKey &other)
Definition: IPReassembly.h:111
Definition: IPReassembly.h:189
IPv6PacketKey()
A default c'tor which zeros all members.
Definition: IPReassembly.h:192
IPv6PacketKey(uint32_t fragmentID, IPv6Address srcip, IPv6Address dstip)
Definition: IPReassembly.h:199
void setFragmentID(uint32_t fragID)
Definition: IPReassembly.h:239
void setSrcIP(const IPv6Address &srcIP)
Definition: IPReassembly.h:246
uint32_t getHashValue() const override
ProtocolType getProtocolType() const override
Definition: IPReassembly.h:263
uint32_t getFragmentID() const
Definition: IPReassembly.h:220
IPv6PacketKey & operator=(const IPv6PacketKey &other)
Definition: IPReassembly.h:211
void setDstIP(const IPv6Address &dstIP)
Definition: IPReassembly.h:253
IPv6PacketKey(const IPv6PacketKey &other)
Definition: IPReassembly.h:205
IPv6Address getDstIP() const
Definition: IPReassembly.h:232
PacketKey * clone() const override
Definition: IPReassembly.h:268
IPv6Address getSrcIP() const
Definition: IPReassembly.h:226
Definition: IPReassembly.h:69
virtual ~PacketKey()=default
A default virtual d'tor.
virtual ProtocolType getProtocolType() const =0
virtual PacketKey * clone() const =0
virtual uint32_t getHashValue() const =0
Definition: IPReassembly.h:63
Packet * getCurrentPacket(const PacketKey &key)
size_t getMaxCapacity() const
Get the maximum capacity as determined in the c'tor.
Definition: IPReassembly.h:421
void removePacket(const PacketKey &key)
IPReassembly(OnFragmentsClean onFragmentsCleanCallback=nullptr, void *callbackUserCookie=nullptr, size_t maxPacketsToStore=500000)
Definition: IPReassembly.h:317
void(* OnFragmentsClean)(const PacketKey *key, void *userCookie)
Definition: IPReassembly.h:287
Packet * processPacket(Packet *fragment, ReassemblyStatus &status, ProtocolType parseUntil=UnknownProtocol, OsiModelLayer parseUntilLayer=OsiModelLayerUnknown)
Packet * processPacket(RawPacket *fragment, ReassemblyStatus &status, ProtocolType parseUntil=UnknownProtocol, OsiModelLayer parseUntilLayer=OsiModelLayerUnknown)
ReassemblyStatus
An enum representing the status returned from processing a fragment.
Definition: IPReassembly.h:291
@ FIRST_FRAGMENT
The processed fragment is the first fragment.
Definition: IPReassembly.h:297
@ FRAGMENT
The processed fragment is a fragment (but not the first one)
Definition: IPReassembly.h:299
@ OUT_OF_ORDER_FRAGMENT
The processed fragment is not the fragment that was expected at this time.
Definition: IPReassembly.h:301
@ REASSEMBLED
Packet is now fully reassembled.
Definition: IPReassembly.h:306
@ MALFORMED_FRAGMENT
Definition: IPReassembly.h:304
@ NON_FRAGMENT
The processed packet isn't a fragment.
Definition: IPReassembly.h:295
@ NON_IP_PACKET
The processed packet isn't of type IPv4 or IPv6.
Definition: IPReassembly.h:293
~IPReassembly()
A d'tor for this class.
size_t getCurrentCapacity() const
Get the current number of packets being processed.
Definition: IPReassembly.h:427
Definition: IpAddress.h:28
Definition: IpAddress.h:156
size_t getMaxSize() const
Definition: LRUList.h:108
Definition: Packet.h:22
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
const ProtocolType IPv4
IPv4 protocol.
Definition: ProtocolType.h:26
const ProtocolType IPv6
IPv6 protocol.
Definition: ProtocolType.h:29
const ProtocolType UnknownProtocol
Unknown protocol (or unsupported by PcapPlusPlus)
Definition: ProtocolType.h:20