Index: net/quic/quic_received_packet_manager.cc |
diff --git a/net/quic/quic_received_packet_manager.cc b/net/quic/quic_received_packet_manager.cc |
index 844ad43e37b14d3e746f957ec2b1d77c9d100998..b24ac7c671eaee7a728a3d46124bd84d9246ba9c 100644 |
--- a/net/quic/quic_received_packet_manager.cc |
+++ b/net/quic/quic_received_packet_manager.cc |
@@ -5,6 +5,7 @@ |
#include "net/quic/quic_received_packet_manager.h" |
#include "base/logging.h" |
+#include "base/stl_util.h" |
#include "net/base/linked_hash_map.h" |
using std::make_pair; |
@@ -13,6 +14,17 @@ using std::min; |
namespace net { |
+namespace { |
+ |
+// The maximum number of packets to ack immediately after a missing packet for |
+// fast retransmission to kick in at the sender. This limit is created to |
+// reduce the number of acks sent that have no benefit for fast retransmission. |
+// Set to the number of nacks needed for fast retransmit plus one for protection |
+// against an ack loss |
+const size_t kMaxPacketsAfterNewMissing = 4; |
+ |
+} |
+ |
QuicReceivedPacketManager::QuicReceivedPacketManager( |
CongestionFeedbackType congestion_type) |
: packets_entropy_hash_(0), |
@@ -60,6 +72,11 @@ void QuicReceivedPacketManager::RecordPacketReceived( |
} |
} |
+bool QuicReceivedPacketManager::IsMissing( |
+ QuicPacketSequenceNumber sequence_number) { |
+ return ContainsKey(received_info_.missing_packets, sequence_number); |
+} |
+ |
bool QuicReceivedPacketManager::IsAwaitingPacket( |
QuicPacketSequenceNumber sequence_number) { |
return ::net::IsAwaitingPacket(received_info_, sequence_number); |
@@ -213,4 +230,10 @@ bool QuicReceivedPacketManager::HasMissingPackets() { |
return !received_info_.missing_packets.empty(); |
} |
+bool QuicReceivedPacketManager::HasNewMissingPackets() { |
+ return HasMissingPackets() && |
+ (received_info_.largest_observed - |
+ *received_info_.missing_packets.rbegin()) <= kMaxPacketsAfterNewMissing; |
+} |
+ |
} // namespace net |