6 #include <unordered_map>
120 void setStartTime(
const std::chrono::time_point<std::chrono::high_resolution_clock>& startTimeValue);
124 void setEndTime(
const std::chrono::time_point<std::chrono::high_resolution_clock>& endTimeValue);
143 std::chrono::time_point<std::chrono::high_resolution_clock> timestamp)
144 : m_Data(tcpData), m_DataLen(tcpDataLength), m_MissingBytes(missingBytes), m_Connection(connData),
145 m_Timestamp(timestamp)
166 return m_MissingBytes;
193 const uint8_t* m_Data;
195 size_t m_MissingBytes;
197 std::chrono::time_point<std::chrono::high_resolution_clock> m_Timestamp;
387 return m_ConnectionInfo;
405 uint32_t sequence = 0;
406 size_t dataLength = 0;
407 uint8_t* data =
nullptr;
408 std::chrono::time_point<std::chrono::high_resolution_clock> timestamp;
416 struct TcpOneSideData
418 PointerVector<TcpFragment> tcpFragmentList;
419 uint32_t sequence = 0;
420 uint16_t srcPort = 0;
422 bool gotFinOrRst =
false;
425 struct TcpReassemblyData
428 int8_t numOfSides = 0;
429 int8_t prevSide = -1;
430 std::array<TcpOneSideData, 2> twoSides;
431 ConnectionData connData;
434 class OutOfOrderProcessingGuard
440 explicit OutOfOrderProcessingGuard(
bool& flag) : m_Flag(flag)
445 ~OutOfOrderProcessingGuard()
451 OutOfOrderProcessingGuard(
const OutOfOrderProcessingGuard&) =
delete;
452 OutOfOrderProcessingGuard& operator=(
const OutOfOrderProcessingGuard&) =
delete;
455 using ConnectionList = std::unordered_map<uint32_t, TcpReassemblyData>;
456 using CleanupMultiMap = std::multimap<time_t, uint32_t>;
462 ConnectionList m_ConnectionList;
464 CleanupMultiMap m_CleanupMultimap;
465 bool m_RemoveConnInfo;
466 uint32_t m_ClosedConnectionDelay;
467 uint32_t m_MaxNumToClean;
468 size_t m_MaxOutOfOrderFragments;
469 time_t m_PurgeTimepoint;
470 bool m_EnableBaseBufferClearCondition;
471 bool m_ProcessingOutOfOrder =
false;
473 void checkOutOfOrderFragments(TcpReassemblyData* tcpReassemblyData, int8_t sideIndex,
bool cleanWholeFragList);
475 void handleFinOrRst(TcpReassemblyData* tcpReassemblyData, int8_t sideIndex, uint32_t flowKey,
bool isRst);
479 void scheduleCleanup(uint32_t flowKey);
Definition: IpAddress.h:318
Definition: RawPacket.h:290
Definition: TcpReassembly.h:249
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:321
ReassemblyStatus
An enum for providing reassembly status for each processed packet.
Definition: TcpReassembly.h:262
@ NonIpPacket
Definition: TcpReassembly.h:301
@ FIN_RSTWithNoData
Definition: TcpReassembly.h:286
@ Error_PacketDoesNotMatchFlow
Definition: TcpReassembly.h:308
@ Ignore_PacketOfClosedFlow
Definition: TcpReassembly.h:295
@ NonTcpPacket
Definition: TcpReassembly.h:304
@ Ignore_Retransimission
Definition: TcpReassembly.h:298
@ TcpMessageHandled
Definition: TcpReassembly.h:272
@ OutOfOrderTcpMessageBuffered
Definition: TcpReassembly.h:282
@ Ignore_PacketWithNoData
Definition: TcpReassembly.h:290
std::function< void(const ConnectionData &connectionData, ConnectionEndReason reason, void *userCookie)> OnTcpConnectionEnd
Definition: TcpReassembly.h:338
std::unordered_map< uint32_t, ConnectionData > ConnectionInfoList
The type for storing the connection information.
Definition: TcpReassembly.h:312
const ConnectionInfoList & getConnectionInformation() const
Definition: TcpReassembly.h:385
uint32_t purgeClosedConnections(uint32_t maxNumToClean=0)
void closeAllConnections()
ReassemblyStatus reassemblePacket(Packet &tcpData)
void closeConnection(uint32_t flowKey)
ConnectionEndReason
An enum for connection end reasons.
Definition: TcpReassembly.h:253
@ TcpReassemblyConnectionClosedByFIN_RST
Connection ended because of FIN or RST packet.
Definition: TcpReassembly.h:255
@ TcpReassemblyConnectionClosedManually
Connection ended manually by the user.
Definition: TcpReassembly.h:257
std::function< void(const ConnectionData &connectionData, void *userCookie)> OnTcpConnectionStart
Definition: TcpReassembly.h:328
Definition: TcpReassembly.h:134
bool isBytesMissing() const
Definition: TcpReassembly.h:171
size_t getDataLength() const
Definition: TcpReassembly.h:157
timeval getTimeStamp() const
size_t getMissingByteCount() const
Definition: TcpReassembly.h:164
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:142
std::chrono::time_point< std::chrono::high_resolution_clock > getTimeStampPrecise() const
Definition: TcpReassembly.h:187
const uint8_t * getData() const
Definition: TcpReassembly.h:150
const ConnectionData & getConnectionData() const
Definition: TcpReassembly.h:178
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
Definition: TcpReassembly.h:94
IPAddress srcIP
Source IP address.
Definition: TcpReassembly.h:96
IPAddress dstIP
Destination IP address.
Definition: TcpReassembly.h:98
std::chrono::time_point< std::chrono::high_resolution_clock > startTimePrecise
Start timestamp of the connection with nanosecond precision.
Definition: TcpReassembly.h:110
timeval endTime
End timestamp of the connection with microsecond precision.
Definition: TcpReassembly.h:108
timeval startTime
Start timestamp of the connection with microsecond precision.
Definition: TcpReassembly.h:106
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:112
uint16_t dstPort
Destination TCP/UDP port.
Definition: TcpReassembly.h:102
uint16_t srcPort
Source TCP/UDP port.
Definition: TcpReassembly.h:100
ConnectionData()
A c'tor for this struct that basically zeros all members.
Definition: TcpReassembly.h:115
uint32_t flowKey
A 4-byte hash key representing the connection.
Definition: TcpReassembly.h:104
void setEndTime(const std::chrono::time_point< std::chrono::high_resolution_clock > &endTimeValue)
Definition: TcpReassembly.h:203
uint32_t closedConnectionDelay
Definition: TcpReassembly.h:210
uint32_t maxNumToClean
Definition: TcpReassembly.h:215
uint32_t maxOutOfOrderFragments
Definition: TcpReassembly.h:220
TcpReassemblyConfiguration(bool removeConnInfo=true, uint32_t closedConnectionDelay=5, uint32_t maxNumToClean=30, uint32_t maxOutOfOrderFragments=0, bool enableBaseBufferClearCondition=true)
Definition: TcpReassembly.h:236
bool enableBaseBufferClearCondition
To enable to clear buffer once packet contains data from a different side than the side seen before.
Definition: TcpReassembly.h:223
bool removeConnInfo
The flag indicating whether to remove the connection data after a connection is closed.
Definition: TcpReassembly.h:205