Index: net/quic/quic_unacked_packet_map.cc |
diff --git a/net/quic/quic_unacked_packet_map.cc b/net/quic/quic_unacked_packet_map.cc |
index 3bba773681cfb46f769f988a4f5912c55f72d2cb..6332706326e166d9ee4096806612fd90cf26c931 100644 |
--- a/net/quic/quic_unacked_packet_map.cc |
+++ b/net/quic/quic_unacked_packet_map.cc |
@@ -38,8 +38,13 @@ QuicUnackedPacketMap::~QuicUnackedPacketMap() { |
// sent in order and the connection tracks RetransmittableFrames for longer. |
void QuicUnackedPacketMap::AddPacket( |
const SerializedPacket& serialized_packet) { |
- DCHECK_EQ(least_unacked_ + unacked_packets_.size(), |
- serialized_packet.sequence_number); |
+ DCHECK_GE(serialized_packet.sequence_number, |
+ least_unacked_ + unacked_packets_.size()); |
+ while (least_unacked_ + unacked_packets_.size() < |
+ serialized_packet.sequence_number) { |
+ unacked_packets_.push_back(TransmissionInfo()); |
+ unacked_packets_.back().is_unackable = true; |
+ } |
unacked_packets_.push_back( |
TransmissionInfo(serialized_packet.retransmittable_frames, |
serialized_packet.sequence_number_length)); |
@@ -67,7 +72,11 @@ void QuicUnackedPacketMap::OnRetransmittedPacket( |
TransmissionType transmission_type) { |
DCHECK_GE(old_sequence_number, least_unacked_); |
DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size()); |
- DCHECK_EQ(least_unacked_ + unacked_packets_.size(), new_sequence_number); |
+ DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size()); |
+ while (least_unacked_ + unacked_packets_.size() < new_sequence_number) { |
+ unacked_packets_.push_back(TransmissionInfo()); |
+ unacked_packets_.back().is_unackable = true; |
+ } |
// TODO(ianswett): Discard and lose the packet lazily instead of immediately. |
TransmissionInfo* transmission_info = |
@@ -225,7 +234,7 @@ void QuicUnackedPacketMap::IncreaseLargestObserved( |
bool QuicUnackedPacketMap::IsPacketUseless( |
QuicPacketSequenceNumber sequence_number, |
const TransmissionInfo& info) const { |
- return sequence_number <= largest_observed_ && |
+ return (info.is_unackable || sequence_number <= largest_observed_) && |
!info.in_flight && |
info.retransmittable_frames == NULL && |
info.all_transmissions == NULL; |