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 389917bd7a4de53f0c43244cfcfcd8d0c4dc54a8..8592ea711b0a0bcc74538b6a284cf026f25a6e95 100644 |
--- a/net/quic/quic_sent_packet_manager.cc |
+++ b/net/quic/quic_sent_packet_manager.cc |
@@ -67,15 +67,14 @@ QuicSentPacketManager::QuicSentPacketManager(bool is_server, |
const QuicClock* clock, |
QuicConnectionStats* stats, |
CongestionFeedbackType type) |
- : unacked_packets_(is_server), |
+ : unacked_packets_(), |
is_server_(is_server), |
clock_(clock), |
stats_(stats), |
- send_algorithm_(SendAlgorithmInterface::Create(clock, type, stats)), |
+ send_algorithm_( |
+ SendAlgorithmInterface::Create(clock, &rtt_stats_, type, stats)), |
loss_algorithm_(LossDetectionInterface::Create()), |
- rtt_sample_(QuicTime::Delta::Infinite()), |
largest_observed_(0), |
- pending_crypto_packet_count_(0), |
consecutive_rto_count_(0), |
consecutive_tlp_count_(0), |
consecutive_crypto_retransmission_count_(0), |
@@ -87,14 +86,11 @@ QuicSentPacketManager::~QuicSentPacketManager() { |
} |
void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
- if (config.initial_round_trip_time_us() > 0 && |
- rtt_sample_.IsInfinite()) { |
+ if (config.initial_round_trip_time_us() > 0) { |
// The initial rtt should already be set on the client side. |
DVLOG_IF(1, !is_server_) |
<< "Client did not set an initial RTT, but did negotiate one."; |
- rtt_sample_ = |
- QuicTime::Delta::FromMicroseconds(config.initial_round_trip_time_us()); |
- send_algorithm_->UpdateRtt(rtt_sample_); |
+ rtt_stats_.set_initial_rtt_us(config.initial_round_trip_time_us()); |
} |
if (config.congestion_control() == kPACE) { |
MaybeEnablePacing(); |
@@ -108,11 +104,6 @@ void QuicSentPacketManager::OnSerializedPacket( |
const SerializedPacket& serialized_packet) { |
if (serialized_packet.retransmittable_frames) { |
ack_notifier_manager_.OnSerializedPacket(serialized_packet); |
- |
- if (serialized_packet.retransmittable_frames->HasCryptoHandshake() |
- == IS_HANDSHAKE) { |
- ++pending_crypto_packet_count_; |
- } |
} |
unacked_packets_.AddPacket(serialized_packet); |
@@ -313,11 +304,8 @@ QuicSentPacketManager::MarkPacketHandled( |
++stats_->packets_spuriously_retransmitted; |
} |
- bool has_cryto_handshake = HasCryptoHandshake( |
+ bool has_crypto_handshake = HasCryptoHandshake( |
unacked_packets_.GetTransmissionInfo(newest_transmission)); |
- if (has_cryto_handshake) { |
- --pending_crypto_packet_count_; |
- } |
while (all_transmissions_it != all_transmissions.rend()) { |
QuicPacketSequenceNumber previous_transmission = *all_transmissions_it; |
const QuicUnackedPacketMap::TransmissionInfo& transmission_info = |
@@ -327,7 +315,7 @@ QuicSentPacketManager::MarkPacketHandled( |
// marked for retransmission. |
pending_retransmissions_.erase(previous_transmission); |
} |
- if (has_cryto_handshake) { |
+ 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. |
if (transmission_info.pending) { |
@@ -499,7 +487,7 @@ void QuicSentPacketManager::RetransmitAllPackets() { |
QuicSentPacketManager::RetransmissionTimeoutMode |
QuicSentPacketManager::GetRetransmissionMode() const { |
DCHECK(unacked_packets_.HasPendingPackets()); |
- if (pending_crypto_packet_count_ > 0) { |
+ if (unacked_packets_.HasPendingCryptoPackets()) { |
return HANDSHAKE_MODE; |
} |
if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { |
@@ -562,8 +550,7 @@ void QuicSentPacketManager::InvokeLossDetection(QuicTime time) { |
loss_algorithm_->DetectLostPackets(unacked_packets_, |
time, |
largest_observed_, |
- send_algorithm_->SmoothedRtt(), |
- rtt_sample_); |
+ rtt_stats_); |
for (SequenceNumberSet::const_iterator it = lost_packets.begin(); |
it != lost_packets.end(); ++it) { |
QuicPacketSequenceNumber sequence_number = *it; |
@@ -603,16 +590,8 @@ void QuicSentPacketManager::MaybeUpdateRTT( |
QuicTime::Delta send_delta = |
ack_receive_time.Subtract(transmission_info.sent_time); |
- if (send_delta > received_info.delta_time_largest_observed) { |
- rtt_sample_ = send_delta.Subtract( |
- received_info.delta_time_largest_observed); |
- } else if (rtt_sample_.IsInfinite()) { |
- // Even though we received information from the peer suggesting |
- // an invalid (negative) RTT, we can use the send delta as an |
- // approximation until we get a better estimate. |
- rtt_sample_ = send_delta; |
- } |
- send_algorithm_->UpdateRtt(rtt_sample_); |
+ rtt_stats_.UpdateRtt(send_delta, received_info.delta_time_largest_observed); |
+ send_algorithm_->UpdateRtt(rtt_stats_.latest_rtt()); |
} |
QuicTime::Delta QuicSentPacketManager::TimeUntilSend( |
@@ -666,10 +645,10 @@ const QuicTime QuicSentPacketManager::GetRetransmissionTime() const { |
// The RTO is based on the first pending packet. |
const QuicTime sent_time = |
unacked_packets_.GetFirstPendingPacketSentTime(); |
- // Always wait at least 1.5 * RTT after the first sent packet. |
+ QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); |
+ // Always wait at least 1.5 * RTT from now. |
QuicTime min_timeout = clock_->ApproximateNow().Add( |
SmoothedRtt().Multiply(1.5)); |
- QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); |
return QuicTime::Max(min_timeout, rto_timeout); |
} |
@@ -722,7 +701,7 @@ const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { |
} |
const QuicTime::Delta QuicSentPacketManager::SmoothedRtt() const { |
- return send_algorithm_->SmoothedRtt(); |
+ return rtt_stats_.SmoothedRtt(); |
} |
QuicBandwidth QuicSentPacketManager::BandwidthEstimate() const { |