Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index 46e6ea137193110c255c46c9eaac4b41e397dcf1..f0f66a98f0ab10085fec6c2f4671281562d86851 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -216,8 +216,9 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id, |
timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), |
packet_generator_(connection_id_, &framer_, random_generator_, this), |
- idle_network_timeout_( |
- QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), |
+ idle_network_timeout_(FLAGS_quic_unified_timeouts ? |
+ QuicTime::Delta::Infinite() : |
+ QuicTime::Delta::FromSeconds(kDefaultIdleTimeoutSecs)), |
overall_connection_timeout_(QuicTime::Delta::Infinite()), |
time_of_last_received_packet_(clock_->ApproximateNow()), |
time_of_last_sent_new_packet_(clock_->ApproximateNow()), |
@@ -233,16 +234,11 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id, |
peer_port_changed_(false), |
self_ip_changed_(false), |
self_port_changed_(false) { |
-#if 0 |
- // TODO(rtenneti): Should we enable this code in chromium? |
- if (!is_server_) { |
- // Pacing will be enabled if the client negotiates it. |
- sent_packet_manager_.MaybeEnablePacing(); |
- } |
-#endif |
DVLOG(1) << ENDPOINT << "Created connection with connection_id: " |
<< connection_id; |
- timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); |
+ if (!FLAGS_quic_unified_timeouts) { |
+ timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); |
+ } |
framer_.set_visitor(this); |
framer_.set_received_entropy_calculator(&received_packet_manager_); |
stats_.connection_creation_time = clock_->ApproximateNow(); |
@@ -263,7 +259,17 @@ QuicConnection::~QuicConnection() { |
} |
void QuicConnection::SetFromConfig(const QuicConfig& config) { |
- SetIdleNetworkTimeout(config.idle_connection_state_lifetime()); |
+ if (FLAGS_quic_unified_timeouts) { |
+ if (config.negotiated()) { |
+ SetNetworkTimeouts(QuicTime::Delta::Infinite(), |
+ config.IdleConnectionStateLifetime()); |
+ } else { |
+ SetNetworkTimeouts(config.max_time_before_crypto_handshake(), |
+ config.max_idle_time_before_crypto_handshake()); |
+ } |
+ } else { |
+ SetIdleNetworkTimeout(config.IdleConnectionStateLifetime()); |
+ } |
sent_packet_manager_.SetFromConfig(config); |
} |
@@ -1346,8 +1352,6 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) { |
QuicPacketSequenceNumber sequence_number = |
packet->serialized_packet.sequence_number; |
- // Some encryption algorithms require the packet sequence numbers not be |
- // repeated. |
DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); |
sequence_number_of_last_sent_packet_ = sequence_number; |
@@ -1407,6 +1411,7 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) { |
if (debug_visitor_.get() != NULL) { |
// Pass the write result to the visitor. |
debug_visitor_->OnPacketSent(sequence_number, |
+ packet->original_sequence_number, |
packet->encryption_level, |
packet->transmission_type, |
*encrypted, |
@@ -1438,10 +1443,6 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) { |
sent_packet_manager_.least_packet_awaited_by_peer(), |
sent_packet_manager_.GetCongestionWindow()); |
- 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( |
&packet->serialized_packet, |
packet->original_sequence_number, |
@@ -1554,21 +1555,7 @@ void QuicConnection::SendPing() { |
if (retransmission_alarm_->IsSet()) { |
return; |
} |
- if (version() == QUIC_VERSION_16) { |
- // TODO(rch): remove this when we remove version 15 and 16. |
- // This is a horrible hideous hack which we should not support. |
- IOVector data; |
- char c_data[] = "C"; |
- data.Append(c_data, 1); |
- QuicConsumedData consumed_data = |
- packet_generator_.ConsumeData(kCryptoStreamId, data, 0, false, |
- MAY_FEC_PROTECT, NULL); |
- if (consumed_data.bytes_consumed == 0) { |
- DLOG(ERROR) << "Unable to send ping!?"; |
- } |
- } else { |
- packet_generator_.AddControlFrame(QuicFrame(new QuicPingFrame)); |
- } |
+ packet_generator_.AddControlFrame(QuicFrame(new QuicPingFrame)); |
} |
void QuicConnection::SendAck() { |
@@ -1899,6 +1886,24 @@ void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { |
} |
} |
+void QuicConnection::SetNetworkTimeouts(QuicTime::Delta overall_timeout, |
+ QuicTime::Delta idle_timeout) { |
+ LOG_IF(DFATAL, idle_timeout > overall_timeout) |
+ << "idle_timeout:" << idle_timeout.ToMilliseconds() |
+ << " overall_timeout:" << overall_timeout.ToMilliseconds(); |
+ // 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_) { |
+ idle_timeout = idle_timeout.Add(QuicTime::Delta::FromSeconds(1)); |
+ } else if (idle_timeout > QuicTime::Delta::FromSeconds(1)) { |
+ idle_timeout = idle_timeout.Subtract(QuicTime::Delta::FromSeconds(1)); |
+ } |
+ overall_connection_timeout_ = overall_timeout; |
+ idle_network_timeout_ = idle_timeout; |
+ |
+ SetTimeoutAlarm(); |
+} |
+ |
void QuicConnection::CheckForTimeout() { |
QuicTime now = clock_->ApproximateNow(); |
QuicTime time_of_last_packet = max(time_of_last_received_packet_, |