1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 02:35:57 +01:00

Add Stream recovery mode

This commit is contained in:
Matias Fontanini
2016-10-30 11:38:50 -07:00
parent df7e7b391d
commit a63387f85e
4 changed files with 138 additions and 16 deletions

View File

@@ -376,7 +376,7 @@ TEST_F(FlowTest, StreamFollower_ThreeWayHandshake) {
EXPECT_EQ(Flow::ESTABLISHED, stream.server_flow().state());
EXPECT_EQ(61U, stream.server_flow().sequence_number());
EXPECT_FALSE(stream.is_attached());
EXPECT_FALSE(stream.is_partial_stream());
}
TEST_F(FlowTest, StreamFollower_TCPOptions) {
@@ -531,7 +531,7 @@ TEST_F(FlowTest, StreamFollower_AttachToStreams) {
EXPECT_EQ(payload, merge_chunks(stream_client_payload_chunks));
Stream& stream = follower.find_stream(IPv4Address("1.2.3.4"), 22, IPv4Address("4.3.2.1"), 25);
EXPECT_TRUE(stream.is_attached());
EXPECT_TRUE(stream.is_partial_stream());
}
TEST_F(FlowTest, StreamFollower_AttachToStreams_PacketsInBothDirections) {
@@ -572,6 +572,7 @@ TEST_F(FlowTest, StreamFollower_AttachToStreams_SecondPacketLost) {
packets.erase(packets.begin() + 1);
// Erase the 5-10th bytes
trimmed_payload.erase(5, 5);
set_endpoints(packets, "1.2.3.4", 22, "4.3.2.1", 25);
StreamFollower follower;
follower.follow_partial_streams(true);
@@ -589,6 +590,34 @@ TEST_F(FlowTest, StreamFollower_AttachToStreams_SecondPacketLost) {
EXPECT_EQ(trimmed_payload, merge_chunks(stream_client_payload_chunks));
}
TEST_F(FlowTest, StreamFollower_AttachToStreams_RecoveryMode) {
using std::placeholders::_1;
ordering_info_type chunks = split_payload(payload, 5);
vector<EthernetII> packets = chunks_to_packets(30 /*initial_seq*/, chunks, payload);
string trimmed_payload = payload;
// Erase the 15-20th and 5-10th bytes
trimmed_payload.erase(15, 5);
trimmed_payload.erase(5, 5);
// Erase the second packet
packets.erase(packets.begin() + 3);
packets.erase(packets.begin() + 1);
set_endpoints(packets, "1.2.3.4", 22, "4.3.2.1", 25);
StreamFollower follower;
follower.follow_partial_streams(true);
follower.new_stream_callback([&](Stream& stream) {
on_new_stream(stream);
stream.enable_recovery_mode(20 /*recovery window size*/);
});
for (size_t i = 0; i < packets.size(); ++i) {
follower.process_packet(packets[i]);
}
EXPECT_EQ(packets.size(), stream_client_payload_chunks.size());
EXPECT_EQ(trimmed_payload, merge_chunks(stream_client_payload_chunks));
EXPECT_EQ(trimmed_payload, merge_chunks(stream_client_payload_chunks));
}
#ifdef TINS_HAVE_ACK_TRACKER
using namespace boost;