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 1121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 | 1132 |
1133 void QuicConnection::SendBlocked(QuicStreamId id) { | 1133 void QuicConnection::SendBlocked(QuicStreamId id) { |
1134 // Opportunistically bundle an ack with this outgoing packet. | 1134 // Opportunistically bundle an ack with this outgoing packet. |
1135 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); | 1135 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); |
1136 packet_generator_.AddControlFrame(QuicFrame(new QuicBlockedFrame(id))); | 1136 packet_generator_.AddControlFrame(QuicFrame(new QuicBlockedFrame(id))); |
1137 } | 1137 } |
1138 | 1138 |
1139 const QuicConnectionStats& QuicConnection::GetStats() { | 1139 const QuicConnectionStats& QuicConnection::GetStats() { |
1140 // Update rtt and estimated bandwidth. | 1140 // Update rtt and estimated bandwidth. |
1141 stats_.min_rtt_us = | 1141 stats_.min_rtt_us = |
1142 sent_packet_manager_.GetRttStats()->MinRtt().ToMicroseconds(); | 1142 sent_packet_manager_.GetRttStats()->min_rtt().ToMicroseconds(); |
1143 stats_.srtt_us = | 1143 stats_.srtt_us = |
1144 sent_packet_manager_.GetRttStats()->SmoothedRtt().ToMicroseconds(); | 1144 sent_packet_manager_.GetRttStats()->smoothed_rtt().ToMicroseconds(); |
1145 stats_.estimated_bandwidth = | 1145 stats_.estimated_bandwidth = |
1146 sent_packet_manager_.BandwidthEstimate().ToBytesPerSecond(); | 1146 sent_packet_manager_.BandwidthEstimate().ToBytesPerSecond(); |
1147 stats_.congestion_window = sent_packet_manager_.GetCongestionWindow(); | |
1148 stats_.slow_start_threshold = sent_packet_manager_.GetSlowStartThreshold(); | |
1149 stats_.max_packet_size = packet_generator_.max_packet_length(); | 1147 stats_.max_packet_size = packet_generator_.max_packet_length(); |
1150 return stats_; | 1148 return stats_; |
1151 } | 1149 } |
1152 | 1150 |
1153 void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address, | 1151 void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address, |
1154 const IPEndPoint& peer_address, | 1152 const IPEndPoint& peer_address, |
1155 const QuicEncryptedPacket& packet) { | 1153 const QuicEncryptedPacket& packet) { |
1156 if (!connected_) { | 1154 if (!connected_) { |
1157 return; | 1155 return; |
1158 } | 1156 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1269 << ", migrating connection."; | 1267 << ", migrating connection."; |
1270 peer_address_ = IPEndPoint(peer_address_.address(), migrating_peer_port_); | 1268 peer_address_ = IPEndPoint(peer_address_.address(), migrating_peer_port_); |
1271 } | 1269 } |
1272 | 1270 |
1273 time_of_last_received_packet_ = clock_->Now(); | 1271 time_of_last_received_packet_ = clock_->Now(); |
1274 DVLOG(1) << ENDPOINT << "time of last received packet: " | 1272 DVLOG(1) << ENDPOINT << "time of last received packet: " |
1275 << time_of_last_received_packet_.ToDebuggingValue(); | 1273 << time_of_last_received_packet_.ToDebuggingValue(); |
1276 | 1274 |
1277 if (is_server_ && encryption_level_ == ENCRYPTION_NONE && | 1275 if (is_server_ && encryption_level_ == ENCRYPTION_NONE && |
1278 last_size_ > packet_generator_.max_packet_length()) { | 1276 last_size_ > packet_generator_.max_packet_length()) { |
1279 packet_generator_.set_max_packet_length(last_size_); | 1277 set_max_packet_length(last_size_); |
1280 } | 1278 } |
1281 return true; | 1279 return true; |
1282 } | 1280 } |
1283 | 1281 |
1284 void QuicConnection::WriteQueuedPackets() { | 1282 void QuicConnection::WriteQueuedPackets() { |
1285 DCHECK(!writer_->IsWriteBlocked()); | 1283 DCHECK(!writer_->IsWriteBlocked()); |
1286 | 1284 |
1287 if (pending_version_negotiation_packet_) { | 1285 if (pending_version_negotiation_packet_) { |
1288 SendVersionNegotiationPacket(); | 1286 SendVersionNegotiationPacket(); |
1289 } | 1287 } |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1489 } | 1487 } |
1490 SetPingAlarm(); | 1488 SetPingAlarm(); |
1491 DVLOG(1) << ENDPOINT << "time of last sent packet: " | 1489 DVLOG(1) << ENDPOINT << "time of last sent packet: " |
1492 << now.ToDebuggingValue(); | 1490 << now.ToDebuggingValue(); |
1493 | 1491 |
1494 // TODO(ianswett): Change the sequence number length and other packet creator | 1492 // TODO(ianswett): Change the sequence number length and other packet creator |
1495 // options by a more explicit API than setting a struct value directly, | 1493 // options by a more explicit API than setting a struct value directly, |
1496 // perhaps via the NetworkChangeVisitor. | 1494 // perhaps via the NetworkChangeVisitor. |
1497 packet_generator_.UpdateSequenceNumberLength( | 1495 packet_generator_.UpdateSequenceNumberLength( |
1498 sent_packet_manager_.least_packet_awaited_by_peer(), | 1496 sent_packet_manager_.least_packet_awaited_by_peer(), |
1499 sent_packet_manager_.GetCongestionWindow()); | 1497 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); |
1500 | 1498 |
1501 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( | 1499 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( |
1502 &packet->serialized_packet, | 1500 &packet->serialized_packet, |
1503 packet->original_sequence_number, | 1501 packet->original_sequence_number, |
1504 now, | 1502 now, |
1505 encrypted->length(), | 1503 encrypted->length(), |
1506 packet->transmission_type, | 1504 packet->transmission_type, |
1507 IsRetransmittable(*packet)); | 1505 IsRetransmittable(*packet)); |
1508 | 1506 |
1509 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { | 1507 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1579 } | 1577 } |
1580 if (serialized_packet.retransmittable_frames) { | 1578 if (serialized_packet.retransmittable_frames) { |
1581 serialized_packet.retransmittable_frames-> | 1579 serialized_packet.retransmittable_frames-> |
1582 set_encryption_level(encryption_level_); | 1580 set_encryption_level(encryption_level_); |
1583 } | 1581 } |
1584 SendOrQueuePacket(QueuedPacket(serialized_packet, encryption_level_)); | 1582 SendOrQueuePacket(QueuedPacket(serialized_packet, encryption_level_)); |
1585 } | 1583 } |
1586 | 1584 |
1587 void QuicConnection::OnCongestionWindowChange() { | 1585 void QuicConnection::OnCongestionWindowChange() { |
1588 packet_generator_.OnCongestionWindowChange( | 1586 packet_generator_.OnCongestionWindowChange( |
1589 sent_packet_manager_.GetCongestionWindow()); | 1587 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); |
1590 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); | 1588 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); |
1591 } | 1589 } |
1592 | 1590 |
1593 void QuicConnection::OnHandshakeComplete() { | 1591 void QuicConnection::OnHandshakeComplete() { |
1594 sent_packet_manager_.SetHandshakeConfirmed(); | 1592 sent_packet_manager_.SetHandshakeConfirmed(); |
1595 } | 1593 } |
1596 | 1594 |
1597 void QuicConnection::SendOrQueuePacket(QueuedPacket packet) { | 1595 void QuicConnection::SendOrQueuePacket(QueuedPacket packet) { |
1598 // The caller of this function is responsible for checking CanWrite(). | 1596 // The caller of this function is responsible for checking CanWrite(). |
1599 if (packet.serialized_packet.packet == nullptr) { | 1597 if (packet.serialized_packet.packet == nullptr) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 QuicEncrypter* encrypter) { | 1677 QuicEncrypter* encrypter) { |
1680 framer_.SetEncrypter(level, encrypter); | 1678 framer_.SetEncrypter(level, encrypter); |
1681 if (FLAGS_enable_quic_delay_forward_security && | 1679 if (FLAGS_enable_quic_delay_forward_security && |
1682 level == ENCRYPTION_FORWARD_SECURE) { | 1680 level == ENCRYPTION_FORWARD_SECURE) { |
1683 has_forward_secure_encrypter_ = true; | 1681 has_forward_secure_encrypter_ = true; |
1684 first_required_forward_secure_packet_ = | 1682 first_required_forward_secure_packet_ = |
1685 sequence_number_of_last_sent_packet_ + | 1683 sequence_number_of_last_sent_packet_ + |
1686 // 3 times the current congestion window (in slow start) should cover | 1684 // 3 times the current congestion window (in slow start) should cover |
1687 // about two full round trips worth of packets, which should be | 1685 // about two full round trips worth of packets, which should be |
1688 // sufficient. | 1686 // sufficient. |
1689 3 * sent_packet_manager_.GetCongestionWindow() / max_packet_length(); | 1687 3 * sent_packet_manager_.EstimateMaxPacketsInFlight( |
| 1688 max_packet_length()); |
1690 } | 1689 } |
1691 } | 1690 } |
1692 | 1691 |
1693 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const { | 1692 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const { |
1694 return framer_.encrypter(level); | 1693 return framer_.encrypter(level); |
1695 } | 1694 } |
1696 | 1695 |
1697 void QuicConnection::SetDefaultEncryptionLevel(EncryptionLevel level) { | 1696 void QuicConnection::SetDefaultEncryptionLevel(EncryptionLevel level) { |
1698 encryption_level_ = level; | 1697 encryption_level_ = level; |
1699 packet_generator_.set_encryption_level(level); | 1698 packet_generator_.set_encryption_level(level); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1933 // Adjust the idle timeout on client and server to prevent clients from | 1932 // Adjust the idle timeout on client and server to prevent clients from |
1934 // sending requests to servers which have already closed the connection. | 1933 // sending requests to servers which have already closed the connection. |
1935 if (is_server_) { | 1934 if (is_server_) { |
1936 timeout = timeout.Add(QuicTime::Delta::FromSeconds(3)); | 1935 timeout = timeout.Add(QuicTime::Delta::FromSeconds(3)); |
1937 } else if (timeout > QuicTime::Delta::FromSeconds(1)) { | 1936 } else if (timeout > QuicTime::Delta::FromSeconds(1)) { |
1938 timeout = timeout.Subtract(QuicTime::Delta::FromSeconds(1)); | 1937 timeout = timeout.Subtract(QuicTime::Delta::FromSeconds(1)); |
1939 } | 1938 } |
1940 | 1939 |
1941 if (timeout < idle_network_timeout_) { | 1940 if (timeout < idle_network_timeout_) { |
1942 idle_network_timeout_ = timeout; | 1941 idle_network_timeout_ = timeout; |
1943 if (FLAGS_quic_timeouts_only_from_alarms) { | 1942 SetTimeoutAlarm(); |
1944 SetTimeoutAlarm(); | |
1945 } else { | |
1946 CheckForTimeout(); | |
1947 } | |
1948 } else { | 1943 } else { |
1949 idle_network_timeout_ = timeout; | 1944 idle_network_timeout_ = timeout; |
1950 } | 1945 } |
1951 } | 1946 } |
1952 | 1947 |
1953 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { | 1948 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { |
1954 if (timeout < overall_connection_timeout_) { | 1949 if (timeout < overall_connection_timeout_) { |
1955 overall_connection_timeout_ = timeout; | 1950 overall_connection_timeout_ = timeout; |
1956 if (FLAGS_quic_timeouts_only_from_alarms) { | 1951 SetTimeoutAlarm(); |
1957 SetTimeoutAlarm(); | |
1958 } else { | |
1959 CheckForTimeout(); | |
1960 } | |
1961 } else { | 1952 } else { |
1962 overall_connection_timeout_ = timeout; | 1953 overall_connection_timeout_ = timeout; |
1963 } | 1954 } |
1964 } | 1955 } |
1965 | 1956 |
1966 void QuicConnection::SetNetworkTimeouts(QuicTime::Delta overall_timeout, | 1957 void QuicConnection::SetNetworkTimeouts(QuicTime::Delta overall_timeout, |
1967 QuicTime::Delta idle_timeout) { | 1958 QuicTime::Delta idle_timeout) { |
1968 LOG_IF(DFATAL, idle_timeout > overall_timeout) | 1959 LOG_IF(DFATAL, idle_timeout > overall_timeout) |
1969 << "idle_timeout:" << idle_timeout.ToMilliseconds() | 1960 << "idle_timeout:" << idle_timeout.ToMilliseconds() |
1970 << " overall_timeout:" << overall_timeout.ToMilliseconds(); | 1961 << " overall_timeout:" << overall_timeout.ToMilliseconds(); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2108 } | 2099 } |
2109 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 2100 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
2110 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 2101 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
2111 return true; | 2102 return true; |
2112 } | 2103 } |
2113 } | 2104 } |
2114 return false; | 2105 return false; |
2115 } | 2106 } |
2116 | 2107 |
2117 } // namespace net | 2108 } // namespace net |
OLD | NEW |