diff options
Diffstat (limited to 'net/quic/quic_connection_helper.cc')
-rw-r--r-- | net/quic/quic_connection_helper.cc | 66 |
1 files changed, 12 insertions, 54 deletions
diff --git a/net/quic/quic_connection_helper.cc b/net/quic/quic_connection_helper.cc index b53646db..18fd69d 100644 --- a/net/quic/quic_connection_helper.cc +++ b/net/quic/quic_connection_helper.cc @@ -15,13 +15,6 @@ namespace net { -// Limit the number of packets we send per resend-alarm so we eventually cede. -// 10 is arbitrary. -const size_t kMaxPacketsPerResendAlarm = 10; - -// The time to wait if an RTO alarm fires but is ignored due to truncated acks. -const int kExtraRTODelayUs = 500 * 1000; - QuicConnectionHelper::QuicConnectionHelper(base::TaskRunner* task_runner, const QuicClock* clock, QuicRandom* random_generator, @@ -33,10 +26,10 @@ QuicConnectionHelper::QuicConnectionHelper(base::TaskRunner* task_runner, random_generator_(random_generator), send_alarm_registered_(false), timeout_alarm_registered_(false), - resend_alarm_registered_(false), - resend_alarm_running_(false), + retransmission_alarm_registered_(false), + retransmission_alarm_running_(false), ack_alarm_registered_(false), - ack_alarm_time_(QuicTime()) { + ack_alarm_time_(QuicTime::Zero()) { } QuicConnectionHelper::~QuicConnectionHelper() { @@ -78,19 +71,14 @@ int QuicConnectionHelper::WritePacketToWire( return rv; } -void QuicConnectionHelper::SetResendAlarm( - QuicPacketSequenceNumber sequence_number, - QuicTime::Delta delay) { - if (!resend_alarm_registered_ && - !resend_alarm_running_) { - resend_alarm_registered_ = true; +void QuicConnectionHelper::SetRetransmissionAlarm(QuicTime::Delta delay) { + if (!retransmission_alarm_registered_) { task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&QuicConnectionHelper::OnResendAlarm, + base::Bind(&QuicConnectionHelper::OnRetransmissionAlarm, weak_factory_.GetWeakPtr()), base::TimeDelta::FromMicroseconds(delay.ToMicroseconds())); } - resend_times_[sequence_number] = clock_->Now().Add(delay); } void QuicConnectionHelper::SetAckAlarm(QuicTime::Delta delay) { @@ -106,7 +94,7 @@ void QuicConnectionHelper::SetAckAlarm(QuicTime::Delta delay) { } void QuicConnectionHelper::ClearAckAlarm() { - ack_alarm_time_ = QuicTime(); + ack_alarm_time_ = QuicTime::Zero(); } void QuicConnectionHelper::SetSendAlarm(QuicTime::Delta delay) { @@ -149,41 +137,11 @@ void QuicConnectionHelper::GetPeerAddress(IPEndPoint* peer_address) { socket_->GetPeerAddress(peer_address); } -void QuicConnectionHelper::OnResendAlarm() { - // This guards against registering the alarm later than we should. - // - // If we have packet A and B in the list and we call MaybeResendPacketForRTO - // on A, that may trigger a call to SetResendAlarm if A is resent as C. In - // that case we don't want to register the alarm under SetResendAlarm; we - // want to set it to the RTO of B at the end of this method. - resend_alarm_registered_ = false; - resend_alarm_running_ = true; - - for (size_t i = 0; i < kMaxPacketsPerResendAlarm; ++i) { - if (resend_times_.empty() || - resend_times_.begin()->second > clock_->Now()) { - break; - } - QuicPacketSequenceNumber sequence_number = resend_times_.begin()->first; - if (!connection_->MaybeResendPacketForRTO(sequence_number)) { - DLOG(INFO) << "MaybeResendPacketForRTO failed: adding an extra delay."; - SetResendAlarm(sequence_number, - QuicTime::Delta::FromMicroseconds(kExtraRTODelayUs)); - break; - } - resend_times_.erase(sequence_number); - } - - // Nothing from here on does external calls. - resend_alarm_running_ = false; - if (resend_times_.empty()) { - return; +void QuicConnectionHelper::OnRetransmissionAlarm() { + QuicTime when = connection_->OnRetransmissionTimeout(); + if (!when.IsInitialized()) { + SetRetransmissionAlarm(clock_->Now().Subtract(when)); } - - // We have packet remaining. Reschedule for the RTO of the oldest packet - // on the list. - SetResendAlarm(resend_times_.begin()->first, - resend_times_.begin()->second.Subtract(clock_->Now())); } void QuicConnectionHelper::OnSendAlarm() { @@ -211,7 +169,7 @@ void QuicConnectionHelper::OnAckAlarm() { return; } - ack_alarm_time_ = QuicTime(); + ack_alarm_time_ = QuicTime::Zero(); connection_->SendAck(); } |