From 94b603dde953fb8c54d5908b10c4230f4b7561db Mon Sep 17 00:00:00 2001 From: Clark Li Date: Tue, 21 Jun 2016 06:36:10 -0700 Subject: [PATCH] Calculate the smallest buffer size needed --- .../state/connected/receiver.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/udt/connected_protocol/state/connected/receiver.h b/src/udt/connected_protocol/state/connected/receiver.h index 420f7ee..4f013f3 100644 --- a/src/udt/connected_protocol/state/connected/receiver.h +++ b/src/udt/connected_protocol/state/connected/receiver.h @@ -3,6 +3,7 @@ #include +#include #include #include #include @@ -129,9 +130,18 @@ class Receiver { if (!packets_received_.empty()) { auto &begin_pair = *(packets_received_.begin()); auto first_seq_num_received_buffer = begin_pair.first; - if (packet_seq_gen.SeqLength(first_seq_num_received_buffer, - packet_seq_num) > - static_cast(max_received_size_)) { + const auto required_received_size = + std::min( + // Be optimistic here. + // Find the smallest buffer size needed for + // 1. Sequence numbers are received in order. (2 arrives after 1) + // 2. Sequence numbers are received out of order. (1 arrives after 2) + // 3. Sequence number has restarted after reaching the maximum + packet_seq_gen.SeqLength(first_seq_num_received_buffer, packet_seq_num), + packet_seq_gen.SeqLength(packet_seq_num, first_seq_num_received_buffer) + ); + + if (required_received_size > static_cast(max_received_size_)) { // drop -> no more buffer space available return; }