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

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

Issue 103973007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix for android compile error Created 7 years 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 | Annotate | Revision Log
« 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 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 94
95 virtual QuicTime OnAlarm() OVERRIDE { 95 virtual QuicTime OnAlarm() OVERRIDE {
96 connection_->OnRetransmissionTimeout(); 96 connection_->OnRetransmissionTimeout();
97 return QuicTime::Zero(); 97 return QuicTime::Zero();
98 } 98 }
99 99
100 private: 100 private:
101 QuicConnection* connection_; 101 QuicConnection* connection_;
102 }; 102 };
103 103
104 // This alarm will be scheduled any time a FEC-bearing packet is sent out.
105 // When the alarm goes off, the connection checks to see if the oldest packets
106 // have been acked, and removes them from the congestion window if not.
107 class AbandonFecAlarm : public QuicAlarm::Delegate {
108 public:
109 explicit AbandonFecAlarm(QuicConnection* connection)
110 : connection_(connection) {
111 }
112
113 virtual QuicTime OnAlarm() OVERRIDE {
114 return connection_->OnAbandonFecTimeout();
115 }
116
117 private:
118 QuicConnection* connection_;
119 };
120
121 // An alarm that is scheduled when the sent scheduler requires a 104 // An alarm that is scheduled when the sent scheduler requires a
122 // a delay before sending packets and fires when the packet may be sent. 105 // a delay before sending packets and fires when the packet may be sent.
123 class SendAlarm : public QuicAlarm::Delegate { 106 class SendAlarm : public QuicAlarm::Delegate {
124 public: 107 public:
125 explicit SendAlarm(QuicConnection* connection) 108 explicit SendAlarm(QuicConnection* connection)
126 : connection_(connection) { 109 : connection_(connection) {
127 } 110 }
128 111
129 virtual QuicTime OnAlarm() OVERRIDE { 112 virtual QuicTime OnAlarm() OVERRIDE {
130 connection_->WriteIfNotBlocked(); 113 connection_->WriteIfNotBlocked();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 clock_(helper->GetClock()), 184 clock_(helper->GetClock()),
202 random_generator_(helper->GetRandomGenerator()), 185 random_generator_(helper->GetRandomGenerator()),
203 guid_(guid), 186 guid_(guid),
204 peer_address_(address), 187 peer_address_(address),
205 largest_seen_packet_with_ack_(0), 188 largest_seen_packet_with_ack_(0),
206 pending_version_negotiation_packet_(false), 189 pending_version_negotiation_packet_(false),
207 write_blocked_(false), 190 write_blocked_(false),
208 received_packet_manager_(kTCP), 191 received_packet_manager_(kTCP),
209 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), 192 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))),
210 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), 193 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))),
211 abandon_fec_alarm_(helper->CreateAlarm(new AbandonFecAlarm(this))),
212 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), 194 send_alarm_(helper->CreateAlarm(new SendAlarm(this))),
213 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), 195 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))),
214 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), 196 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))),
215 debug_visitor_(NULL), 197 debug_visitor_(NULL),
216 packet_creator_(guid_, &framer_, random_generator_, is_server), 198 packet_creator_(guid_, &framer_, random_generator_, is_server),
217 packet_generator_(this, NULL, &packet_creator_), 199 packet_generator_(this, NULL, &packet_creator_),
218 idle_network_timeout_( 200 idle_network_timeout_(
219 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), 201 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)),
220 overall_connection_timeout_(QuicTime::Delta::Infinite()), 202 overall_connection_timeout_(QuicTime::Delta::Infinite()),
221 creation_time_(clock_->ApproximateNow()), 203 creation_time_(clock_->ApproximateNow()),
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 499
518 bool reset_retransmission_alarm = 500 bool reset_retransmission_alarm =
519 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info, 501 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info,
520 time_of_last_received_packet_); 502 time_of_last_received_packet_);
521 if (sent_packet_manager_.HasPendingRetransmissions()) { 503 if (sent_packet_manager_.HasPendingRetransmissions()) {
522 WriteIfNotBlocked(); 504 WriteIfNotBlocked();
523 } 505 }
524 506
525 if (reset_retransmission_alarm) { 507 if (reset_retransmission_alarm) {
526 retransmission_alarm_->Cancel(); 508 retransmission_alarm_->Cancel();
527 abandon_fec_alarm_->Cancel();
528 // Reset the RTO and FEC alarms if the are unacked packets. 509 // Reset the RTO and FEC alarms if the are unacked packets.
529 QuicTime::Delta retransmission_delay =
530 sent_packet_manager_.GetRetransmissionDelay();
531 if (sent_packet_manager_.HasUnackedPackets()) { 510 if (sent_packet_manager_.HasUnackedPackets()) {
511 QuicTime::Delta retransmission_delay =
512 sent_packet_manager_.GetRetransmissionDelay();
532 retransmission_alarm_->Set( 513 retransmission_alarm_->Set(
533 clock_->ApproximateNow().Add(retransmission_delay)); 514 clock_->ApproximateNow().Add(retransmission_delay));
534 } 515 }
535 if (sent_packet_manager_.HasUnackedFecPackets()) {
536 abandon_fec_alarm_->Set(
537 clock_->ApproximateNow().Add(retransmission_delay));
538 }
539 } 516 }
540 } 517 }
541 518
542 bool QuicConnection::OnCongestionFeedbackFrame( 519 bool QuicConnection::OnCongestionFeedbackFrame(
543 const QuicCongestionFeedbackFrame& feedback) { 520 const QuicCongestionFeedbackFrame& feedback) {
544 DCHECK(connected_); 521 DCHECK(connected_);
545 if (debug_visitor_) { 522 if (debug_visitor_) {
546 debug_visitor_->OnCongestionFeedbackFrame(feedback); 523 debug_visitor_->OnCongestionFeedbackFrame(feedback);
547 } 524 }
548 last_congestion_frames_.push_back(feedback); 525 last_congestion_frames_.push_back(feedback);
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 // If the scheduler requires a delay, then we can not send this packet now. 1078 // If the scheduler requires a delay, then we can not send this packet now.
1102 if (!delay.IsZero()) { 1079 if (!delay.IsZero()) {
1103 send_alarm_->Cancel(); 1080 send_alarm_->Cancel();
1104 send_alarm_->Set(now.Add(delay)); 1081 send_alarm_->Set(now.Add(delay));
1105 DVLOG(1) << "Delaying sending."; 1082 DVLOG(1) << "Delaying sending.";
1106 return false; 1083 return false;
1107 } 1084 }
1108 return true; 1085 return true;
1109 } 1086 }
1110 1087
1111 void QuicConnection::SetupRetransmission( 1088 void QuicConnection::SetupRetransmissionAlarm(
1112 QuicPacketSequenceNumber sequence_number, 1089 QuicPacketSequenceNumber sequence_number) {
1113 EncryptionLevel level) {
1114 if (!sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { 1090 if (!sent_packet_manager_.HasRetransmittableFrames(sequence_number)) {
1115 DVLOG(1) << ENDPOINT << "Will not retransmit packet " << sequence_number; 1091 DVLOG(1) << ENDPOINT << "Will not retransmit packet " << sequence_number;
1116 return; 1092 return;
1117 } 1093 }
1118 1094
1119 // Do not set the retransmission alarm if we're already handling one, since 1095 // Do not set the retransmission alarm if we're already handling one, since
1120 // it will be reset when OnRetransmissionTimeout completes. 1096 // it will be reset when OnRetransmissionTimeout completes.
1121 if (retransmission_alarm_->IsSet()) { 1097 if (retransmission_alarm_->IsSet()) {
1122 return; 1098 return;
1123 } 1099 }
1124 1100
1125 QuicTime::Delta retransmission_delay = 1101 QuicTime::Delta retransmission_delay =
1126 sent_packet_manager_.GetRetransmissionDelay(); 1102 sent_packet_manager_.GetRetransmissionDelay();
1127 retransmission_alarm_->Set( 1103 retransmission_alarm_->Set(
1128 clock_->ApproximateNow().Add(retransmission_delay)); 1104 clock_->ApproximateNow().Add(retransmission_delay));
1129 } 1105 }
1130 1106
1131 void QuicConnection::SetupAbandonFecTimer(
1132 QuicPacketSequenceNumber sequence_number) {
1133 if (abandon_fec_alarm_->IsSet()) {
1134 return;
1135 }
1136 QuicTime::Delta retransmission_delay =
1137 sent_packet_manager_.GetRetransmissionDelay();
1138 abandon_fec_alarm_->Set(clock_->ApproximateNow().Add(retransmission_delay));
1139 }
1140
1141 bool QuicConnection::WritePacket(EncryptionLevel level, 1107 bool QuicConnection::WritePacket(EncryptionLevel level,
1142 QuicPacketSequenceNumber sequence_number, 1108 QuicPacketSequenceNumber sequence_number,
1143 QuicPacket* packet, 1109 QuicPacket* packet,
1144 TransmissionType transmission_type, 1110 TransmissionType transmission_type,
1145 HasRetransmittableData retransmittable, 1111 HasRetransmittableData retransmittable,
1146 IsHandshake handshake, 1112 IsHandshake handshake,
1147 Force forced) { 1113 Force forced) {
1148 if (ShouldDiscardPacket(level, sequence_number, retransmittable)) { 1114 if (ShouldDiscardPacket(level, sequence_number, retransmittable)) {
1149 delete packet; 1115 delete packet;
1150 return true; 1116 return true;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 bool QuicConnection::OnPacketSent(WriteResult result) { 1273 bool QuicConnection::OnPacketSent(WriteResult result) {
1308 DCHECK_NE(WRITE_STATUS_BLOCKED, result.status); 1274 DCHECK_NE(WRITE_STATUS_BLOCKED, result.status);
1309 if (pending_write_.get() == NULL) { 1275 if (pending_write_.get() == NULL) {
1310 LOG(DFATAL) << "OnPacketSent called without a pending write."; 1276 LOG(DFATAL) << "OnPacketSent called without a pending write.";
1311 return false; 1277 return false;
1312 } 1278 }
1313 1279
1314 QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number; 1280 QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number;
1315 TransmissionType transmission_type = pending_write_->transmission_type; 1281 TransmissionType transmission_type = pending_write_->transmission_type;
1316 HasRetransmittableData retransmittable = pending_write_->retransmittable; 1282 HasRetransmittableData retransmittable = pending_write_->retransmittable;
1317 EncryptionLevel level = pending_write_->level;
1318 bool is_fec_packet = pending_write_->is_fec_packet; 1283 bool is_fec_packet = pending_write_->is_fec_packet;
1319 size_t length = pending_write_->length; 1284 size_t length = pending_write_->length;
1320 pending_write_.reset(); 1285 pending_write_.reset();
1321 1286
1322 if (result.status == WRITE_STATUS_ERROR) { 1287 if (result.status == WRITE_STATUS_ERROR) {
1323 DVLOG(1) << "Write failed with error code: " << result.error_code; 1288 DVLOG(1) << "Write failed with error code: " << result.error_code;
1324 // We can't send an error as the socket is presumably borked. 1289 // We can't send an error as the socket is presumably borked.
1325 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); 1290 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
1326 return false; 1291 return false;
1327 } 1292 }
1328 1293
1329 QuicTime now = clock_->Now(); 1294 QuicTime now = clock_->Now();
1330 if (transmission_type == NOT_RETRANSMISSION) { 1295 if (transmission_type == NOT_RETRANSMISSION) {
1331 time_of_last_sent_packet_ = now; 1296 time_of_last_sent_packet_ = now;
1332 } 1297 }
1333 DVLOG(1) << ENDPOINT << "time of last sent packet: " 1298 DVLOG(1) << ENDPOINT << "time of last sent packet: "
1334 << now.ToDebuggingValue(); 1299 << now.ToDebuggingValue();
1335 1300
1336 // Set the retransmit alarm only when we have sent the packet to the client 1301 // Set the retransmit alarm only when we have sent the packet to the client
1337 // and not when it goes to the pending queue, otherwise we will end up adding 1302 // and not when it goes to the pending queue, otherwise we will end up adding
1338 // an entry to retransmission_timeout_ every time we attempt a write. 1303 // an entry to retransmission_timeout_ every time we attempt a write.
1339 if (retransmittable == HAS_RETRANSMITTABLE_DATA) { 1304 if (retransmittable == HAS_RETRANSMITTABLE_DATA || is_fec_packet) {
1340 SetupRetransmission(sequence_number, level); 1305 SetupRetransmissionAlarm(sequence_number);
1341 } else if (is_fec_packet) {
1342 SetupAbandonFecTimer(sequence_number);
1343 } 1306 }
1344 1307
1345 // TODO(ianswett): Change the sequence number length and other packet creator 1308 // TODO(ianswett): Change the sequence number length and other packet creator
1346 // options by a more explicit API than setting a struct value directly. 1309 // options by a more explicit API than setting a struct value directly.
1347 packet_creator_.UpdateSequenceNumberLength( 1310 packet_creator_.UpdateSequenceNumberLength(
1348 received_packet_manager_.least_packet_awaited_by_peer(), 1311 received_packet_manager_.least_packet_awaited_by_peer(),
1349 sent_packet_manager_.BandwidthEstimate().ToBytesPerPeriod( 1312 sent_packet_manager_.BandwidthEstimate().ToBytesPerPeriod(
1350 sent_packet_manager_.SmoothedRtt())); 1313 sent_packet_manager_.SmoothedRtt()));
1351 1314
1352 sent_packet_manager_.OnPacketSent(sequence_number, now, length, 1315 sent_packet_manager_.OnPacketSent(sequence_number, now, length,
1353 transmission_type, retransmittable); 1316 transmission_type, retransmittable);
1354 1317
1355 stats_.bytes_sent += result.bytes_written; 1318 stats_.bytes_sent += result.bytes_written;
1356 ++stats_.packets_sent; 1319 ++stats_.packets_sent;
1357 1320
1358 if (transmission_type == NACK_RETRANSMISSION || 1321 if (transmission_type == NACK_RETRANSMISSION ||
1359 transmission_type == RTO_RETRANSMISSION) { 1322 transmission_type == RTO_RETRANSMISSION) {
1360 stats_.bytes_retransmitted += result.bytes_written; 1323 stats_.bytes_retransmitted += result.bytes_written;
1361 ++stats_.packets_retransmitted; 1324 ++stats_.packets_retransmitted;
1362 } 1325 }
1363 1326
1364 return true; 1327 return true;
1365 } 1328 }
1366 1329
1367 bool QuicConnection::OnSerializedPacket( 1330 bool QuicConnection::OnSerializedPacket(
1368 const SerializedPacket& serialized_packet) { 1331 const SerializedPacket& serialized_packet) {
1369 if (serialized_packet.retransmittable_frames) { 1332 if (serialized_packet.retransmittable_frames) {
1370 serialized_packet.retransmittable_frames-> 1333 serialized_packet.retransmittable_frames->
1371 set_encryption_level(encryption_level_); 1334 set_encryption_level(encryption_level_);
1372 } 1335 }
1373 sent_packet_manager_.OnSerializedPacket(serialized_packet, 1336 sent_packet_manager_.OnSerializedPacket(serialized_packet);
1374 clock_->ApproximateNow());
1375 // The TransmissionType is NOT_RETRANSMISSION because all retransmissions 1337 // The TransmissionType is NOT_RETRANSMISSION because all retransmissions
1376 // serialize packets and invoke SendOrQueuePacket directly. 1338 // serialize packets and invoke SendOrQueuePacket directly.
1377 return SendOrQueuePacket(encryption_level_, 1339 return SendOrQueuePacket(encryption_level_,
1378 serialized_packet, 1340 serialized_packet,
1379 NOT_RETRANSMISSION); 1341 NOT_RETRANSMISSION);
1380 } 1342 }
1381 1343
1382 QuicPacketSequenceNumber QuicConnection::GetNextPacketSequenceNumber() { 1344 QuicPacketSequenceNumber QuicConnection::GetNextPacketSequenceNumber() {
1383 return packet_creator_.sequence_number() + 1; 1345 return packet_creator_.sequence_number() + 1;
1384 } 1346 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1429 void QuicConnection::OnRetransmissionTimeout() { 1391 void QuicConnection::OnRetransmissionTimeout() {
1430 if (!sent_packet_manager_.HasUnackedPackets()) { 1392 if (!sent_packet_manager_.HasUnackedPackets()) {
1431 return; 1393 return;
1432 } 1394 }
1433 1395
1434 ++stats_.rto_count; 1396 ++stats_.rto_count;
1435 1397
1436 sent_packet_manager_.OnRetransmissionTimeout(); 1398 sent_packet_manager_.OnRetransmissionTimeout();
1437 1399
1438 WriteIfNotBlocked(); 1400 WriteIfNotBlocked();
1439 }
1440 1401
1441 QuicTime QuicConnection::OnAbandonFecTimeout() { 1402 // Ensure the retransmission alarm is always set if there are unacked packets.
1442 QuicTime fec_timeout = sent_packet_manager_.OnAbandonFecTimeout(); 1403 if (sent_packet_manager_.HasUnackedPackets() && !HasQueuedData() &&
1443 1404 !retransmission_alarm_->IsSet()) {
1444 // If a packet was abandoned, then the congestion window may have 1405 QuicTime rto_timeout = clock_->ApproximateNow().Add(
1445 // opened up, so attempt to write. 1406 sent_packet_manager_.GetRetransmissionDelay());
1446 WriteIfNotBlocked(); 1407 retransmission_alarm_->Set(rto_timeout);
1447 1408 }
1448 return fec_timeout;
1449 } 1409 }
1450 1410
1451 void QuicConnection::SetEncrypter(EncryptionLevel level, 1411 void QuicConnection::SetEncrypter(EncryptionLevel level,
1452 QuicEncrypter* encrypter) { 1412 QuicEncrypter* encrypter) {
1453 framer_.SetEncrypter(level, encrypter); 1413 framer_.SetEncrypter(level, encrypter);
1454 } 1414 }
1455 1415
1456 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const { 1416 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const {
1457 return framer_.encrypter(level); 1417 return framer_.encrypter(level);
1458 } 1418 }
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
1729 // If we changed the generator's batch state, restore original batch state. 1689 // If we changed the generator's batch state, restore original batch state.
1730 if (!already_in_batch_mode_) { 1690 if (!already_in_batch_mode_) {
1731 DVLOG(1) << "Leaving Batch Mode."; 1691 DVLOG(1) << "Leaving Batch Mode.";
1732 connection_->packet_generator_.FinishBatchOperations(); 1692 connection_->packet_generator_.FinishBatchOperations();
1733 } 1693 }
1734 DCHECK_EQ(already_in_batch_mode_, 1694 DCHECK_EQ(already_in_batch_mode_,
1735 connection_->packet_generator_.InBatchMode()); 1695 connection_->packet_generator_.InBatchMode());
1736 } 1696 }
1737 1697
1738 } // namespace net 1698 } // 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