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

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

Issue 1782053003: Optionally defer responding to a QUIC ACK until all ACK processing has completed for an EpollServer… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@115992556
Patch Set: Created 4 years, 9 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_connection.h ('k') | net/quic/quic_connection_test.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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 DISALLOW_COPY_AND_ASSIGN(RetransmissionAlarm); 122 DISALLOW_COPY_AND_ASSIGN(RetransmissionAlarm);
123 }; 123 };
124 124
125 // An alarm that is scheduled when the SentPacketManager requires a delay 125 // An alarm that is scheduled when the SentPacketManager requires a delay
126 // before sending packets and fires when the packet may be sent. 126 // before sending packets and fires when the packet may be sent.
127 class SendAlarm : public QuicAlarm::Delegate { 127 class SendAlarm : public QuicAlarm::Delegate {
128 public: 128 public:
129 explicit SendAlarm(QuicConnection* connection) : connection_(connection) {} 129 explicit SendAlarm(QuicConnection* connection) : connection_(connection) {}
130 130
131 QuicTime OnAlarm() override { 131 QuicTime OnAlarm() override {
132 connection_->WriteIfNotBlocked(); 132 connection_->WriteAndBundleAcksIfNotBlocked();
133 // Never reschedule the alarm, since CanWrite does that. 133 // Never reschedule the alarm, since CanWrite does that.
134 return QuicTime::Zero(); 134 return QuicTime::Zero();
135 } 135 }
136 136
137 private: 137 private:
138 QuicConnection* connection_; 138 QuicConnection* connection_;
139 139
140 DISALLOW_COPY_AND_ASSIGN(SendAlarm); 140 DISALLOW_COPY_AND_ASSIGN(SendAlarm);
141 }; 141 };
142 142
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 silent_close_enabled_(false), 277 silent_close_enabled_(false),
278 received_packet_manager_(&stats_), 278 received_packet_manager_(&stats_),
279 ack_queued_(false), 279 ack_queued_(false),
280 num_retransmittable_packets_received_since_last_ack_sent_(0), 280 num_retransmittable_packets_received_since_last_ack_sent_(0),
281 last_ack_had_missing_packets_(false), 281 last_ack_had_missing_packets_(false),
282 num_packets_received_since_last_ack_sent_(0), 282 num_packets_received_since_last_ack_sent_(0),
283 stop_waiting_count_(0), 283 stop_waiting_count_(0),
284 ack_mode_(TCP_ACKING), 284 ack_mode_(TCP_ACKING),
285 delay_setting_retransmission_alarm_(false), 285 delay_setting_retransmission_alarm_(false),
286 pending_retransmission_alarm_(false), 286 pending_retransmission_alarm_(false),
287 defer_send_in_response_to_packets_(false),
287 arena_(), 288 arena_(),
288 ack_alarm_(helper->CreateAlarm(arena_.New<AckAlarm>(this), &arena_)), 289 ack_alarm_(helper->CreateAlarm(arena_.New<AckAlarm>(this), &arena_)),
289 retransmission_alarm_( 290 retransmission_alarm_(
290 helper->CreateAlarm(arena_.New<RetransmissionAlarm>(this), &arena_)), 291 helper->CreateAlarm(arena_.New<RetransmissionAlarm>(this), &arena_)),
291 send_alarm_(helper->CreateAlarm(arena_.New<SendAlarm>(this), &arena_)), 292 send_alarm_(helper->CreateAlarm(arena_.New<SendAlarm>(this), &arena_)),
292 resume_writes_alarm_( 293 resume_writes_alarm_(
293 helper->CreateAlarm(arena_.New<SendAlarm>(this), &arena_)), 294 helper->CreateAlarm(arena_.New<SendAlarm>(this), &arena_)),
294 timeout_alarm_( 295 timeout_alarm_(
295 helper->CreateAlarm(arena_.New<TimeoutAlarm>(this), &arena_)), 296 helper->CreateAlarm(arena_.New<TimeoutAlarm>(this), &arena_)),
296 ping_alarm_(helper->CreateAlarm(arena_.New<PingAlarm>(this), &arena_)), 297 ping_alarm_(helper->CreateAlarm(arena_.New<PingAlarm>(this), &arena_)),
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 } 1129 }
1129 1130
1130 QuicPacketNumber QuicConnection::GetLeastUnacked() const { 1131 QuicPacketNumber QuicConnection::GetLeastUnacked() const {
1131 return sent_packet_manager_.GetLeastUnacked(); 1132 return sent_packet_manager_.GetLeastUnacked();
1132 } 1133 }
1133 1134
1134 void QuicConnection::MaybeSendInResponseToPacket() { 1135 void QuicConnection::MaybeSendInResponseToPacket() {
1135 if (!connected_) { 1136 if (!connected_) {
1136 return; 1137 return;
1137 } 1138 }
1138 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK);
1139
1140 // Now that we have received an ack, we might be able to send packets which 1139 // Now that we have received an ack, we might be able to send packets which
1141 // are queued locally, or drain streams which are blocked. 1140 // are queued locally, or drain streams which are blocked.
1142 WriteIfNotBlocked(); 1141 if (defer_send_in_response_to_packets_) {
1142 send_alarm_->Cancel();
1143 send_alarm_->Set(clock_->ApproximateNow());
1144 } else {
1145 WriteAndBundleAcksIfNotBlocked();
1146 }
1143 } 1147 }
1144 1148
1145 void QuicConnection::SendVersionNegotiationPacket() { 1149 void QuicConnection::SendVersionNegotiationPacket() {
1146 // TODO(alyssar): implement zero server state negotiation. 1150 // TODO(alyssar): implement zero server state negotiation.
1147 pending_version_negotiation_packet_ = true; 1151 pending_version_negotiation_packet_ = true;
1148 if (writer_->IsWriteBlocked()) { 1152 if (writer_->IsWriteBlocked()) {
1149 visitor_->OnWriteBlocked(); 1153 visitor_->OnWriteBlocked();
1150 return; 1154 return;
1151 } 1155 }
1152 DVLOG(1) << ENDPOINT << "Sending version negotiation packet: {" 1156 DVLOG(1) << ENDPOINT << "Sending version negotiation packet: {"
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 resume_writes_alarm_->Set(clock_->ApproximateNow()); 1397 resume_writes_alarm_->Set(clock_->ApproximateNow());
1394 } 1398 }
1395 } 1399 }
1396 1400
1397 void QuicConnection::WriteIfNotBlocked() { 1401 void QuicConnection::WriteIfNotBlocked() {
1398 if (!writer_->IsWriteBlocked()) { 1402 if (!writer_->IsWriteBlocked()) {
1399 OnCanWrite(); 1403 OnCanWrite();
1400 } 1404 }
1401 } 1405 }
1402 1406
1407 void QuicConnection::WriteAndBundleAcksIfNotBlocked() {
1408 if (!writer_->IsWriteBlocked()) {
1409 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK);
1410 OnCanWrite();
1411 }
1412 }
1413
1403 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) { 1414 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) {
1404 if (FLAGS_check_peer_address_change_after_decryption) { 1415 if (FLAGS_check_peer_address_change_after_decryption) {
1405 if (perspective_ == Perspective::IS_SERVER && 1416 if (perspective_ == Perspective::IS_SERVER &&
1406 IsInitializedIPEndPoint(self_address_) && 1417 IsInitializedIPEndPoint(self_address_) &&
1407 IsInitializedIPEndPoint(last_packet_destination_address_) && 1418 IsInitializedIPEndPoint(last_packet_destination_address_) &&
1408 (!(self_address_ == last_packet_destination_address_))) { 1419 (!(self_address_ == last_packet_destination_address_))) {
1409 SendConnectionCloseWithDetails( 1420 SendConnectionCloseWithDetails(
1410 QUIC_ERROR_MIGRATING_ADDRESS, 1421 QUIC_ERROR_MIGRATING_ADDRESS,
1411 "Self address migration is not supported at the server."); 1422 "Self address migration is not supported at the server.");
1412 return false; 1423 return false;
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after
2507 void QuicConnection::OnPathClosed(QuicPathId path_id) { 2518 void QuicConnection::OnPathClosed(QuicPathId path_id) {
2508 // Stop receiving packets on this path. 2519 // Stop receiving packets on this path.
2509 framer_.OnPathClosed(path_id); 2520 framer_.OnPathClosed(path_id);
2510 } 2521 }
2511 2522
2512 bool QuicConnection::ack_frame_updated() const { 2523 bool QuicConnection::ack_frame_updated() const {
2513 return received_packet_manager_.ack_frame_updated(); 2524 return received_packet_manager_.ack_frame_updated();
2514 } 2525 }
2515 2526
2516 } // namespace net 2527 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698