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

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

Issue 509203003: Nest a QUIC SerializedPacket inside a QUIC QueuedPacket. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_PacketType_74148481
Patch Set: Created 6 years, 3 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') | no next file » | 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 connection_->SendPing(); 147 connection_->SendPing();
148 return QuicTime::Zero(); 148 return QuicTime::Zero();
149 } 149 }
150 150
151 private: 151 private:
152 QuicConnection* connection_; 152 QuicConnection* connection_;
153 153
154 DISALLOW_COPY_AND_ASSIGN(PingAlarm); 154 DISALLOW_COPY_AND_ASSIGN(PingAlarm);
155 }; 155 };
156 156
157 bool IsConnectionClose(
158 const RetransmittableFrames* retransmittable_frames) {
159 if (!retransmittable_frames) {
160 return false;
161 }
162 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) {
163 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) {
164 return true;
165 }
166 }
167 return false;
168 }
169
170 } // namespace 157 } // namespace
171 158
172 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, 159 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet,
173 EncryptionLevel level, 160 EncryptionLevel level,
174 TransmissionType transmission_type) 161 TransmissionType transmission_type)
175 : sequence_number(packet.sequence_number), 162 : serialized_packet(packet),
176 packet(packet.packet),
177 encryption_level(level), 163 encryption_level(level),
178 transmission_type(transmission_type), 164 transmission_type(transmission_type) {
179 retransmittable((transmission_type != NOT_RETRANSMISSION ||
180 packet.retransmittable_frames != NULL) ?
181 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA),
182 handshake(packet.retransmittable_frames == NULL ?
183 NOT_HANDSHAKE : packet.retransmittable_frames->HasCryptoHandshake()),
184 is_connection_close(IsConnectionClose(packet.retransmittable_frames)),
185 length(packet.packet->length()) {
186 } 165 }
187 166
188 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") 167 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
189 168
190 QuicConnection::QuicConnection(QuicConnectionId connection_id, 169 QuicConnection::QuicConnection(QuicConnectionId connection_id,
191 IPEndPoint address, 170 IPEndPoint address,
192 QuicConnectionHelperInterface* helper, 171 QuicConnectionHelperInterface* helper,
193 const PacketWriterFactory& writer_factory, 172 const PacketWriterFactory& writer_factory,
194 bool owns_writer, 173 bool owns_writer,
195 bool is_server, 174 bool is_server,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 } 234 }
256 235
257 QuicConnection::~QuicConnection() { 236 QuicConnection::~QuicConnection() {
258 if (owns_writer_) { 237 if (owns_writer_) {
259 delete writer_; 238 delete writer_;
260 } 239 }
261 STLDeleteElements(&undecryptable_packets_); 240 STLDeleteElements(&undecryptable_packets_);
262 STLDeleteValues(&group_map_); 241 STLDeleteValues(&group_map_);
263 for (QueuedPacketList::iterator it = queued_packets_.begin(); 242 for (QueuedPacketList::iterator it = queued_packets_.begin();
264 it != queued_packets_.end(); ++it) { 243 it != queued_packets_.end(); ++it) {
265 delete it->packet; 244 delete it->serialized_packet.packet;
266 } 245 }
267 } 246 }
268 247
269 void QuicConnection::SetFromConfig(const QuicConfig& config) { 248 void QuicConnection::SetFromConfig(const QuicConfig& config) {
270 SetIdleNetworkTimeout(config.idle_connection_state_lifetime()); 249 SetIdleNetworkTimeout(config.idle_connection_state_lifetime());
271 sent_packet_manager_.SetFromConfig(config); 250 sent_packet_manager_.SetFromConfig(config);
272 } 251 }
273 252
274 bool QuicConnection::SelectMutualVersion( 253 bool QuicConnection::SelectMutualVersion(
275 const QuicVersionVector& available_versions) { 254 const QuicVersionVector& available_versions) {
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after
1223 DCHECK(!writer_->IsWriteBlocked()); 1202 DCHECK(!writer_->IsWriteBlocked());
1224 1203
1225 if (pending_version_negotiation_packet_) { 1204 if (pending_version_negotiation_packet_) {
1226 SendVersionNegotiationPacket(); 1205 SendVersionNegotiationPacket();
1227 } 1206 }
1228 1207
1229 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); 1208 QueuedPacketList::iterator packet_iterator = queued_packets_.begin();
1230 while (!writer_->IsWriteBlocked() && 1209 while (!writer_->IsWriteBlocked() &&
1231 packet_iterator != queued_packets_.end()) { 1210 packet_iterator != queued_packets_.end()) {
1232 if (WritePacket(*packet_iterator)) { 1211 if (WritePacket(*packet_iterator)) {
1233 delete packet_iterator->packet; 1212 delete packet_iterator->serialized_packet.packet;
1234 packet_iterator = queued_packets_.erase(packet_iterator); 1213 packet_iterator = queued_packets_.erase(packet_iterator);
1235 } else { 1214 } else {
1236 // Continue, because some queued packets may still be writable. 1215 // Continue, because some queued packets may still be writable.
1237 // This can happen if a retransmit send fails. 1216 // This can happen if a retransmit send fails.
1238 ++packet_iterator; 1217 ++packet_iterator;
1239 } 1218 }
1240 } 1219 }
1241 } 1220 }
1242 1221
1243 void QuicConnection::WritePendingRetransmissions() { 1222 void QuicConnection::WritePendingRetransmissions() {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1324 if (!delay.IsZero()) { 1303 if (!delay.IsZero()) {
1325 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); 1304 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1));
1326 DVLOG(1) << "Delaying sending."; 1305 DVLOG(1) << "Delaying sending.";
1327 return false; 1306 return false;
1328 } 1307 }
1329 send_alarm_->Cancel(); 1308 send_alarm_->Cancel();
1330 return true; 1309 return true;
1331 } 1310 }
1332 1311
1333 bool QuicConnection::WritePacket(QueuedPacket packet) { 1312 bool QuicConnection::WritePacket(QueuedPacket packet) {
1334 QuicPacketSequenceNumber sequence_number = packet.sequence_number; 1313 QuicPacketSequenceNumber sequence_number =
1314 packet.serialized_packet.sequence_number;
1335 if (ShouldDiscardPacket(packet.encryption_level, 1315 if (ShouldDiscardPacket(packet.encryption_level,
1336 sequence_number, 1316 sequence_number,
1337 packet.retransmittable)) { 1317 IsRetransmittable(packet))) {
1338 ++stats_.packets_discarded; 1318 ++stats_.packets_discarded;
1339 return true; 1319 return true;
1340 } 1320 }
1341 1321
1342 // Some encryption algorithms require the packet sequence numbers not be 1322 // Some encryption algorithms require the packet sequence numbers not be
1343 // repeated. 1323 // repeated.
1344 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); 1324 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number);
1345 sequence_number_of_last_sent_packet_ = sequence_number; 1325 sequence_number_of_last_sent_packet_ = sequence_number;
1346 1326
1347 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( 1327 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(
1348 packet.encryption_level, sequence_number, *packet.packet); 1328 packet.encryption_level,
1329 sequence_number,
1330 *packet.serialized_packet.packet);
1349 if (encrypted == NULL) { 1331 if (encrypted == NULL) {
1350 LOG(DFATAL) << ENDPOINT << "Failed to encrypt packet number " 1332 LOG(DFATAL) << ENDPOINT << "Failed to encrypt packet number "
1351 << sequence_number; 1333 << sequence_number;
1352 // CloseConnection does not send close packet, so no infinite loop here. 1334 // CloseConnection does not send close packet, so no infinite loop here.
1353 CloseConnection(QUIC_ENCRYPTION_FAILURE, false); 1335 CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
1354 return false; 1336 return false;
1355 } 1337 }
1356 1338
1357 // Connection close packets are eventually owned by TimeWaitListManager. 1339 // Connection close packets are eventually owned by TimeWaitListManager.
1358 // Others are deleted at the end of this call. 1340 // Others are deleted at the end of this call.
1359 scoped_ptr<QuicEncryptedPacket> encrypted_deleter; 1341 scoped_ptr<QuicEncryptedPacket> encrypted_deleter;
1360 if (packet.is_connection_close) { 1342 if (IsConnectionClose(packet)) {
1361 DCHECK(connection_close_packet_.get() == NULL); 1343 DCHECK(connection_close_packet_.get() == NULL);
1362 connection_close_packet_.reset(encrypted); 1344 connection_close_packet_.reset(encrypted);
1363 // This assures we won't try to write *forced* packets when blocked. 1345 // This assures we won't try to write *forced* packets when blocked.
1364 // Return true to stop processing. 1346 // Return true to stop processing.
1365 if (writer_->IsWriteBlocked()) { 1347 if (writer_->IsWriteBlocked()) {
1366 visitor_->OnWriteBlocked(); 1348 visitor_->OnWriteBlocked();
1367 return true; 1349 return true;
1368 } 1350 }
1369 } else { 1351 } else {
1370 encrypted_deleter.reset(encrypted); 1352 encrypted_deleter.reset(encrypted);
1371 } 1353 }
1372 1354
1373 if (!FLAGS_quic_allow_oversized_packets_for_test) { 1355 if (!FLAGS_quic_allow_oversized_packets_for_test) {
1374 DCHECK_LE(encrypted->length(), kMaxPacketSize); 1356 DCHECK_LE(encrypted->length(), kMaxPacketSize);
1375 } 1357 }
1376 DCHECK_LE(encrypted->length(), packet_generator_.max_packet_length()); 1358 DCHECK_LE(encrypted->length(), packet_generator_.max_packet_length());
1377 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number 1359 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number << " : "
1378 << " : " << (packet.packet->is_fec_packet() ? "FEC " : 1360 << (packet.serialized_packet.packet->is_fec_packet() ? "FEC " :
1379 (packet.retransmittable == HAS_RETRANSMITTABLE_DATA 1361 (IsRetransmittable(packet) == HAS_RETRANSMITTABLE_DATA
1380 ? "data bearing " : " ack only ")) 1362 ? "data bearing " : " ack only "))
1381 << ", encryption level: " 1363 << ", encryption level: "
1382 << QuicUtils::EncryptionLevelToString(packet.encryption_level) 1364 << QuicUtils::EncryptionLevelToString(packet.encryption_level)
1383 << ", length:" << packet.packet->length() << ", encrypted length:" 1365 << ", length:"
1366 << packet.serialized_packet.packet->length()
1367 << ", encrypted length:"
1384 << encrypted->length(); 1368 << encrypted->length();
1385 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl 1369 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl
1386 << QuicUtils::StringToHexASCIIDump(packet.packet->AsStringPiece()); 1370 << QuicUtils::StringToHexASCIIDump(
1371 packet.serialized_packet.packet->AsStringPiece());
1387 1372
1388 WriteResult result = writer_->WritePacket(encrypted->data(), 1373 WriteResult result = writer_->WritePacket(encrypted->data(),
1389 encrypted->length(), 1374 encrypted->length(),
1390 self_address().address(), 1375 self_address().address(),
1391 peer_address()); 1376 peer_address());
1392 if (result.error_code == ERR_IO_PENDING) { 1377 if (result.error_code == ERR_IO_PENDING) {
1393 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); 1378 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status);
1394 } 1379 }
1395 if (debug_visitor_.get() != NULL) { 1380 if (debug_visitor_.get() != NULL) {
1396 // Pass the write result to the visitor. 1381 // Pass the write result to the visitor.
(...skipping 22 matching lines...) Expand all
1419 DVLOG(1) << ENDPOINT << "time of last sent packet: " 1404 DVLOG(1) << ENDPOINT << "time of last sent packet: "
1420 << now.ToDebuggingValue(); 1405 << now.ToDebuggingValue();
1421 1406
1422 // TODO(ianswett): Change the sequence number length and other packet creator 1407 // TODO(ianswett): Change the sequence number length and other packet creator
1423 // options by a more explicit API than setting a struct value directly, 1408 // options by a more explicit API than setting a struct value directly,
1424 // perhaps via the NetworkChangeVisitor. 1409 // perhaps via the NetworkChangeVisitor.
1425 packet_generator_.UpdateSequenceNumberLength( 1410 packet_generator_.UpdateSequenceNumberLength(
1426 sent_packet_manager_.least_packet_awaited_by_peer(), 1411 sent_packet_manager_.least_packet_awaited_by_peer(),
1427 sent_packet_manager_.GetCongestionWindow()); 1412 sent_packet_manager_.GetCongestionWindow());
1428 1413
1429 bool reset_retransmission_alarm = 1414 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent(
1430 sent_packet_manager_.OnPacketSent(sequence_number, 1415 sequence_number,
1431 now, 1416 now,
1432 encrypted->length(), 1417 encrypted->length(),
1433 packet.transmission_type, 1418 packet.transmission_type,
1434 packet.retransmittable); 1419 IsRetransmittable(packet));
1435 1420
1436 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { 1421 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
1437 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(), 1422 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(),
1438 QuicTime::Delta::FromMilliseconds(1)); 1423 QuicTime::Delta::FromMilliseconds(1));
1439 } 1424 }
1440 1425
1441 stats_.bytes_sent += result.bytes_written; 1426 stats_.bytes_sent += result.bytes_written;
1442 ++stats_.packets_sent; 1427 ++stats_.packets_sent;
1443 if (packet.transmission_type != NOT_RETRANSMISSION) { 1428 if (packet.transmission_type != NOT_RETRANSMISSION) {
1444 stats_.bytes_retransmitted += result.bytes_written; 1429 stats_.bytes_retransmitted += result.bytes_written;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 if (packet.packet == NULL) { 1516 if (packet.packet == NULL) {
1532 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket"; 1517 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket";
1533 return true; 1518 return true;
1534 } 1519 }
1535 1520
1536 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number, 1521 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number,
1537 packet.entropy_hash); 1522 packet.entropy_hash);
1538 QueuedPacket queued_packet(packet, level, transmission_type); 1523 QueuedPacket queued_packet(packet, level, transmission_type);
1539 // If there are already queued packets, put this at the end, 1524 // If there are already queued packets, put this at the end,
1540 // unless it's ConnectionClose, in which case it is written immediately. 1525 // unless it's ConnectionClose, in which case it is written immediately.
1541 if ((queued_packet.is_connection_close || queued_packets_.empty()) && 1526 if ((IsConnectionClose(queued_packet)
1527 || queued_packets_.empty()) &&
1542 WritePacket(queued_packet)) { 1528 WritePacket(queued_packet)) {
1543 delete packet.packet; 1529 delete packet.packet;
1544 return true; 1530 return true;
1545 } 1531 }
1546 queued_packets_.push_back(queued_packet); 1532 queued_packets_.push_back(queued_packet);
1547 return false; 1533 return false;
1548 } 1534 }
1549 1535
1550 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { 1536 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) {
1551 stop_waiting->least_unacked = GetLeastUnacked(); 1537 stop_waiting->least_unacked = GetLeastUnacked();
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
1988 } 1974 }
1989 // If we changed the generator's batch state, restore original batch state. 1975 // If we changed the generator's batch state, restore original batch state.
1990 if (!already_in_batch_mode_) { 1976 if (!already_in_batch_mode_) {
1991 DVLOG(1) << "Leaving Batch Mode."; 1977 DVLOG(1) << "Leaving Batch Mode.";
1992 connection_->packet_generator_.FinishBatchOperations(); 1978 connection_->packet_generator_.FinishBatchOperations();
1993 } 1979 }
1994 DCHECK_EQ(already_in_batch_mode_, 1980 DCHECK_EQ(already_in_batch_mode_,
1995 connection_->packet_generator_.InBatchMode()); 1981 connection_->packet_generator_.InBatchMode());
1996 } 1982 }
1997 1983
1984 HasRetransmittableData QuicConnection::IsRetransmittable(
1985 QueuedPacket packet) {
1986 // TODO(cyr): Understand why the first check here is necessary. Without it,
1987 // DiscardRetransmit test fails.
1988 if (packet.transmission_type != NOT_RETRANSMISSION ||
1989 packet.serialized_packet.retransmittable_frames != NULL) {
1990 return HAS_RETRANSMITTABLE_DATA;
1991 } else {
1992 return NO_RETRANSMITTABLE_DATA;
1993 }
1994 }
1995
1996 bool QuicConnection::IsConnectionClose(
1997 QueuedPacket packet) {
1998 RetransmittableFrames* retransmittable_frames =
1999 packet.serialized_packet.retransmittable_frames;
2000 if (!retransmittable_frames) {
2001 return false;
2002 }
2003 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) {
2004 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) {
2005 return true;
2006 }
2007 }
2008 return false;
2009 }
2010
1998 } // namespace net 2011 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698