OLD | NEW |
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 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 if (!delay.IsZero()) { | 1297 if (!delay.IsZero()) { |
1298 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); | 1298 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); |
1299 DVLOG(1) << "Delaying sending."; | 1299 DVLOG(1) << "Delaying sending."; |
1300 return false; | 1300 return false; |
1301 } | 1301 } |
1302 send_alarm_->Cancel(); | 1302 send_alarm_->Cancel(); |
1303 return true; | 1303 return true; |
1304 } | 1304 } |
1305 | 1305 |
1306 bool QuicConnection::WritePacket(const QueuedPacket& packet) { | 1306 bool QuicConnection::WritePacket(const QueuedPacket& packet) { |
1307 QuicPacketSequenceNumber sequence_number = | 1307 if (ShouldDiscardPacket(packet)) { |
1308 packet.serialized_packet.sequence_number; | |
1309 if (ShouldDiscardPacket(packet.encryption_level, | |
1310 sequence_number, | |
1311 IsRetransmittable(packet))) { | |
1312 ++stats_.packets_discarded; | 1308 ++stats_.packets_discarded; |
1313 return true; | 1309 return true; |
1314 } | 1310 } |
1315 // Connection close packets are encypted and saved, so don't exit early. | 1311 // Connection close packets are encypted and saved, so don't exit early. |
1316 if (writer_->IsWriteBlocked() && !IsConnectionClose(packet)) { | 1312 if (writer_->IsWriteBlocked() && !IsConnectionClose(packet)) { |
1317 return false; | 1313 return false; |
1318 } | 1314 } |
1319 | 1315 |
| 1316 QuicPacketSequenceNumber sequence_number = |
| 1317 packet.serialized_packet.sequence_number; |
1320 // Some encryption algorithms require the packet sequence numbers not be | 1318 // Some encryption algorithms require the packet sequence numbers not be |
1321 // repeated. | 1319 // repeated. |
1322 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); | 1320 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); |
1323 sequence_number_of_last_sent_packet_ = sequence_number; | 1321 sequence_number_of_last_sent_packet_ = sequence_number; |
1324 | 1322 |
1325 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( | 1323 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( |
1326 packet.encryption_level, | 1324 packet.encryption_level, |
1327 sequence_number, | 1325 sequence_number, |
1328 *packet.serialized_packet.packet); | 1326 *packet.serialized_packet.packet); |
1329 if (encrypted == NULL) { | 1327 if (encrypted == NULL) { |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1429 } | 1427 } |
1430 | 1428 |
1431 if (result.status == WRITE_STATUS_ERROR) { | 1429 if (result.status == WRITE_STATUS_ERROR) { |
1432 OnWriteError(result.error_code); | 1430 OnWriteError(result.error_code); |
1433 return false; | 1431 return false; |
1434 } | 1432 } |
1435 | 1433 |
1436 return true; | 1434 return true; |
1437 } | 1435 } |
1438 | 1436 |
1439 bool QuicConnection::ShouldDiscardPacket( | 1437 bool QuicConnection::ShouldDiscardPacket(const QueuedPacket& packet) { |
1440 EncryptionLevel level, | |
1441 QuicPacketSequenceNumber sequence_number, | |
1442 HasRetransmittableData retransmittable) { | |
1443 if (!connected_) { | 1438 if (!connected_) { |
1444 DVLOG(1) << ENDPOINT | 1439 DVLOG(1) << ENDPOINT |
1445 << "Not sending packet as connection is disconnected."; | 1440 << "Not sending packet as connection is disconnected."; |
1446 return true; | 1441 return true; |
1447 } | 1442 } |
1448 | 1443 |
| 1444 QuicPacketSequenceNumber sequence_number = |
| 1445 packet.serialized_packet.sequence_number; |
1449 // If the packet has been discarded before sending, don't send it. | 1446 // If the packet has been discarded before sending, don't send it. |
1450 // This occurs if a packet gets serialized, queued, then discarded. | 1447 // This occurs if a packet gets serialized, queued, then discarded. |
1451 if (!sent_packet_manager_.IsUnacked(sequence_number)) { | 1448 if (!sent_packet_manager_.IsUnacked(sequence_number)) { |
1452 DVLOG(1) << ENDPOINT << "Dropping packet before sending: " | 1449 DVLOG(1) << ENDPOINT << "Dropping packet before sending: " |
1453 << sequence_number << " since it has already been discarded."; | 1450 << sequence_number << " since it has already been discarded."; |
1454 return true; | 1451 return true; |
1455 } | 1452 } |
1456 | 1453 |
1457 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE && | 1454 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE && |
1458 level == ENCRYPTION_NONE) { | 1455 packet.encryption_level == ENCRYPTION_NONE) { |
1459 // Drop packets that are NULL encrypted since the peer won't accept them | 1456 // Drop packets that are NULL encrypted since the peer won't accept them |
1460 // anymore. | 1457 // anymore. |
1461 DVLOG(1) << ENDPOINT << "Dropping NULL encrypted packet: " | 1458 DVLOG(1) << ENDPOINT << "Dropping NULL encrypted packet: " |
1462 << sequence_number << " since the connection is forward secure."; | 1459 << sequence_number << " since the connection is forward secure."; |
1463 LOG_IF(DFATAL, | 1460 LOG_IF(DFATAL, |
1464 sent_packet_manager_.HasRetransmittableFrames(sequence_number)) | 1461 sent_packet_manager_.HasRetransmittableFrames(sequence_number)) |
1465 << "Once forward secure, all NULL encrypted packets should be " | 1462 << "Once forward secure, all NULL encrypted packets should be " |
1466 << "neutered."; | 1463 << "neutered."; |
1467 return true; | 1464 return true; |
1468 } | 1465 } |
1469 | 1466 |
1470 if (retransmittable == HAS_RETRANSMITTABLE_DATA && | 1467 if (packet.transmission_type != NOT_RETRANSMISSION && |
1471 !sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { | 1468 !sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { |
1472 DVLOG(1) << ENDPOINT << "Dropping unacked packet: " << sequence_number | 1469 DVLOG(1) << ENDPOINT << "Dropping unacked packet: " << sequence_number |
1473 << " A previous transmission was acked while write blocked."; | 1470 << " A previous transmission was acked while write blocked."; |
1474 return true; | 1471 return true; |
1475 } | 1472 } |
1476 | 1473 |
1477 return false; | 1474 return false; |
1478 } | 1475 } |
1479 | 1476 |
1480 void QuicConnection::OnWriteError(int error_code) { | 1477 void QuicConnection::OnWriteError(int error_code) { |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1971 // If we changed the generator's batch state, restore original batch state. | 1968 // If we changed the generator's batch state, restore original batch state. |
1972 if (!already_in_batch_mode_) { | 1969 if (!already_in_batch_mode_) { |
1973 DVLOG(1) << "Leaving Batch Mode."; | 1970 DVLOG(1) << "Leaving Batch Mode."; |
1974 connection_->packet_generator_.FinishBatchOperations(); | 1971 connection_->packet_generator_.FinishBatchOperations(); |
1975 } | 1972 } |
1976 DCHECK_EQ(already_in_batch_mode_, | 1973 DCHECK_EQ(already_in_batch_mode_, |
1977 connection_->packet_generator_.InBatchMode()); | 1974 connection_->packet_generator_.InBatchMode()); |
1978 } | 1975 } |
1979 | 1976 |
1980 HasRetransmittableData QuicConnection::IsRetransmittable( | 1977 HasRetransmittableData QuicConnection::IsRetransmittable( |
1981 QueuedPacket packet) { | 1978 const QueuedPacket& packet) { |
1982 // TODO(cyr): Understand why the first check here is necessary. Without it, | 1979 // Retransmitted packets retransmittable frames are owned by the unacked |
1983 // DiscardRetransmit test fails. | 1980 // packet map, but are not present in the serialized packet. |
1984 if (packet.transmission_type != NOT_RETRANSMISSION || | 1981 if (packet.transmission_type != NOT_RETRANSMISSION || |
1985 packet.serialized_packet.retransmittable_frames != NULL) { | 1982 packet.serialized_packet.retransmittable_frames != NULL) { |
1986 return HAS_RETRANSMITTABLE_DATA; | 1983 return HAS_RETRANSMITTABLE_DATA; |
1987 } else { | 1984 } else { |
1988 return NO_RETRANSMITTABLE_DATA; | 1985 return NO_RETRANSMITTABLE_DATA; |
1989 } | 1986 } |
1990 } | 1987 } |
1991 | 1988 |
1992 bool QuicConnection::IsConnectionClose( | 1989 bool QuicConnection::IsConnectionClose( |
1993 QueuedPacket packet) { | 1990 QueuedPacket packet) { |
1994 RetransmittableFrames* retransmittable_frames = | 1991 RetransmittableFrames* retransmittable_frames = |
1995 packet.serialized_packet.retransmittable_frames; | 1992 packet.serialized_packet.retransmittable_frames; |
1996 if (!retransmittable_frames) { | 1993 if (!retransmittable_frames) { |
1997 return false; | 1994 return false; |
1998 } | 1995 } |
1999 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 1996 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
2000 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 1997 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
2001 return true; | 1998 return true; |
2002 } | 1999 } |
2003 } | 2000 } |
2004 return false; | 2001 return false; |
2005 } | 2002 } |
2006 | 2003 |
2007 } // namespace net | 2004 } // namespace net |
OLD | NEW |