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 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 sent_packet_manager_.SetFromConfig(config); | 275 sent_packet_manager_.SetFromConfig(config); |
276 if (FLAGS_allow_truncated_connection_ids_for_quic && | 276 if (FLAGS_allow_truncated_connection_ids_for_quic && |
277 config.HasReceivedBytesForConnectionId() && | 277 config.HasReceivedBytesForConnectionId() && |
278 can_truncate_connection_ids_) { | 278 can_truncate_connection_ids_) { |
279 packet_generator_.SetConnectionIdLength( | 279 packet_generator_.SetConnectionIdLength( |
280 config.ReceivedBytesForConnectionId()); | 280 config.ReceivedBytesForConnectionId()); |
281 } | 281 } |
282 max_undecryptable_packets_ = config.max_undecryptable_packets(); | 282 max_undecryptable_packets_ = config.max_undecryptable_packets(); |
283 } | 283 } |
284 | 284 |
| 285 void QuicConnection::ResumeConnectionState( |
| 286 const CachedNetworkParameters& cached_network_params) { |
| 287 sent_packet_manager_.ResumeConnectionState(cached_network_params); |
| 288 } |
| 289 |
285 void QuicConnection::SetNumOpenStreams(size_t num_streams) { | 290 void QuicConnection::SetNumOpenStreams(size_t num_streams) { |
286 sent_packet_manager_.SetNumOpenStreams(num_streams); | 291 sent_packet_manager_.SetNumOpenStreams(num_streams); |
287 } | 292 } |
288 | 293 |
289 bool QuicConnection::SelectMutualVersion( | 294 bool QuicConnection::SelectMutualVersion( |
290 const QuicVersionVector& available_versions) { | 295 const QuicVersionVector& available_versions) { |
291 // Try to find the highest mutual version by iterating over supported | 296 // Try to find the highest mutual version by iterating over supported |
292 // versions, starting with the highest, and breaking out of the loop once we | 297 // versions, starting with the highest, and breaking out of the loop once we |
293 // find a matching version in the provided available_versions vector. | 298 // find a matching version in the provided available_versions vector. |
294 const QuicVersionVector& supported_versions = framer_.supported_versions(); | 299 const QuicVersionVector& supported_versions = framer_.supported_versions(); |
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
904 // If the incoming packet was missing, send an ack immediately. | 909 // If the incoming packet was missing, send an ack immediately. |
905 ack_queued_ = received_packet_manager_.IsMissing( | 910 ack_queued_ = received_packet_manager_.IsMissing( |
906 last_header_.packet_sequence_number); | 911 last_header_.packet_sequence_number); |
907 | 912 |
908 if (!ack_queued_ && ShouldLastPacketInstigateAck()) { | 913 if (!ack_queued_ && ShouldLastPacketInstigateAck()) { |
909 if (ack_alarm_->IsSet()) { | 914 if (ack_alarm_->IsSet()) { |
910 ack_queued_ = true; | 915 ack_queued_ = true; |
911 } else { | 916 } else { |
912 // Send an ack much more quickly for crypto handshake packets. | 917 // Send an ack much more quickly for crypto handshake packets. |
913 QuicTime::Delta delayed_ack_time = sent_packet_manager_.DelayedAckTime(); | 918 QuicTime::Delta delayed_ack_time = sent_packet_manager_.DelayedAckTime(); |
914 if (last_stream_frames_.size() == 1 && | |
915 last_stream_frames_[0].stream_id == kCryptoStreamId) { | |
916 delayed_ack_time = QuicTime::Delta::Zero(); | |
917 } | |
918 ack_alarm_->Set(clock_->ApproximateNow().Add(delayed_ack_time)); | 919 ack_alarm_->Set(clock_->ApproximateNow().Add(delayed_ack_time)); |
919 DVLOG(1) << "Ack timer set; next packet or timer will trigger ACK."; | 920 DVLOG(1) << "Ack timer set; next packet or timer will trigger ACK."; |
920 } | 921 } |
921 } | 922 } |
922 | 923 |
923 if (ack_queued_) { | 924 if (ack_queued_) { |
924 ack_alarm_->Cancel(); | 925 ack_alarm_->Cancel(); |
925 } | 926 } |
926 } | 927 } |
927 | 928 |
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 << ", encryption level: " | 1443 << ", encryption level: " |
1443 << QuicUtils::EncryptionLevelToString(packet->encryption_level) | 1444 << QuicUtils::EncryptionLevelToString(packet->encryption_level) |
1444 << ", length:" | 1445 << ", length:" |
1445 << packet->serialized_packet.packet->length() | 1446 << packet->serialized_packet.packet->length() |
1446 << ", encrypted length:" | 1447 << ", encrypted length:" |
1447 << encrypted->length(); | 1448 << encrypted->length(); |
1448 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl | 1449 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl |
1449 << QuicUtils::StringToHexASCIIDump( | 1450 << QuicUtils::StringToHexASCIIDump( |
1450 packet->serialized_packet.packet->AsStringPiece()); | 1451 packet->serialized_packet.packet->AsStringPiece()); |
1451 | 1452 |
| 1453 QuicTime packet_send_time = QuicTime::Zero(); |
| 1454 if (FLAGS_quic_record_send_time_before_write) { |
| 1455 // Measure the RTT from before the write begins to avoid underestimating the |
| 1456 // min_rtt_, especially in cases where the thread blocks or gets swapped out |
| 1457 // during the WritePacket below. |
| 1458 packet_send_time = clock_->Now(); |
| 1459 } |
1452 WriteResult result = writer_->WritePacket(encrypted->data(), | 1460 WriteResult result = writer_->WritePacket(encrypted->data(), |
1453 encrypted->length(), | 1461 encrypted->length(), |
1454 self_address().address(), | 1462 self_address().address(), |
1455 peer_address()); | 1463 peer_address()); |
1456 if (result.error_code == ERR_IO_PENDING) { | 1464 if (result.error_code == ERR_IO_PENDING) { |
1457 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); | 1465 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); |
1458 } | 1466 } |
1459 | 1467 |
1460 if (result.status == WRITE_STATUS_BLOCKED) { | 1468 if (result.status == WRITE_STATUS_BLOCKED) { |
1461 visitor_->OnWriteBlocked(); | 1469 visitor_->OnWriteBlocked(); |
1462 // If the socket buffers the the data, then the packet should not | 1470 // If the socket buffers the the data, then the packet should not |
1463 // be queued and sent again, which would result in an unnecessary | 1471 // be queued and sent again, which would result in an unnecessary |
1464 // duplicate packet being sent. The helper must call OnCanWrite | 1472 // duplicate packet being sent. The helper must call OnCanWrite |
1465 // when the write completes, and OnWriteError if an error occurs. | 1473 // when the write completes, and OnWriteError if an error occurs. |
1466 if (!writer_->IsWriteBlockedDataBuffered()) { | 1474 if (!writer_->IsWriteBlockedDataBuffered()) { |
1467 return false; | 1475 return false; |
1468 } | 1476 } |
1469 } | 1477 } |
1470 QuicTime now = clock_->Now(); | 1478 if (!FLAGS_quic_record_send_time_before_write) { |
| 1479 packet_send_time = clock_->Now(); |
| 1480 } |
| 1481 if (!packet_send_time.IsInitialized()) { |
| 1482 // TODO(jokulik): This is only needed because of the two code paths for |
| 1483 // initializing packet_send_time. Once "quic_record_send_time_before_write" |
| 1484 // is deprecated, this check can be removed. |
| 1485 LOG(DFATAL) << "The packet send time should never be zero. " |
| 1486 << "This is a programming bug, please report it."; |
| 1487 } |
1471 if (result.status != WRITE_STATUS_ERROR && debug_visitor_.get() != nullptr) { | 1488 if (result.status != WRITE_STATUS_ERROR && debug_visitor_.get() != nullptr) { |
1472 // Pass the write result to the visitor. | 1489 // Pass the write result to the visitor. |
1473 debug_visitor_->OnPacketSent(packet->serialized_packet, | 1490 debug_visitor_->OnPacketSent(packet->serialized_packet, |
1474 packet->original_sequence_number, | 1491 packet->original_sequence_number, |
1475 packet->encryption_level, | 1492 packet->encryption_level, |
1476 packet->transmission_type, | 1493 packet->transmission_type, |
1477 *encrypted, | 1494 *encrypted, |
1478 now); | 1495 packet_send_time); |
1479 } | 1496 } |
1480 if (packet->transmission_type == NOT_RETRANSMISSION) { | 1497 if (packet->transmission_type == NOT_RETRANSMISSION) { |
1481 time_of_last_sent_new_packet_ = now; | 1498 time_of_last_sent_new_packet_ = packet_send_time; |
1482 } | 1499 } |
1483 SetPingAlarm(); | 1500 SetPingAlarm(); |
1484 DVLOG(1) << ENDPOINT << "time of last sent packet: " | 1501 DVLOG(1) << ENDPOINT << "time " |
1485 << now.ToDebuggingValue(); | 1502 << (FLAGS_quic_record_send_time_before_write ? |
| 1503 "we began writing " : "we finished writing ") |
| 1504 << "last sent packet: " |
| 1505 << packet_send_time.ToDebuggingValue(); |
1486 | 1506 |
1487 // TODO(ianswett): Change the sequence number length and other packet creator | 1507 // TODO(ianswett): Change the sequence number length and other packet creator |
1488 // options by a more explicit API than setting a struct value directly, | 1508 // options by a more explicit API than setting a struct value directly, |
1489 // perhaps via the NetworkChangeVisitor. | 1509 // perhaps via the NetworkChangeVisitor. |
1490 packet_generator_.UpdateSequenceNumberLength( | 1510 packet_generator_.UpdateSequenceNumberLength( |
1491 sent_packet_manager_.least_packet_awaited_by_peer(), | 1511 sent_packet_manager_.least_packet_awaited_by_peer(), |
1492 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); | 1512 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); |
1493 | 1513 |
1494 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( | 1514 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( |
1495 &packet->serialized_packet, | 1515 &packet->serialized_packet, |
1496 packet->original_sequence_number, | 1516 packet->original_sequence_number, |
1497 now, | 1517 packet_send_time, |
1498 encrypted->length(), | 1518 encrypted->length(), |
1499 packet->transmission_type, | 1519 packet->transmission_type, |
1500 IsRetransmittable(*packet)); | 1520 IsRetransmittable(*packet)); |
1501 | 1521 |
1502 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { | 1522 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { |
1503 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(), | 1523 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(), |
1504 QuicTime::Delta::FromMilliseconds(1)); | 1524 QuicTime::Delta::FromMilliseconds(1)); |
1505 } | 1525 } |
1506 | 1526 |
1507 stats_.bytes_sent += result.bytes_written; | 1527 stats_.bytes_sent += result.bytes_written; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1578 } | 1598 } |
1579 | 1599 |
1580 void QuicConnection::OnCongestionWindowChange() { | 1600 void QuicConnection::OnCongestionWindowChange() { |
1581 packet_generator_.OnCongestionWindowChange( | 1601 packet_generator_.OnCongestionWindowChange( |
1582 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); | 1602 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); |
1583 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); | 1603 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); |
1584 } | 1604 } |
1585 | 1605 |
1586 void QuicConnection::OnHandshakeComplete() { | 1606 void QuicConnection::OnHandshakeComplete() { |
1587 sent_packet_manager_.SetHandshakeConfirmed(); | 1607 sent_packet_manager_.SetHandshakeConfirmed(); |
| 1608 // The client should immediately ack the SHLO to confirm the handshake is |
| 1609 // complete with the server. |
| 1610 if (!is_server_ && !ack_queued_) { |
| 1611 ack_alarm_->Cancel(); |
| 1612 ack_alarm_->Set(clock_->ApproximateNow()); |
| 1613 } |
1588 } | 1614 } |
1589 | 1615 |
1590 void QuicConnection::SendOrQueuePacket(QueuedPacket packet) { | 1616 void QuicConnection::SendOrQueuePacket(QueuedPacket packet) { |
1591 // The caller of this function is responsible for checking CanWrite(). | 1617 // The caller of this function is responsible for checking CanWrite(). |
1592 if (packet.serialized_packet.packet == nullptr) { | 1618 if (packet.serialized_packet.packet == nullptr) { |
1593 LOG(DFATAL) | 1619 LOG(DFATAL) |
1594 << "packet.serialized_packet.packet == nullptr in to SendOrQueuePacket"; | 1620 << "packet.serialized_packet.packet == nullptr in to SendOrQueuePacket"; |
1595 return; | 1621 return; |
1596 } | 1622 } |
1597 | 1623 |
1598 sent_entropy_manager_.RecordPacketEntropyHash( | 1624 sent_entropy_manager_.RecordPacketEntropyHash( |
1599 packet.serialized_packet.sequence_number, | 1625 packet.serialized_packet.sequence_number, |
1600 packet.serialized_packet.entropy_hash); | 1626 packet.serialized_packet.entropy_hash); |
1601 LOG_IF(DFATAL, !queued_packets_.empty() && !writer_->IsWriteBlocked()) | |
1602 << "Packets should only be left queued if we're write blocked."; | |
1603 if (!WritePacket(&packet)) { | 1627 if (!WritePacket(&packet)) { |
1604 queued_packets_.push_back(packet); | 1628 queued_packets_.push_back(packet); |
1605 } | 1629 } |
1606 } | 1630 } |
1607 | 1631 |
1608 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { | 1632 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { |
1609 stop_waiting->least_unacked = GetLeastUnacked(); | 1633 stop_waiting->least_unacked = GetLeastUnacked(); |
1610 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy( | 1634 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy( |
1611 stop_waiting->least_unacked - 1); | 1635 stop_waiting->least_unacked - 1); |
1612 } | 1636 } |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2068 } | 2092 } |
2069 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 2093 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
2070 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 2094 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
2071 return true; | 2095 return true; |
2072 } | 2096 } |
2073 } | 2097 } |
2074 return false; | 2098 return false; |
2075 } | 2099 } |
2076 | 2100 |
2077 } // namespace net | 2101 } // namespace net |
OLD | NEW |