| Index: net/quic/quic_sent_packet_manager.cc
|
| diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
|
| index 5c2b139a6e3fb13c5c0d2bfd675f88b67f59e774..b7b28c48de020d88856cca7b2a1dd6a872a75706 100644
|
| --- a/net/quic/quic_sent_packet_manager.cc
|
| +++ b/net/quic/quic_sent_packet_manager.cc
|
| @@ -610,11 +610,13 @@ void QuicSentPacketManager::RetransmitCryptoPackets() {
|
| for (UnackedPacketMap::iterator it = unacked_packets_.begin();
|
| it != unacked_packets_.end(); ++it) {
|
| QuicPacketSequenceNumber sequence_number = it->first;
|
| - DCHECK(ContainsKey(packet_history_map_, sequence_number));
|
| const RetransmittableFrames* frames = it->second.retransmittable_frames;
|
| - if (frames == NULL || frames->HasCryptoHandshake() != IS_HANDSHAKE) {
|
| + // Only retransmit frames which are pending, and therefore have been sent.
|
| + if (!it->second.pending || frames == NULL ||
|
| + frames->HasCryptoHandshake() != IS_HANDSHAKE) {
|
| continue;
|
| }
|
| + DCHECK(ContainsKey(packet_history_map_, sequence_number));
|
| packet_retransmitted = true;
|
| MarkForRetransmission(sequence_number, TLP_RETRANSMISSION);
|
| // Abandon all the crypto retransmissions now so they're not lost later.
|
| @@ -630,7 +632,8 @@ void QuicSentPacketManager::RetransmitOldestPacket() {
|
| it != unacked_packets_.end(); ++it) {
|
| QuicPacketSequenceNumber sequence_number = it->first;
|
| const RetransmittableFrames* frames = it->second.retransmittable_frames;
|
| - if (frames == NULL) {
|
| + // Only retransmit frames which are pending, and therefore have been sent.
|
| + if (!it->second.pending || frames == NULL) {
|
| continue;
|
| }
|
| DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake());
|
| @@ -723,7 +726,7 @@ void QuicSentPacketManager::MaybeRetransmitOnAckFrame(
|
| DCHECK(IsAwaitingPacket(received_info, sequence_number));
|
| DCHECK(ContainsKey(packet_history_map_, sequence_number));
|
| const TransmissionInfo& transmission_info = it->second;
|
| - const SendAlgorithmInterface::SentPacket* sent_packet =
|
| + SendAlgorithmInterface::SentPacket* sent_packet =
|
| packet_history_map_[sequence_number];
|
|
|
| // Consider it multiple nacks when there is a gap between the missing packet
|
| @@ -732,7 +735,7 @@ void QuicSentPacketManager::MaybeRetransmitOnAckFrame(
|
| // TODO(ianswett): This relies heavily on sequential reception of packets,
|
| // and makes an assumption that the congestion control uses TCP style nacks.
|
| size_t min_nacks = received_info.largest_observed - sequence_number;
|
| - packet_history_map_[sequence_number]->Nack(min_nacks);
|
| + sent_packet->Nack(min_nacks);
|
|
|
| size_t num_nacks_needed = kNumberOfNacksBeforeRetransmission;
|
| // Check for early retransmit(RFC5827) when the last packet gets acked and
|
|
|