From c69ea0c1fbe20ecb0cfe14bfd3f42bb68d589435 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Sun, 30 Oct 2016 13:08:17 -0700 Subject: [PATCH] Keep original out of order callback on recovery mode --- include/tins/tcp_ip/stream.h | 9 ++++----- src/tcp_ip/stream.cpp | 26 ++++++++++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/include/tins/tcp_ip/stream.h b/include/tins/tcp_ip/stream.h index 4ce49b1..1ea21ac 100644 --- a/include/tins/tcp_ip/stream.h +++ b/include/tins/tcp_ip/stream.h @@ -413,9 +413,6 @@ public: * (the client one in this case) will be set to the out of order packet's sequece number. * This means that if an out of order packet is captured having a sequence number X + 5 right * after enabling recovery mode, then the Flow's sequence number will be set to X + 5. - * - * Note that enabling recovery mode will override the Stream's out of order callbacks, so - * you if you set a callback and then call this method, your callback will be lost. */ void enable_recovery_mode(uint32_t recovery_window); @@ -440,10 +437,12 @@ private: const payload_type& payload); static void client_recovery_mode_handler(Stream& stream, uint32_t sequence_number, const payload_type& payload, - uint32_t recovery_sequence_number_end); + uint32_t recovery_sequence_number_end, + const stream_packet_callback_type& original_callback); static void server_recovery_mode_handler(Stream& stream, uint32_t sequence_number, const payload_type& payload, - uint32_t recovery_sequence_number_end); + uint32_t recovery_sequence_number_end, + const stream_packet_callback_type& original_callback); static bool recovery_mode_handler(Flow& flow, uint32_t sequence_number, uint32_t recovery_sequence_number_end); diff --git a/src/tcp_ip/stream.cpp b/src/tcp_ip/stream.cpp index 6851d9c..4a154fa 100644 --- a/src/tcp_ip/stream.cpp +++ b/src/tcp_ip/stream.cpp @@ -279,9 +279,11 @@ bool Stream::is_partial_stream() const { void Stream::enable_recovery_mode(uint32_t recovery_window) { using namespace std::placeholders; client_out_of_order_callback(bind(&Stream::client_recovery_mode_handler, _1, _2, _3, - client_flow_.sequence_number() + recovery_window)); + client_flow_.sequence_number() + recovery_window, + on_client_out_of_order_callback_)); server_out_of_order_callback(bind(&Stream::server_recovery_mode_handler, _1, _2, _3, - server_flow_.sequence_number() + recovery_window)); + server_flow_.sequence_number() + recovery_window, + on_server_out_of_order_callback_)); directions_recovery_mode_enabled_ = 2; } @@ -320,23 +322,31 @@ void Stream::on_server_out_of_order(const Flow& flow, uint32_t seq, const payloa } void Stream::client_recovery_mode_handler(Stream& stream, uint32_t sequence_number, - const payload_type& /*payload*/, - uint32_t recovery_sequence_number_end) { + const payload_type& payload, + uint32_t recovery_sequence_number_end, + const stream_packet_callback_type& original_callback) { if (!recovery_mode_handler(stream.client_flow(), sequence_number, recovery_sequence_number_end)) { - stream.client_out_of_order_callback(stream_packet_callback_type()); + stream.client_out_of_order_callback(original_callback); stream.directions_recovery_mode_enabled_--; } + if (original_callback) { + original_callback(stream, sequence_number, payload); + } } void Stream::server_recovery_mode_handler(Stream& stream, uint32_t sequence_number, - const payload_type& /*payload*/, - uint32_t recovery_sequence_number_end) { + const payload_type& payload, + uint32_t recovery_sequence_number_end, + const stream_packet_callback_type& original_callback) { if (!recovery_mode_handler(stream.server_flow(), sequence_number, recovery_sequence_number_end)) { - stream.server_out_of_order_callback(stream_packet_callback_type()); + stream.server_out_of_order_callback(original_callback); stream.directions_recovery_mode_enabled_--; } + if (original_callback) { + original_callback(stream, sequence_number, payload); + } } bool Stream::recovery_mode_handler(Flow& flow, uint32_t sequence_number,