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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user