PcapPlusPlus  Next
TcpReassembly.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Packet.h"
4 #include "IpAddress.h"
5 #include "PointerVector.h"
6 #include <unordered_map>
7 #include <chrono>
8 #include <map>
9 #include <list>
10 #include <time.h>
11 #include <functional>
12 
85 
88 namespace pcpp
89 {
93  {
99  uint16_t srcPort;
101  uint16_t dstPort;
103  uint32_t flowKey;
105  timeval startTime;
107  timeval endTime;
109  std::chrono::time_point<std::chrono::high_resolution_clock> startTimePrecise;
111  std::chrono::time_point<std::chrono::high_resolution_clock> endTimePrecise;
112 
115  {}
116 
119  void setStartTime(const std::chrono::time_point<std::chrono::high_resolution_clock>& startTimeValue);
120 
123  void setEndTime(const std::chrono::time_point<std::chrono::high_resolution_clock>& endTimeValue);
124  };
125 
126  class TcpReassembly;
127 
133  {
134  public:
141  TcpStreamData(const uint8_t* tcpData, size_t tcpDataLength, size_t missingBytes, const ConnectionData& connData,
142  std::chrono::time_point<std::chrono::high_resolution_clock> timestamp)
143  : m_Data(tcpData), m_DataLen(tcpDataLength), m_MissingBytes(missingBytes), m_Connection(connData),
144  m_Timestamp(timestamp)
145  {}
146 
149  const uint8_t* getData() const
150  {
151  return m_Data;
152  }
153 
156  size_t getDataLength() const
157  {
158  return m_DataLen;
159  }
160 
163  size_t getMissingByteCount() const
164  {
165  return m_MissingBytes;
166  }
167 
170  bool isBytesMissing() const
171  {
172  return getMissingByteCount() > 0;
173  }
174 
178  {
179  return m_Connection;
180  }
181 
183  timeval getTimeStamp() const;
184 
186  std::chrono::time_point<std::chrono::high_resolution_clock> getTimeStampPrecise() const
187  {
188  return m_Timestamp;
189  }
190 
191  private:
192  const uint8_t* m_Data;
193  size_t m_DataLen;
194  size_t m_MissingBytes;
195  const ConnectionData& m_Connection;
196  std::chrono::time_point<std::chrono::high_resolution_clock> m_Timestamp;
197  };
198 
202  {
205 
210 
214  uint32_t maxNumToClean;
215 
220 
223 
236  uint32_t maxNumToClean = 30, uint32_t maxOutOfOrderFragments = 0,
237  bool enableBaseBufferClearCondition = true)
241  {}
242  };
243 
248  {
249  public:
252  {
257  };
258 
261  {
290 
293 
308  };
309 
311  typedef std::unordered_map<uint32_t, ConnectionData> ConnectionInfoList;
312 
320  using OnTcpMessageReady = std::function<void(int8_t side, const TcpStreamData& tcpData, void* userCookie)>;
321 
327  using OnTcpConnectionStart = std::function<void(const ConnectionData& connectionData, void* userCookie)>;
328 
337  std::function<void(const ConnectionData& connectionData, ConnectionEndReason reason, void* userCookie)>;
338 
349  explicit TcpReassembly(OnTcpMessageReady onMessageReadyCallback, void* userCookie = nullptr,
350  OnTcpConnectionStart onConnectionStartCallback = nullptr,
351  OnTcpConnectionEnd onConnectionEndCallback = nullptr,
353 
361 
369 
375  void closeConnection(uint32_t flowKey);
376 
380 
385  {
386  return m_ConnectionInfo;
387  }
388 
393  int isConnectionOpen(const ConnectionData& connection) const;
394 
399  uint32_t purgeClosedConnections(uint32_t maxNumToClean = 0);
400 
401  private:
402  struct TcpFragment
403  {
404  uint32_t sequence;
405  size_t dataLength;
406  uint8_t* data;
407  std::chrono::time_point<std::chrono::high_resolution_clock> timestamp;
408 
409  TcpFragment() : sequence(0), dataLength(0), data(nullptr)
410  {}
411  ~TcpFragment()
412  {
413  delete[] data;
414  }
415  };
416 
417  struct TcpOneSideData
418  {
419  IPAddress srcIP;
420  uint16_t srcPort;
421  uint32_t sequence;
422  PointerVector<TcpFragment> tcpFragmentList;
423  bool gotFinOrRst;
424 
425  TcpOneSideData() : srcPort(0), sequence(0), gotFinOrRst(false)
426  {}
427  };
428 
429  struct TcpReassemblyData
430  {
431  bool closed;
432  int8_t numOfSides;
433  int8_t prevSide;
434  TcpOneSideData twoSides[2];
435  ConnectionData connData;
436 
437  TcpReassemblyData() : closed(false), numOfSides(0), prevSide(-1)
438  {}
439  };
440 
441  class OutOfOrderProcessingGuard
442  {
443  private:
444  bool& m_Flag;
445 
446  public:
447  explicit OutOfOrderProcessingGuard(bool& flag) : m_Flag(flag)
448  {
449  m_Flag = true;
450  }
451 
452  ~OutOfOrderProcessingGuard()
453  {
454  m_Flag = false;
455  }
456 
457  // Disable copy and move operations
458  OutOfOrderProcessingGuard(const OutOfOrderProcessingGuard&) = delete;
459  OutOfOrderProcessingGuard& operator=(const OutOfOrderProcessingGuard&) = delete;
460  };
461 
462  typedef std::unordered_map<uint32_t, TcpReassemblyData> ConnectionList;
463  typedef std::map<time_t, std::list<uint32_t>> CleanupList;
464 
465  OnTcpMessageReady m_OnMessageReadyCallback;
466  OnTcpConnectionStart m_OnConnStart;
467  OnTcpConnectionEnd m_OnConnEnd;
468  void* m_UserCookie;
469  ConnectionList m_ConnectionList;
470  ConnectionInfoList m_ConnectionInfo;
471  CleanupList m_CleanupList;
472  bool m_RemoveConnInfo;
473  uint32_t m_ClosedConnectionDelay;
474  uint32_t m_MaxNumToClean;
475  size_t m_MaxOutOfOrderFragments;
476  time_t m_PurgeTimepoint;
477  bool m_EnableBaseBufferClearCondition;
478  bool m_ProcessingOutOfOrder = false;
479 
480  void checkOutOfOrderFragments(TcpReassemblyData* tcpReassemblyData, int8_t sideIndex, bool cleanWholeFragList);
481 
482  void handleFinOrRst(TcpReassemblyData* tcpReassemblyData, int8_t sideIndex, uint32_t flowKey, bool isRst);
483 
484  void closeConnectionInternal(uint32_t flowKey, ConnectionEndReason reason);
485 
486  void insertIntoCleanupList(uint32_t flowKey);
487  };
488 
489 } // namespace pcpp
Definition: IpAddress.h:318
Definition: Packet.h:22
Definition: RawPacket.h:259
Definition: TcpReassembly.h:248
ReassemblyStatus reassemblePacket(RawPacket *tcpRawData)
int isConnectionOpen(const ConnectionData &connection) const
TcpReassembly(OnTcpMessageReady onMessageReadyCallback, void *userCookie=nullptr, OnTcpConnectionStart onConnectionStartCallback=nullptr, OnTcpConnectionEnd onConnectionEndCallback=nullptr, const TcpReassemblyConfiguration &config=TcpReassemblyConfiguration())
std::function< void(int8_t side, const TcpStreamData &tcpData, void *userCookie)> OnTcpMessageReady
Definition: TcpReassembly.h:320
ReassemblyStatus
An enum for providing reassembly status for each processed packet.
Definition: TcpReassembly.h:261
@ NonIpPacket
Definition: TcpReassembly.h:300
@ FIN_RSTWithNoData
Definition: TcpReassembly.h:285
@ Error_PacketDoesNotMatchFlow
Definition: TcpReassembly.h:307
@ Ignore_PacketOfClosedFlow
Definition: TcpReassembly.h:294
@ NonTcpPacket
Definition: TcpReassembly.h:303
@ Ignore_Retransimission
Definition: TcpReassembly.h:297
@ TcpMessageHandled
Definition: TcpReassembly.h:271
@ OutOfOrderTcpMessageBuffered
Definition: TcpReassembly.h:281
@ Ignore_PacketWithNoData
Definition: TcpReassembly.h:289
std::function< void(const ConnectionData &connectionData, ConnectionEndReason reason, void *userCookie)> OnTcpConnectionEnd
Definition: TcpReassembly.h:337
const ConnectionInfoList & getConnectionInformation() const
Definition: TcpReassembly.h:384
uint32_t purgeClosedConnections(uint32_t maxNumToClean=0)
ReassemblyStatus reassemblePacket(Packet &tcpData)
std::unordered_map< uint32_t, ConnectionData > ConnectionInfoList
The type for storing the connection information.
Definition: TcpReassembly.h:311
void closeConnection(uint32_t flowKey)
ConnectionEndReason
An enum for connection end reasons.
Definition: TcpReassembly.h:252
@ TcpReassemblyConnectionClosedByFIN_RST
Connection ended because of FIN or RST packet.
Definition: TcpReassembly.h:254
@ TcpReassemblyConnectionClosedManually
Connection ended manually by the user.
Definition: TcpReassembly.h:256
std::function< void(const ConnectionData &connectionData, void *userCookie)> OnTcpConnectionStart
Definition: TcpReassembly.h:327
Definition: TcpReassembly.h:133
bool isBytesMissing() const
Definition: TcpReassembly.h:170
size_t getDataLength() const
Definition: TcpReassembly.h:156
timeval getTimeStamp() const
size_t getMissingByteCount() const
Definition: TcpReassembly.h:163
TcpStreamData(const uint8_t *tcpData, size_t tcpDataLength, size_t missingBytes, const ConnectionData &connData, std::chrono::time_point< std::chrono::high_resolution_clock > timestamp)
Definition: TcpReassembly.h:141
std::chrono::time_point< std::chrono::high_resolution_clock > getTimeStampPrecise() const
Definition: TcpReassembly.h:186
const uint8_t * getData() const
Definition: TcpReassembly.h:149
const ConnectionData & getConnectionData() const
Definition: TcpReassembly.h:177
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
Definition: TcpReassembly.h:93
IPAddress srcIP
Source IP address.
Definition: TcpReassembly.h:95
IPAddress dstIP
Destination IP address.
Definition: TcpReassembly.h:97
std::chrono::time_point< std::chrono::high_resolution_clock > startTimePrecise
Start timestamp of the connection with nanosecond precision.
Definition: TcpReassembly.h:109
timeval endTime
End timestamp of the connection with microsecond precision.
Definition: TcpReassembly.h:107
timeval startTime
Start timestamp of the connection with microsecond precision.
Definition: TcpReassembly.h:105
void setStartTime(const std::chrono::time_point< std::chrono::high_resolution_clock > &startTimeValue)
std::chrono::time_point< std::chrono::high_resolution_clock > endTimePrecise
End timestamp of the connection with nanosecond precision.
Definition: TcpReassembly.h:111
uint16_t dstPort
Destination TCP/UDP port.
Definition: TcpReassembly.h:101
uint16_t srcPort
Source TCP/UDP port.
Definition: TcpReassembly.h:99
ConnectionData()
A c'tor for this struct that basically zeros all members.
Definition: TcpReassembly.h:114
uint32_t flowKey
A 4-byte hash key representing the connection.
Definition: TcpReassembly.h:103
void setEndTime(const std::chrono::time_point< std::chrono::high_resolution_clock > &endTimeValue)
Definition: TcpReassembly.h:202
uint32_t closedConnectionDelay
Definition: TcpReassembly.h:209
uint32_t maxNumToClean
Definition: TcpReassembly.h:214
uint32_t maxOutOfOrderFragments
Definition: TcpReassembly.h:219
TcpReassemblyConfiguration(bool removeConnInfo=true, uint32_t closedConnectionDelay=5, uint32_t maxNumToClean=30, uint32_t maxOutOfOrderFragments=0, bool enableBaseBufferClearCondition=true)
Definition: TcpReassembly.h:235
bool enableBaseBufferClearCondition
To enable to clear buffer once packet contains data from a different side than the side seen before.
Definition: TcpReassembly.h:222
bool removeConnInfo
The flag indicating whether to remove the connection data after a connection is closed.
Definition: TcpReassembly.h:204