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

Keep original out of order callback on recovery mode

This commit is contained in:
Matias Fontanini
2016-10-30 13:08:17 -07:00
parent a63387f85e
commit c69ea0c1fb
2 changed files with 22 additions and 13 deletions

View File

@@ -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);

View File

@@ -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,