Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(402)

Side by Side Diff: net/quic/quic_connection.cc

Issue 2132623002: Landing Recent QUIC changes until 2016-07-02 02:45 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing comment about RPCs Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_clock.cc ('k') | net/quic/quic_connection_logger.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_connection.h" 5 #include "net/quic/quic_connection.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <sys/types.h> 8 #include <sys/types.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 DCHECK(connected_); 822 DCHECK(connected_);
823 if (debug_visitor_ != nullptr) { 823 if (debug_visitor_ != nullptr) {
824 debug_visitor_->OnPingFrame(frame); 824 debug_visitor_->OnPingFrame(frame);
825 } 825 }
826 should_last_packet_instigate_acks_ = true; 826 should_last_packet_instigate_acks_ = true;
827 return true; 827 return true;
828 } 828 }
829 829
830 const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { 830 const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) {
831 if (incoming_ack.largest_observed > packet_generator_.packet_number()) { 831 if (incoming_ack.largest_observed > packet_generator_.packet_number()) {
832 LOG(WARNING) << ENDPOINT << "Peer's observed unsent packet:" 832 DLOG(WARNING) << ENDPOINT << "Peer's observed unsent packet:"
833 << incoming_ack.largest_observed << " vs " 833 << incoming_ack.largest_observed << " vs "
834 << packet_generator_.packet_number(); 834 << packet_generator_.packet_number();
835 // We got an error for data we have not sent. Error out. 835 // We got an error for data we have not sent. Error out.
836 return "Largest observed too high."; 836 return "Largest observed too high.";
837 } 837 }
838 838
839 if (incoming_ack.largest_observed < 839 if (incoming_ack.largest_observed <
840 sent_packet_manager_->GetLargestObserved(incoming_ack.path_id)) { 840 sent_packet_manager_->GetLargestObserved(incoming_ack.path_id)) {
841 LOG(WARNING) << ENDPOINT << "Peer's largest_observed packet decreased:" 841 LOG(WARNING) << ENDPOINT << "Peer's largest_observed packet decreased:"
842 << incoming_ack.largest_observed << " vs " 842 << incoming_ack.largest_observed << " vs "
843 << sent_packet_manager_->GetLargestObserved( 843 << sent_packet_manager_->GetLargestObserved(
844 incoming_ack.path_id) 844 incoming_ack.path_id)
(...skipping 22 matching lines...) Expand all
867 LOG(WARNING) << ENDPOINT 867 LOG(WARNING) << ENDPOINT
868 << "Peer sent missing packet: " << incoming_ack.packets.Min() 868 << "Peer sent missing packet: " << incoming_ack.packets.Min()
869 << " which is smaller than least_packet_awaited_by_peer_: " 869 << " which is smaller than least_packet_awaited_by_peer_: "
870 << sent_packet_manager_->GetLeastPacketAwaitedByPeer( 870 << sent_packet_manager_->GetLeastPacketAwaitedByPeer(
871 incoming_ack.path_id); 871 incoming_ack.path_id);
872 return "Missing packet smaller than least awaited."; 872 return "Missing packet smaller than least awaited.";
873 } 873 }
874 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, 874 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed,
875 incoming_ack.packets, 875 incoming_ack.packets,
876 incoming_ack.entropy_hash)) { 876 incoming_ack.entropy_hash)) {
877 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy." 877 DLOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."
878 << " largest_observed:" << incoming_ack.largest_observed 878 << " largest_observed:" << incoming_ack.largest_observed
879 << " last_received:" << last_header_.packet_number; 879 << " last_received:" << last_header_.packet_number;
880 return "Invalid entropy."; 880 return "Invalid entropy.";
881 } 881 }
882 } else { 882 } else {
883 if (!incoming_ack.packets.Empty() && 883 if (!incoming_ack.packets.Empty() &&
884 incoming_ack.packets.Max() != incoming_ack.largest_observed) { 884 incoming_ack.packets.Max() != incoming_ack.largest_observed) {
885 QUIC_BUG << ENDPOINT 885 QUIC_BUG << ENDPOINT
886 << "Peer last received packet: " << incoming_ack.packets.Max() 886 << "Peer last received packet: " << incoming_ack.packets.Max()
887 << " which is not equal to largest observed: " 887 << " which is not equal to largest observed: "
888 << incoming_ack.largest_observed; 888 << incoming_ack.largest_observed;
889 return "Last received packet not equal to largest observed."; 889 return "Last received packet not equal to largest observed.";
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 ++num_retransmittable_packets_received_since_last_ack_sent_; 1058 ++num_retransmittable_packets_received_since_last_ack_sent_;
1059 if (ack_mode_ != TCP_ACKING && 1059 if (ack_mode_ != TCP_ACKING &&
1060 last_header_.packet_number > kMinReceivedBeforeAckDecimation) { 1060 last_header_.packet_number > kMinReceivedBeforeAckDecimation) {
1061 // Ack up to 10 packets at once. 1061 // Ack up to 10 packets at once.
1062 if (num_retransmittable_packets_received_since_last_ack_sent_ >= 1062 if (num_retransmittable_packets_received_since_last_ack_sent_ >=
1063 kMaxRetransmittablePacketsBeforeAck) { 1063 kMaxRetransmittablePacketsBeforeAck) {
1064 ack_queued_ = true; 1064 ack_queued_ = true;
1065 } else if (!ack_alarm_->IsSet()) { 1065 } else if (!ack_alarm_->IsSet()) {
1066 // Wait the minimum of a quarter min_rtt and the delayed ack time. 1066 // Wait the minimum of a quarter min_rtt and the delayed ack time.
1067 QuicTime::Delta ack_delay = QuicTime::Delta::Min( 1067 QuicTime::Delta ack_delay = QuicTime::Delta::Min(
1068 DelayedAckTime(), 1068 DelayedAckTime(), sent_packet_manager_->GetRttStats()->min_rtt() *
1069 sent_packet_manager_->GetRttStats()->min_rtt().Multiply( 1069 ack_decimation_delay_);
1070 ack_decimation_delay_)); 1070 ack_alarm_->Set(clock_->ApproximateNow() + ack_delay);
1071 ack_alarm_->Set(clock_->ApproximateNow().Add(ack_delay));
1072 } 1071 }
1073 } else { 1072 } else {
1074 // Ack with a timer or every 2 packets by default. 1073 // Ack with a timer or every 2 packets by default.
1075 if (num_retransmittable_packets_received_since_last_ack_sent_ >= 1074 if (num_retransmittable_packets_received_since_last_ack_sent_ >=
1076 kDefaultRetransmittablePacketsBeforeAck) { 1075 kDefaultRetransmittablePacketsBeforeAck) {
1077 ack_queued_ = true; 1076 ack_queued_ = true;
1078 } else if (!ack_alarm_->IsSet()) { 1077 } else if (!ack_alarm_->IsSet()) {
1079 ack_alarm_->Set(clock_->ApproximateNow().Add(DelayedAckTime())); 1078 ack_alarm_->Set(clock_->ApproximateNow() + DelayedAckTime());
1080 } 1079 }
1081 } 1080 }
1082 1081
1083 // If there are new missing packets to report, send an ack immediately. 1082 // If there are new missing packets to report, send an ack immediately.
1084 if (received_packet_manager_.HasNewMissingPackets()) { 1083 if (received_packet_manager_.HasNewMissingPackets()) {
1085 if (ack_mode_ == ACK_DECIMATION_WITH_REORDERING) { 1084 if (ack_mode_ == ACK_DECIMATION_WITH_REORDERING) {
1086 // Wait the minimum of an eighth min_rtt and the existing ack time. 1085 // Wait the minimum of an eighth min_rtt and the existing ack time.
1087 QuicTime ack_time = clock_->ApproximateNow().Add( 1086 QuicTime ack_time =
1088 sent_packet_manager_->GetRttStats()->min_rtt().Multiply(0.125)); 1087 clock_->ApproximateNow() +
1088 0.125 * sent_packet_manager_->GetRttStats()->min_rtt();
1089 if (!ack_alarm_->IsSet() || ack_alarm_->deadline() > ack_time) { 1089 if (!ack_alarm_->IsSet() || ack_alarm_->deadline() > ack_time) {
1090 ack_alarm_->Cancel(); 1090 ack_alarm_->Cancel();
1091 ack_alarm_->Set(ack_time); 1091 ack_alarm_->Set(ack_time);
1092 } 1092 }
1093 } else { 1093 } else {
1094 ack_queued_ = true; 1094 ack_queued_ = true;
1095 } 1095 }
1096 } 1096 }
1097 } 1097 }
1098 1098
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 sent_packet_manager_->TimeUntilSend(now, retransmittable, &path_id); 1571 sent_packet_manager_->TimeUntilSend(now, retransmittable, &path_id);
1572 if (delay.IsInfinite()) { 1572 if (delay.IsInfinite()) {
1573 DCHECK_EQ(kInvalidPathId, path_id); 1573 DCHECK_EQ(kInvalidPathId, path_id);
1574 send_alarm_->Cancel(); 1574 send_alarm_->Cancel();
1575 return false; 1575 return false;
1576 } 1576 }
1577 1577
1578 DCHECK_NE(kInvalidPathId, path_id); 1578 DCHECK_NE(kInvalidPathId, path_id);
1579 // If the scheduler requires a delay, then we can not send this packet now. 1579 // If the scheduler requires a delay, then we can not send this packet now.
1580 if (!delay.IsZero()) { 1580 if (!delay.IsZero()) {
1581 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); 1581 send_alarm_->Update(now + delay, QuicTime::Delta::FromMilliseconds(1));
1582 DVLOG(1) << ENDPOINT << "Delaying sending " << delay.ToMilliseconds() 1582 DVLOG(1) << ENDPOINT << "Delaying sending " << delay.ToMilliseconds()
1583 << "ms"; 1583 << "ms";
1584 return false; 1584 return false;
1585 } 1585 }
1586 return true; 1586 return true;
1587 } 1587 }
1588 1588
1589 bool QuicConnection::WritePacket(SerializedPacket* packet) { 1589 bool QuicConnection::WritePacket(SerializedPacket* packet) {
1590 if (packet->packet_number < 1590 if (packet->packet_number <
1591 sent_packet_manager_->GetLargestSentPacket(packet->path_id)) { 1591 sent_packet_manager_->GetLargestSentPacket(packet->path_id)) {
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
2134 } 2134 }
2135 2135
2136 void QuicConnection::SetNetworkTimeouts(QuicTime::Delta handshake_timeout, 2136 void QuicConnection::SetNetworkTimeouts(QuicTime::Delta handshake_timeout,
2137 QuicTime::Delta idle_timeout) { 2137 QuicTime::Delta idle_timeout) {
2138 QUIC_BUG_IF(idle_timeout > handshake_timeout) 2138 QUIC_BUG_IF(idle_timeout > handshake_timeout)
2139 << "idle_timeout:" << idle_timeout.ToMilliseconds() 2139 << "idle_timeout:" << idle_timeout.ToMilliseconds()
2140 << " handshake_timeout:" << handshake_timeout.ToMilliseconds(); 2140 << " handshake_timeout:" << handshake_timeout.ToMilliseconds();
2141 // Adjust the idle timeout on client and server to prevent clients from 2141 // Adjust the idle timeout on client and server to prevent clients from
2142 // sending requests to servers which have already closed the connection. 2142 // sending requests to servers which have already closed the connection.
2143 if (perspective_ == Perspective::IS_SERVER) { 2143 if (perspective_ == Perspective::IS_SERVER) {
2144 idle_timeout = idle_timeout.Add(QuicTime::Delta::FromSeconds(3)); 2144 idle_timeout = idle_timeout + QuicTime::Delta::FromSeconds(3);
2145 } else if (idle_timeout > QuicTime::Delta::FromSeconds(1)) { 2145 } else if (idle_timeout > QuicTime::Delta::FromSeconds(1)) {
2146 idle_timeout = idle_timeout.Subtract(QuicTime::Delta::FromSeconds(1)); 2146 idle_timeout = idle_timeout - QuicTime::Delta::FromSeconds(1);
2147 } 2147 }
2148 handshake_timeout_ = handshake_timeout; 2148 handshake_timeout_ = handshake_timeout;
2149 idle_network_timeout_ = idle_timeout; 2149 idle_network_timeout_ = idle_timeout;
2150 2150
2151 SetTimeoutAlarm(); 2151 SetTimeoutAlarm();
2152 } 2152 }
2153 2153
2154 void QuicConnection::CheckForTimeout() { 2154 void QuicConnection::CheckForTimeout() {
2155 QuicTime now = clock_->ApproximateNow(); 2155 QuicTime now = clock_->ApproximateNow();
2156 QuicTime time_of_last_packet = 2156 QuicTime time_of_last_packet =
2157 max(time_of_last_received_packet_, last_send_for_timeout_); 2157 max(time_of_last_received_packet_, last_send_for_timeout_);
2158 2158
2159 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| 2159 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet|
2160 // is accurate time. However, this should not change the behavior of 2160 // is accurate time. However, this should not change the behavior of
2161 // timeout handling. 2161 // timeout handling.
2162 QuicTime::Delta idle_duration = now.Subtract(time_of_last_packet); 2162 QuicTime::Delta idle_duration = now - time_of_last_packet;
2163 DVLOG(1) << ENDPOINT << "last packet " 2163 DVLOG(1) << ENDPOINT << "last packet "
2164 << time_of_last_packet.ToDebuggingValue() 2164 << time_of_last_packet.ToDebuggingValue()
2165 << " now:" << now.ToDebuggingValue() 2165 << " now:" << now.ToDebuggingValue()
2166 << " idle_duration:" << idle_duration.ToMicroseconds() 2166 << " idle_duration:" << idle_duration.ToMicroseconds()
2167 << " idle_network_timeout: " 2167 << " idle_network_timeout: "
2168 << idle_network_timeout_.ToMicroseconds(); 2168 << idle_network_timeout_.ToMicroseconds();
2169 if (idle_duration >= idle_network_timeout_) { 2169 if (idle_duration >= idle_network_timeout_) {
2170 const string error_details = "No recent network activity."; 2170 const string error_details = "No recent network activity.";
2171 DVLOG(1) << ENDPOINT << error_details; 2171 DVLOG(1) << ENDPOINT << error_details;
2172 CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, error_details, 2172 CloseConnection(QUIC_NETWORK_IDLE_TIMEOUT, error_details,
2173 idle_timeout_connection_close_behavior_); 2173 idle_timeout_connection_close_behavior_);
2174 return; 2174 return;
2175 } 2175 }
2176 2176
2177 if (!handshake_timeout_.IsInfinite()) { 2177 if (!handshake_timeout_.IsInfinite()) {
2178 QuicTime::Delta connected_duration = 2178 QuicTime::Delta connected_duration = now - stats_.connection_creation_time;
2179 now.Subtract(stats_.connection_creation_time);
2180 DVLOG(1) << ENDPOINT 2179 DVLOG(1) << ENDPOINT
2181 << "connection time: " << connected_duration.ToMicroseconds() 2180 << "connection time: " << connected_duration.ToMicroseconds()
2182 << " handshake timeout: " << handshake_timeout_.ToMicroseconds(); 2181 << " handshake timeout: " << handshake_timeout_.ToMicroseconds();
2183 if (connected_duration >= handshake_timeout_) { 2182 if (connected_duration >= handshake_timeout_) {
2184 const string error_details = "Handshake timeout expired."; 2183 const string error_details = "Handshake timeout expired.";
2185 DVLOG(1) << ENDPOINT << error_details; 2184 DVLOG(1) << ENDPOINT << error_details;
2186 CloseConnection(QUIC_HANDSHAKE_TIMEOUT, error_details, 2185 CloseConnection(QUIC_HANDSHAKE_TIMEOUT, error_details,
2187 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 2186 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
2188 return; 2187 return;
2189 } 2188 }
2190 } 2189 }
2191 2190
2192 SetTimeoutAlarm(); 2191 SetTimeoutAlarm();
2193 } 2192 }
2194 2193
2195 void QuicConnection::SetTimeoutAlarm() { 2194 void QuicConnection::SetTimeoutAlarm() {
2196 QuicTime time_of_last_packet = 2195 QuicTime time_of_last_packet =
2197 max(time_of_last_received_packet_, time_of_last_sent_new_packet_); 2196 max(time_of_last_received_packet_, time_of_last_sent_new_packet_);
2198 2197
2199 QuicTime deadline = time_of_last_packet.Add(idle_network_timeout_); 2198 QuicTime deadline = time_of_last_packet + idle_network_timeout_;
2200 if (!handshake_timeout_.IsInfinite()) { 2199 if (!handshake_timeout_.IsInfinite()) {
2201 deadline = 2200 deadline =
2202 min(deadline, stats_.connection_creation_time.Add(handshake_timeout_)); 2201 min(deadline, stats_.connection_creation_time + handshake_timeout_);
2203 } 2202 }
2204 2203
2205 timeout_alarm_->Cancel(); 2204 timeout_alarm_->Cancel();
2206 timeout_alarm_->Set(deadline); 2205 timeout_alarm_->Set(deadline);
2207 } 2206 }
2208 2207
2209 void QuicConnection::SetPingAlarm() { 2208 void QuicConnection::SetPingAlarm() {
2210 if (perspective_ == Perspective::IS_SERVER) { 2209 if (perspective_ == Perspective::IS_SERVER) {
2211 // Only clients send pings. 2210 // Only clients send pings.
2212 return; 2211 return;
2213 } 2212 }
2214 if (!visitor_->HasOpenDynamicStreams()) { 2213 if (!visitor_->HasOpenDynamicStreams()) {
2215 ping_alarm_->Cancel(); 2214 ping_alarm_->Cancel();
2216 // Don't send a ping unless there are open streams. 2215 // Don't send a ping unless there are open streams.
2217 return; 2216 return;
2218 } 2217 }
2219 QuicTime::Delta ping_timeout = QuicTime::Delta::FromSeconds(kPingTimeoutSecs); 2218 QuicTime::Delta ping_timeout = QuicTime::Delta::FromSeconds(kPingTimeoutSecs);
2220 ping_alarm_->Update(clock_->ApproximateNow().Add(ping_timeout), 2219 ping_alarm_->Update(clock_->ApproximateNow() + ping_timeout,
2221 QuicTime::Delta::FromSeconds(1)); 2220 QuicTime::Delta::FromSeconds(1));
2222 } 2221 }
2223 2222
2224 void QuicConnection::SetRetransmissionAlarm() { 2223 void QuicConnection::SetRetransmissionAlarm() {
2225 if (delay_setting_retransmission_alarm_) { 2224 if (delay_setting_retransmission_alarm_) {
2226 pending_retransmission_alarm_ = true; 2225 pending_retransmission_alarm_ = true;
2227 return; 2226 return;
2228 } 2227 }
2229 QuicTime retransmission_time = sent_packet_manager_->GetRetransmissionTime(); 2228 QuicTime retransmission_time = sent_packet_manager_->GetRetransmissionTime();
2230 retransmission_alarm_->Update(retransmission_time, 2229 retransmission_alarm_->Update(retransmission_time,
(...skipping 28 matching lines...) Expand all
2259 AckBundling ack_mode) 2258 AckBundling ack_mode)
2260 : connection_(connection), 2259 : connection_(connection),
2261 already_in_batch_mode_(connection != nullptr && 2260 already_in_batch_mode_(connection != nullptr &&
2262 connection->packet_generator_.InBatchMode()) { 2261 connection->packet_generator_.InBatchMode()) {
2263 if (connection_ == nullptr) { 2262 if (connection_ == nullptr) {
2264 return; 2263 return;
2265 } 2264 }
2266 // Move generator into batch mode. If caller wants us to include an ack, 2265 // Move generator into batch mode. If caller wants us to include an ack,
2267 // check the delayed-ack timer to see if there's ack info to be sent. 2266 // check the delayed-ack timer to see if there's ack info to be sent.
2268 if (!already_in_batch_mode_) { 2267 if (!already_in_batch_mode_) {
2269 DVLOG(1) << "Entering Batch Mode."; 2268 DVLOG(2) << "Entering Batch Mode.";
2270 connection_->packet_generator_.StartBatchOperations(); 2269 connection_->packet_generator_.StartBatchOperations();
2271 } 2270 }
2272 if (ShouldSendAck(ack_mode)) { 2271 if (ShouldSendAck(ack_mode)) {
2273 DVLOG(1) << "Bundling ack with outgoing packet."; 2272 DVLOG(1) << "Bundling ack with outgoing packet.";
2274 DCHECK(ack_mode == SEND_ACK || connection_->ack_frame_updated() || 2273 DCHECK(ack_mode == SEND_ACK || connection_->ack_frame_updated() ||
2275 connection_->stop_waiting_count_ > 1); 2274 connection_->stop_waiting_count_ > 1);
2276 connection_->SendAck(); 2275 connection_->SendAck();
2277 } 2276 }
2278 } 2277 }
2279 2278
(...skipping 12 matching lines...) Expand all
2292 return true; 2291 return true;
2293 } 2292 }
2294 } 2293 }
2295 2294
2296 QuicConnection::ScopedPacketBundler::~ScopedPacketBundler() { 2295 QuicConnection::ScopedPacketBundler::~ScopedPacketBundler() {
2297 if (connection_ == nullptr) { 2296 if (connection_ == nullptr) {
2298 return; 2297 return;
2299 } 2298 }
2300 // If we changed the generator's batch state, restore original batch state. 2299 // If we changed the generator's batch state, restore original batch state.
2301 if (!already_in_batch_mode_) { 2300 if (!already_in_batch_mode_) {
2302 DVLOG(1) << "Leaving Batch Mode."; 2301 DVLOG(2) << "Leaving Batch Mode.";
2303 connection_->packet_generator_.FinishBatchOperations(); 2302 connection_->packet_generator_.FinishBatchOperations();
2304 } 2303 }
2305 DCHECK_EQ(already_in_batch_mode_, 2304 DCHECK_EQ(already_in_batch_mode_,
2306 connection_->packet_generator_.InBatchMode()); 2305 connection_->packet_generator_.InBatchMode());
2307 } 2306 }
2308 2307
2309 QuicConnection::ScopedRetransmissionScheduler::ScopedRetransmissionScheduler( 2308 QuicConnection::ScopedRetransmissionScheduler::ScopedRetransmissionScheduler(
2310 QuicConnection* connection) 2309 QuicConnection* connection)
2311 : connection_(connection), 2310 : connection_(connection),
2312 already_delayed_(connection_->delay_setting_retransmission_alarm_) { 2311 already_delayed_(connection_->delay_setting_retransmission_alarm_) {
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
2511 // the sender and a signaling mechanism -- if the sender uses a 2510 // the sender and a signaling mechanism -- if the sender uses a
2512 // different MinRTO, we may get spurious retransmissions. May not have 2511 // different MinRTO, we may get spurious retransmissions. May not have
2513 // any benefits, but if the delayed ack becomes a significant source 2512 // any benefits, but if the delayed ack becomes a significant source
2514 // of (likely, tail) latency, then consider such a mechanism. 2513 // of (likely, tail) latency, then consider such a mechanism.
2515 const QuicTime::Delta QuicConnection::DelayedAckTime() { 2514 const QuicTime::Delta QuicConnection::DelayedAckTime() {
2516 return QuicTime::Delta::FromMilliseconds( 2515 return QuicTime::Delta::FromMilliseconds(
2517 min(kMaxDelayedAckTimeMs, kMinRetransmissionTimeMs / 2)); 2516 min(kMaxDelayedAckTimeMs, kMinRetransmissionTimeMs / 2));
2518 } 2517 }
2519 2518
2520 } // namespace net 2519 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_clock.cc ('k') | net/quic/quic_connection_logger.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698