summaryrefslogtreecommitdiffstats
path: root/net/quic/quic_sent_packet_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/quic/quic_sent_packet_manager.cc')
-rw-r--r--net/quic/quic_sent_packet_manager.cc91
1 files changed, 32 insertions, 59 deletions
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
index f2eb6d3..f73bfd3 100644
--- a/net/quic/quic_sent_packet_manager.cc
+++ b/net/quic/quic_sent_packet_manager.cc
@@ -132,6 +132,13 @@ void QuicSentPacketManager::OnIncomingAck(
InvokeLossDetection(ack_receive_time);
MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight);
+ // If we have received a truncated ack, then we need to clear out some
+ // previous transmissions to allow the peer to actually ACK new packets.
+ if (received_info.is_truncated) {
+ unacked_packets_.ClearPreviousRetransmissions(
+ received_info.missing_packets.size() / 2);
+ }
+
// Anytime we are making forward progress and have a new RTT estimate, reset
// the backoff counters.
if (largest_observed_acked) {
@@ -153,11 +160,6 @@ void QuicSentPacketManager::MaybeInvokeCongestionEvent(
}
}
-void QuicSentPacketManager::DiscardUnackedPacket(
- QuicPacketSequenceNumber sequence_number) {
- MarkPacketHandled(sequence_number, QuicTime::Delta::Zero());
-}
-
void QuicSentPacketManager::HandleAckForSentPackets(
const ReceivedPacketInfo& received_info) {
// Go through the packets we have not received an ack for and see if this
@@ -176,7 +178,8 @@ void QuicSentPacketManager::HandleAckForSentPackets(
// Remove any rtt only packets less than or equal to the largest observed,
// since they will not produce an RTT measurement.
if (QuicUnackedPacketMap::IsForRttOnly(it->second)) {
- it = MarkPacketHandled(sequence_number, delta_largest_observed);
+ ++it;
+ unacked_packets_.RemoveRttOnlyPacket(sequence_number);
} else {
// Consider it multiple nacks when there is a gap between the missing
// packet and the largest observed, since the purpose of a nack
@@ -210,14 +213,6 @@ void QuicSentPacketManager::HandleAckForSentPackets(
revived_it != received_info.revived_packets.end(); ++revived_it) {
MarkPacketRevived(*revived_it, delta_largest_observed);
}
-
- // If we have received a truncated ack, then we need to
- // clear out some previous transmissions to allow the peer
- // to actually ACK new packets.
- if (received_info.is_truncated) {
- unacked_packets_.ClearPreviousRetransmissions(
- received_info.missing_packets.size() / 2);
- }
}
bool QuicSentPacketManager::HasRetransmittableFrames(
@@ -264,14 +259,8 @@ void QuicSentPacketManager::NeuterUnencryptedPackets() {
// they are not retransmitted or considered lost from a congestion control
// perspective.
pending_retransmissions_.erase(it->first);
+ unacked_packets_.RemoveRetransmittibility(it->first, largest_observed_);
unacked_packets_.SetNotPending(it->first);
- // TODO(ianswett): Clean this up so UnackedPacketMap maintains the correct
- // invariants between the various transmissions for NeuterPacket.
- SequenceNumberSet all_transmissions = *it->second.all_transmissions;
- for (SequenceNumberSet::const_iterator all_it = all_transmissions.begin();
- all_it != all_transmissions.end(); ++all_it) {
- unacked_packets_.NeuterPacket(*all_it);
- }
}
}
}
@@ -317,7 +306,7 @@ QuicSentPacketManager::PendingRetransmission
++it;
} while (it != pending_retransmissions_.end());
}
- DCHECK(unacked_packets_.IsUnacked(sequence_number));
+ DCHECK(unacked_packets_.IsUnacked(sequence_number)) << sequence_number;
const TransmissionInfo& transmission_info =
unacked_packets_.GetTransmissionInfo(sequence_number);
DCHECK(transmission_info.retransmittable_frames);
@@ -334,24 +323,23 @@ void QuicSentPacketManager::MarkPacketRevived(
if (!unacked_packets_.IsUnacked(sequence_number)) {
return;
}
- // This packet has been revived at the receiver. If we were going to
- // retransmit it, do not retransmit it anymore.
- pending_retransmissions_.erase(sequence_number);
const TransmissionInfo& transmission_info =
unacked_packets_.GetTransmissionInfo(sequence_number);
+ QuicPacketSequenceNumber newest_transmission =
+ *transmission_info.all_transmissions->rbegin();
+ // This packet has been revived at the receiver. If we were going to
+ // retransmit it, do not retransmit it anymore.
+ pending_retransmissions_.erase(newest_transmission);
+
// The AckNotifierManager needs to be notified for revived packets,
// since it indicates the packet arrived from the appliction's perspective.
if (transmission_info.retransmittable_frames) {
ack_notifier_manager_.OnPacketAcked(
- sequence_number, delta_largest_observed);
+ newest_transmission, delta_largest_observed);
}
- if (!transmission_info.pending) {
- unacked_packets_.RemovePacket(sequence_number);
- } else {
- unacked_packets_.NeuterPacket(sequence_number);
- }
+ unacked_packets_.RemoveRetransmittibility(sequence_number, largest_observed_);
}
QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled(
@@ -363,15 +351,9 @@ QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled(
}
const TransmissionInfo& transmission_info =
unacked_packets_.GetTransmissionInfo(sequence_number);
- // If this packet is pending, remove it.
- if (transmission_info.pending) {
- unacked_packets_.SetNotPending(sequence_number);
- }
- SequenceNumberSet all_transmissions = *transmission_info.all_transmissions;
- SequenceNumberSet::reverse_iterator all_transmissions_it =
- all_transmissions.rbegin();
- QuicPacketSequenceNumber newest_transmission = *all_transmissions_it;
+ QuicPacketSequenceNumber newest_transmission =
+ *transmission_info.all_transmissions->rbegin();
// Remove the most recent packet, if it is pending retransmission.
pending_retransmissions_.erase(newest_transmission);
@@ -389,31 +371,20 @@ QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled(
ack_notifier_manager_.OnPacketAcked(newest_transmission,
delta_largest_observed);
+ // If it's a crypto handshake packet, discard it and all retransmissions,
+ // since they won't be acked now that one has been processed.
// TODO(ianswett): Instead of handling all crypto packets in a special way,
// only handle NULL encrypted packets in a special way.
- bool has_crypto_handshake = HasCryptoHandshake(
- unacked_packets_.GetTransmissionInfo(newest_transmission));
- while (all_transmissions_it != all_transmissions.rend()) {
- QuicPacketSequenceNumber previous_transmission = *all_transmissions_it;
- const TransmissionInfo& transmission_info =
- unacked_packets_.GetTransmissionInfo(previous_transmission);
- DCHECK(!ContainsKey(pending_retransmissions_, previous_transmission));
- if (has_crypto_handshake) {
- // If it's a crypto handshake packet, discard it and all retransmissions,
- // since they won't be acked now that one has been processed.
- unacked_packets_.SetNotPending(previous_transmission);
- }
- if (!transmission_info.pending) {
- unacked_packets_.RemovePacket(previous_transmission);
- } else {
- unacked_packets_.NeuterPacket(previous_transmission);
- }
- ++all_transmissions_it;
+ if (HasCryptoHandshake(
+ unacked_packets_.GetTransmissionInfo(newest_transmission))) {
+ unacked_packets_.SetNotPending(newest_transmission);
}
+ unacked_packets_.SetNotPending(sequence_number);
+ unacked_packets_.RemoveRetransmittibility(sequence_number, largest_observed_);
QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin();
while (next_unacked != unacked_packets_.end() &&
- next_unacked->first < sequence_number) {
+ next_unacked->first <= sequence_number) {
++next_unacked;
}
return next_unacked;
@@ -619,7 +590,9 @@ void QuicSentPacketManager::InvokeLossDetection(QuicTime time) {
// a packet whose previous transmission has been acked, a packet that has
// been TLP retransmitted, or an FEC packet.
unacked_packets_.SetNotPending(sequence_number);
- unacked_packets_.RemovePacket(sequence_number);
+ if (QuicUnackedPacketMap::IsForRttOnly(transmission_info)) {
+ unacked_packets_.RemoveRttOnlyPacket(sequence_number);
+ }
}
}
}