Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index 093f9bb12f9d8cb5bbf96d8e8538675215b564dd..46e6ea137193110c255c46c9eaac4b41e397dcf1 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -219,12 +219,8 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id, |
idle_network_timeout_( |
QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), |
overall_connection_timeout_(QuicTime::Delta::Infinite()), |
- time_of_last_received_packet_( |
- FLAGS_quic_timeouts_require_activity |
- ? QuicTime::Zero() : clock_->ApproximateNow()), |
- time_of_last_sent_new_packet_( |
- FLAGS_quic_timeouts_require_activity |
- ? QuicTime::Zero() : clock_->ApproximateNow()), |
+ time_of_last_received_packet_(clock_->ApproximateNow()), |
+ time_of_last_sent_new_packet_(clock_->ApproximateNow()), |
sequence_number_of_last_sent_packet_(0), |
sent_packet_manager_( |
is_server, clock_, &stats_, |
@@ -1442,24 +1438,17 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) { |
sent_packet_manager_.least_packet_awaited_by_peer(), |
sent_packet_manager_.GetCongestionWindow()); |
- if (packet->original_sequence_number == 0) { |
- sent_packet_manager_.OnSerializedPacket(packet->serialized_packet); |
- } else { |
- if (debug_visitor_.get() != NULL) { |
- debug_visitor_->OnPacketRetransmitted( |
- packet->original_sequence_number, sequence_number); |
- } |
- sent_packet_manager_.OnRetransmittedPacket(packet->original_sequence_number, |
- sequence_number); |
+ if (packet->original_sequence_number != 0 && debug_visitor_.get() != NULL) { |
+ debug_visitor_->OnPacketRetransmitted( |
+ packet->original_sequence_number, sequence_number); |
} |
bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( |
- sequence_number, |
+ &packet->serialized_packet, |
+ packet->original_sequence_number, |
now, |
encrypted->length(), |
packet->transmission_type, |
IsRetransmittable(*packet)); |
- // The SentPacketManager now owns the retransmittable frames. |
- packet->serialized_packet.retransmittable_frames = NULL; |
if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { |
retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(), |
@@ -1887,7 +1876,11 @@ void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { |
if (timeout < idle_network_timeout_) { |
idle_network_timeout_ = timeout; |
- CheckForTimeout(); |
+ if (FLAGS_quic_timeouts_only_from_alarms) { |
+ SetTimeoutAlarm(); |
+ } else { |
+ CheckForTimeout(); |
+ } |
} else { |
idle_network_timeout_ = timeout; |
} |
@@ -1896,67 +1889,67 @@ void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { |
void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { |
if (timeout < overall_connection_timeout_) { |
overall_connection_timeout_ = timeout; |
- CheckForTimeout(); |
+ if (FLAGS_quic_timeouts_only_from_alarms) { |
+ SetTimeoutAlarm(); |
+ } else { |
+ CheckForTimeout(); |
+ } |
} else { |
overall_connection_timeout_ = timeout; |
} |
} |
-bool QuicConnection::CheckForTimeout() { |
+void QuicConnection::CheckForTimeout() { |
QuicTime now = clock_->ApproximateNow(); |
QuicTime time_of_last_packet = max(time_of_last_received_packet_, |
time_of_last_sent_new_packet_); |
- // If no packets have been sent or received, then don't timeout. |
- if (FLAGS_quic_timeouts_require_activity && |
- !time_of_last_packet.IsInitialized()) { |
- timeout_alarm_->Cancel(); |
- timeout_alarm_->Set(now.Add(idle_network_timeout_)); |
- return false; |
- } |
- |
// |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| |
// is accurate time. However, this should not change the behavior of |
// timeout handling. |
- QuicTime::Delta delta = now.Subtract(time_of_last_packet); |
+ QuicTime::Delta idle_duration = now.Subtract(time_of_last_packet); |
DVLOG(1) << ENDPOINT << "last packet " |
<< time_of_last_packet.ToDebuggingValue() |
<< " now:" << now.ToDebuggingValue() |
- << " delta:" << delta.ToMicroseconds() |
- << " network_timeout: " << idle_network_timeout_.ToMicroseconds(); |
- if (delta >= idle_network_timeout_) { |
+ << " idle_duration:" << idle_duration.ToMicroseconds() |
+ << " idle_network_timeout: " |
+ << idle_network_timeout_.ToMicroseconds(); |
+ if (idle_duration >= idle_network_timeout_) { |
DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; |
SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); |
- return true; |
+ return; |
} |
- // Next timeout delta. |
- QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta); |
- |
if (!overall_connection_timeout_.IsInfinite()) { |
- QuicTime::Delta connected_time = |
+ QuicTime::Delta connected_duration = |
now.Subtract(stats_.connection_creation_time); |
DVLOG(1) << ENDPOINT << "connection time: " |
- << connected_time.ToMilliseconds() << " overall timeout: " |
- << overall_connection_timeout_.ToMilliseconds(); |
- if (connected_time >= overall_connection_timeout_) { |
+ << connected_duration.ToMicroseconds() << " overall timeout: " |
+ << overall_connection_timeout_.ToMicroseconds(); |
+ if (connected_duration >= overall_connection_timeout_) { |
DVLOG(1) << ENDPOINT << |
"Connection timedout due to overall connection timeout."; |
SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); |
- return true; |
+ return; |
} |
+ } |
- // Take the min timeout. |
- QuicTime::Delta connection_timeout = |
- overall_connection_timeout_.Subtract(connected_time); |
- if (connection_timeout < timeout) { |
- timeout = connection_timeout; |
- } |
+ SetTimeoutAlarm(); |
+} |
+ |
+void QuicConnection::SetTimeoutAlarm() { |
+ QuicTime time_of_last_packet = max(time_of_last_received_packet_, |
+ time_of_last_sent_new_packet_); |
+ |
+ QuicTime deadline = time_of_last_packet.Add(idle_network_timeout_); |
+ if (!overall_connection_timeout_.IsInfinite()) { |
+ deadline = min(deadline, |
+ stats_.connection_creation_time.Add( |
+ overall_connection_timeout_)); |
} |
timeout_alarm_->Cancel(); |
- timeout_alarm_->Set(now.Add(timeout)); |
- return false; |
+ timeout_alarm_->Set(deadline); |
} |
void QuicConnection::SetPingAlarm() { |