Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index a4305f62c71bfd1de98ed44f2e7e8cd6c1f5c288..a928280bff17990d5cfe2207f1b19f47c119b0a8 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -569,12 +569,10 @@ void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { |
// Always reset the retransmission alarm when an ack comes in, since we now |
// have a better estimate of the current rtt than when it was set. |
- retransmission_alarm_->Cancel(); |
QuicTime retransmission_time = |
sent_packet_manager_.GetRetransmissionTime(); |
- if (retransmission_time != QuicTime::Zero()) { |
- retransmission_alarm_->Set(retransmission_time); |
- } |
+ retransmission_alarm_->Update(retransmission_time, |
+ QuicTime::Delta::FromMilliseconds(1)); |
} |
void QuicConnection::ProcessStopWaitingFrame( |
@@ -1278,11 +1276,9 @@ void QuicConnection::RetransmitUnackedPackets( |
void QuicConnection::NeuterUnencryptedPackets() { |
sent_packet_manager_.NeuterUnencryptedPackets(); |
// This may have changed the retransmission timer, so re-arm it. |
- retransmission_alarm_->Cancel(); |
QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); |
- if (retransmission_time != QuicTime::Zero()) { |
- retransmission_alarm_->Set(retransmission_time); |
- } |
+ retransmission_alarm_->Update(retransmission_time, |
+ QuicTime::Delta::FromMilliseconds(1)); |
} |
bool QuicConnection::ShouldGeneratePacket( |
@@ -1304,20 +1300,21 @@ bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) { |
return false; |
} |
- send_alarm_->Cancel(); |
QuicTime now = clock_->Now(); |
QuicTime::Delta delay = sent_packet_manager_.TimeUntilSend( |
now, retransmittable); |
if (delay.IsInfinite()) { |
+ send_alarm_->Cancel(); |
return false; |
} |
// If the scheduler requires a delay, then we can not send this packet now. |
if (!delay.IsZero()) { |
- send_alarm_->Set(now.Add(delay)); |
+ send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); |
DVLOG(1) << "Delaying sending."; |
return false; |
} |
+ send_alarm_->Cancel(); |
return true; |
} |
@@ -1511,11 +1508,9 @@ bool QuicConnection::OnPacketSent(WriteResult result) { |
transmission_type, retransmittable); |
if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { |
- retransmission_alarm_->Cancel(); |
QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); |
- if (retransmission_time != QuicTime::Zero()) { |
- retransmission_alarm_->Set(retransmission_time); |
- } |
+ retransmission_alarm_->Update(retransmission_time, |
+ QuicTime::Delta::FromMilliseconds(1)); |
} |
stats_.bytes_sent += result.bytes_written; |
@@ -1632,7 +1627,7 @@ void QuicConnection::OnRetransmissionTimeout() { |
// and nothing waiting to be sent. |
if (!HasQueuedData() && !retransmission_alarm_->IsSet()) { |
QuicTime rto_timeout = sent_packet_manager_.GetRetransmissionTime(); |
- if (rto_timeout != QuicTime::Zero()) { |
+ if (rto_timeout.IsInitialized()) { |
retransmission_alarm_->Set(rto_timeout); |
} |
} |
@@ -1882,6 +1877,14 @@ bool QuicConnection::CanWriteStreamData() { |
} |
void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { |
+ // Adjust the idle timeout on client and server to prevent clients from |
+ // sending requests to servers which have already closed the connection. |
+ if (is_server_) { |
+ timeout = timeout.Add(QuicTime::Delta::FromSeconds(1)); |
+ } else if (timeout > QuicTime::Delta::FromSeconds(1)) { |
+ timeout = timeout.Subtract(QuicTime::Delta::FromSeconds(1)); |
+ } |
+ |
if (timeout < idle_network_timeout_) { |
idle_network_timeout_ = timeout; |
CheckForTimeout(); |
@@ -1944,7 +1947,7 @@ bool QuicConnection::CheckForTimeout() { |
} |
timeout_alarm_->Cancel(); |
- timeout_alarm_->Set(clock_->ApproximateNow().Add(timeout)); |
+ timeout_alarm_->Set(now.Add(timeout)); |
return false; |
} |
@@ -1953,13 +1956,14 @@ void QuicConnection::SetPingAlarm() { |
// Only clients send pings. |
return; |
} |
- ping_alarm_->Cancel(); |
if (!visitor_->HasOpenDataStreams()) { |
+ ping_alarm_->Cancel(); |
// Don't send a ping unless there are open streams. |
return; |
} |
QuicTime::Delta ping_timeout = QuicTime::Delta::FromSeconds(kPingTimeoutSecs); |
- ping_alarm_->Set(clock_->ApproximateNow().Add(ping_timeout)); |
+ ping_alarm_->Update(clock_->ApproximateNow().Add(ping_timeout), |
+ QuicTime::Delta::FromSeconds(1)); |
} |
QuicConnection::ScopedPacketBundler::ScopedPacketBundler( |