Skip to content

Commit c0e4de6

Browse files
authored
TCP reassembly - support closing connection with FIN + RST on one side (#1496)
1 parent bd7884b commit c0e4de6

File tree

5 files changed

+27
-0
lines changed

5 files changed

+27
-0
lines changed

Packet++/src/TcpReassembly.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,15 @@ namespace pcpp
232232
// if this side already got FIN or RST packet before, ignore this packet as this side is considered closed
233233
if (tcpReassemblyData->twoSides[sideIndex].gotFinOrRst)
234234
{
235+
if (!tcpReassemblyData->twoSides[1 - sideIndex].gotFinOrRst && isRst)
236+
{
237+
handleFinOrRst(tcpReassemblyData, 1 - sideIndex, flowKey, isRst);
238+
return FIN_RSTWithNoData;
239+
}
240+
235241
PCPP_LOG_DEBUG("Got a packet after FIN or RST were already seen on this side ("
236242
<< static_cast<int>(sideIndex) << "). Ignoring this packet");
243+
237244
return Ignore_PacketOfClosedFlow;
238245
}
239246

1.28 KB
Binary file not shown.

Tests/Pcap++Test/TestDefinition.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ PTF_TEST_CASE(TestTcpReassemblyMaxOOOFrags);
7878
PTF_TEST_CASE(TestTcpReassemblyMaxSeq);
7979
PTF_TEST_CASE(TestTcpReassemblyDisableOOOCleanup);
8080
PTF_TEST_CASE(TestTcpReassemblyTimeStamps);
81+
PTF_TEST_CASE(TestTcpReassemblyFinReset);
8182

8283
// Implemented in IPFragmentationTests.cpp
8384
PTF_TEST_CASE(TestIPFragmentationSanity);

Tests/Pcap++Test/Tests/TcpReassemblyTests.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,3 +1263,21 @@ PTF_TEST_CASE(TestTcpReassemblyTimeStamps)
12631263
packetStream.clear();
12641264
tcpReassemblyResults.clear();
12651265
} // TestTcpReassemblyTimeStamps
1266+
1267+
PTF_TEST_CASE(TestTcpReassemblyFinReset)
1268+
{
1269+
std::string errMsg;
1270+
1271+
std::vector<pcpp::RawPacket> packetStream;
1272+
PTF_ASSERT_TRUE(
1273+
readPcapIntoPacketVec("PcapExamples/one_tcp_stream_fin_rst_close_packet.pcap", packetStream, errMsg));
1274+
1275+
TcpReassemblyMultipleConnStats tcpReassemblyResults;
1276+
tcpReassemblyTest(packetStream, tcpReassemblyResults, true, false);
1277+
1278+
TcpReassemblyMultipleConnStats::Stats& stats = tcpReassemblyResults.stats;
1279+
PTF_ASSERT_EQUAL(stats.size(), 1);
1280+
PTF_ASSERT_TRUE(stats.begin()->second.connectionsStarted);
1281+
PTF_ASSERT_TRUE(stats.begin()->second.connectionsEnded);
1282+
PTF_ASSERT_FALSE(stats.begin()->second.connectionsEndedManually);
1283+
} // TestTcpReassemblyFinReset

Tests/Pcap++Test/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ int main(int argc, char* argv[])
289289
PTF_RUN_TEST(TestTcpReassemblyMaxSeq, "no_network;tcp_reassembly");
290290
PTF_RUN_TEST(TestTcpReassemblyDisableOOOCleanup, "no_network;tcp_reassembly");
291291
PTF_RUN_TEST(TestTcpReassemblyTimeStamps, "no_network;tcp_reassembly");
292+
PTF_RUN_TEST(TestTcpReassemblyFinReset, "no_network;tcp_reassembly");
292293

293294
PTF_RUN_TEST(TestIPFragmentationSanity, "no_network;ip_frag");
294295
PTF_RUN_TEST(TestIPFragOutOfOrder, "no_network;ip_frag");

0 commit comments

Comments
 (0)