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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 } | 182 } |
183 | 183 |
184 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 184 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
185 | 185 |
186 QuicConnection::QuicConnection(QuicConnectionId connection_id, | 186 QuicConnection::QuicConnection(QuicConnectionId connection_id, |
187 IPEndPoint address, | 187 IPEndPoint address, |
188 QuicConnectionHelperInterface* helper, | 188 QuicConnectionHelperInterface* helper, |
189 const PacketWriterFactory& writer_factory, | 189 const PacketWriterFactory& writer_factory, |
190 bool owns_writer, | 190 bool owns_writer, |
191 bool is_server, | 191 bool is_server, |
| 192 bool is_secure, |
192 const QuicVersionVector& supported_versions) | 193 const QuicVersionVector& supported_versions) |
193 : framer_(supported_versions, helper->GetClock()->ApproximateNow(), | 194 : framer_(supported_versions, helper->GetClock()->ApproximateNow(), |
194 is_server), | 195 is_server), |
195 helper_(helper), | 196 helper_(helper), |
196 writer_(writer_factory.Create(this)), | 197 writer_(writer_factory.Create(this)), |
197 owns_writer_(owns_writer), | 198 owns_writer_(owns_writer), |
198 encryption_level_(ENCRYPTION_NONE), | 199 encryption_level_(ENCRYPTION_NONE), |
199 has_forward_secure_encrypter_(false), | 200 has_forward_secure_encrypter_(false), |
200 first_required_forward_secure_packet_(0), | 201 first_required_forward_secure_packet_(0), |
201 clock_(helper->GetClock()), | 202 clock_(helper->GetClock()), |
(...skipping 13 matching lines...) Expand all Loading... |
215 ack_queued_(false), | 216 ack_queued_(false), |
216 num_packets_received_since_last_ack_sent_(0), | 217 num_packets_received_since_last_ack_sent_(0), |
217 stop_waiting_count_(0), | 218 stop_waiting_count_(0), |
218 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), | 219 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), |
219 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), | 220 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), |
220 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), | 221 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
221 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), | 222 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
222 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), | 223 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
223 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), | 224 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), |
224 packet_generator_(connection_id_, &framer_, random_generator_, this), | 225 packet_generator_(connection_id_, &framer_, random_generator_, this), |
225 idle_network_timeout_(FLAGS_quic_unified_timeouts ? | 226 idle_network_timeout_(QuicTime::Delta::Infinite()), |
226 QuicTime::Delta::Infinite() : | |
227 QuicTime::Delta::FromSeconds(kDefaultIdleTimeoutSecs)), | |
228 overall_connection_timeout_(QuicTime::Delta::Infinite()), | 227 overall_connection_timeout_(QuicTime::Delta::Infinite()), |
229 time_of_last_received_packet_(clock_->ApproximateNow()), | 228 time_of_last_received_packet_(clock_->ApproximateNow()), |
230 time_of_last_sent_new_packet_(clock_->ApproximateNow()), | 229 time_of_last_sent_new_packet_(clock_->ApproximateNow()), |
231 sequence_number_of_last_sent_packet_(0), | 230 sequence_number_of_last_sent_packet_(0), |
232 sent_packet_manager_( | 231 sent_packet_manager_( |
233 is_server, clock_, &stats_, | 232 is_server, clock_, &stats_, |
234 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic, | 233 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic, |
235 FLAGS_quic_use_time_loss_detection ? kTime : kNack), | 234 FLAGS_quic_use_time_loss_detection ? kTime : kNack, |
| 235 is_secure), |
236 version_negotiation_state_(START_NEGOTIATION), | 236 version_negotiation_state_(START_NEGOTIATION), |
237 is_server_(is_server), | 237 is_server_(is_server), |
238 connected_(true), | 238 connected_(true), |
239 peer_ip_changed_(false), | 239 peer_ip_changed_(false), |
240 peer_port_changed_(false), | 240 peer_port_changed_(false), |
241 self_ip_changed_(false), | 241 self_ip_changed_(false), |
242 self_port_changed_(false), | 242 self_port_changed_(false), |
243 can_truncate_connection_ids_(true) { | 243 can_truncate_connection_ids_(true), |
| 244 is_secure_(is_secure) { |
244 DVLOG(1) << ENDPOINT << "Created connection with connection_id: " | 245 DVLOG(1) << ENDPOINT << "Created connection with connection_id: " |
245 << connection_id; | 246 << connection_id; |
246 if (!FLAGS_quic_unified_timeouts) { | |
247 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); | |
248 } | |
249 framer_.set_visitor(this); | 247 framer_.set_visitor(this); |
250 framer_.set_received_entropy_calculator(&received_packet_manager_); | 248 framer_.set_received_entropy_calculator(&received_packet_manager_); |
251 stats_.connection_creation_time = clock_->ApproximateNow(); | 249 stats_.connection_creation_time = clock_->ApproximateNow(); |
252 sent_packet_manager_.set_network_change_visitor(this); | 250 sent_packet_manager_.set_network_change_visitor(this); |
253 } | 251 } |
254 | 252 |
255 QuicConnection::~QuicConnection() { | 253 QuicConnection::~QuicConnection() { |
256 if (owns_writer_) { | 254 if (owns_writer_) { |
257 delete writer_; | 255 delete writer_; |
258 } | 256 } |
259 STLDeleteElements(&undecryptable_packets_); | 257 STLDeleteElements(&undecryptable_packets_); |
260 STLDeleteValues(&group_map_); | 258 STLDeleteValues(&group_map_); |
261 for (QueuedPacketList::iterator it = queued_packets_.begin(); | 259 for (QueuedPacketList::iterator it = queued_packets_.begin(); |
262 it != queued_packets_.end(); ++it) { | 260 it != queued_packets_.end(); ++it) { |
263 delete it->serialized_packet.retransmittable_frames; | 261 delete it->serialized_packet.retransmittable_frames; |
264 delete it->serialized_packet.packet; | 262 delete it->serialized_packet.packet; |
265 } | 263 } |
266 } | 264 } |
267 | 265 |
268 void QuicConnection::SetFromConfig(const QuicConfig& config) { | 266 void QuicConnection::SetFromConfig(const QuicConfig& config) { |
269 if (FLAGS_quic_unified_timeouts) { | 267 if (config.negotiated()) { |
270 if (config.negotiated()) { | 268 SetNetworkTimeouts(QuicTime::Delta::Infinite(), |
271 SetNetworkTimeouts(QuicTime::Delta::Infinite(), | 269 config.IdleConnectionStateLifetime()); |
272 config.IdleConnectionStateLifetime()); | |
273 } else { | |
274 SetNetworkTimeouts(config.max_time_before_crypto_handshake(), | |
275 config.max_idle_time_before_crypto_handshake()); | |
276 } | |
277 } else { | 270 } else { |
278 SetIdleNetworkTimeout(config.IdleConnectionStateLifetime()); | 271 SetNetworkTimeouts(config.max_time_before_crypto_handshake(), |
| 272 config.max_idle_time_before_crypto_handshake()); |
279 } | 273 } |
| 274 |
280 sent_packet_manager_.SetFromConfig(config); | 275 sent_packet_manager_.SetFromConfig(config); |
281 if (FLAGS_allow_truncated_connection_ids_for_quic && | 276 if (FLAGS_allow_truncated_connection_ids_for_quic && |
282 config.HasReceivedBytesForConnectionId() && | 277 config.HasReceivedBytesForConnectionId() && |
283 can_truncate_connection_ids_) { | 278 can_truncate_connection_ids_) { |
284 packet_generator_.SetConnectionIdLength( | 279 packet_generator_.SetConnectionIdLength( |
285 config.ReceivedBytesForConnectionId()); | 280 config.ReceivedBytesForConnectionId()); |
286 } | 281 } |
287 max_undecryptable_packets_ = config.max_undecryptable_packets(); | 282 max_undecryptable_packets_ = config.max_undecryptable_packets(); |
288 } | 283 } |
289 | 284 |
(...skipping 1601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 QuicFecGroup* fec_group = it->second; | 1886 QuicFecGroup* fec_group = it->second; |
1892 DCHECK(!fec_group->CanRevive()); | 1887 DCHECK(!fec_group->CanRevive()); |
1893 FecGroupMap::iterator next = it; | 1888 FecGroupMap::iterator next = it; |
1894 ++next; | 1889 ++next; |
1895 group_map_.erase(it); | 1890 group_map_.erase(it); |
1896 delete fec_group; | 1891 delete fec_group; |
1897 it = next; | 1892 it = next; |
1898 } | 1893 } |
1899 } | 1894 } |
1900 | 1895 |
1901 size_t QuicConnection::max_packet_length() const { | 1896 QuicByteCount QuicConnection::max_packet_length() const { |
1902 return packet_generator_.max_packet_length(); | 1897 return packet_generator_.max_packet_length(); |
1903 } | 1898 } |
1904 | 1899 |
1905 void QuicConnection::set_max_packet_length(size_t length) { | 1900 void QuicConnection::set_max_packet_length(QuicByteCount length) { |
1906 return packet_generator_.set_max_packet_length(length); | 1901 return packet_generator_.set_max_packet_length(length); |
1907 } | 1902 } |
1908 | 1903 |
1909 bool QuicConnection::HasQueuedData() const { | 1904 bool QuicConnection::HasQueuedData() const { |
1910 return pending_version_negotiation_packet_ || | 1905 return pending_version_negotiation_packet_ || |
1911 !queued_packets_.empty() || packet_generator_.HasQueuedFrames(); | 1906 !queued_packets_.empty() || packet_generator_.HasQueuedFrames(); |
1912 } | 1907 } |
1913 | 1908 |
1914 bool QuicConnection::CanWriteStreamData() { | 1909 bool QuicConnection::CanWriteStreamData() { |
1915 // Don't write stream data if there are negotiation or queued data packets | 1910 // Don't write stream data if there are negotiation or queued data packets |
1916 // to send. Otherwise, continue and bundle as many frames as possible. | 1911 // to send. Otherwise, continue and bundle as many frames as possible. |
1917 if (pending_version_negotiation_packet_ || !queued_packets_.empty()) { | 1912 if (pending_version_negotiation_packet_ || !queued_packets_.empty()) { |
1918 return false; | 1913 return false; |
1919 } | 1914 } |
1920 | 1915 |
1921 IsHandshake pending_handshake = visitor_->HasPendingHandshake() ? | 1916 IsHandshake pending_handshake = visitor_->HasPendingHandshake() ? |
1922 IS_HANDSHAKE : NOT_HANDSHAKE; | 1917 IS_HANDSHAKE : NOT_HANDSHAKE; |
1923 // Sending queued packets may have caused the socket to become write blocked, | 1918 // Sending queued packets may have caused the socket to become write blocked, |
1924 // or the congestion manager to prohibit sending. If we've sent everything | 1919 // or the congestion manager to prohibit sending. If we've sent everything |
1925 // we had queued and we're still not blocked, let the visitor know it can | 1920 // we had queued and we're still not blocked, let the visitor know it can |
1926 // write more. | 1921 // write more. |
1927 return ShouldGeneratePacket(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, | 1922 return ShouldGeneratePacket(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, |
1928 pending_handshake); | 1923 pending_handshake); |
1929 } | 1924 } |
1930 | 1925 |
1931 void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { | |
1932 // Adjust the idle timeout on client and server to prevent clients from | |
1933 // sending requests to servers which have already closed the connection. | |
1934 if (is_server_) { | |
1935 timeout = timeout.Add(QuicTime::Delta::FromSeconds(3)); | |
1936 } else if (timeout > QuicTime::Delta::FromSeconds(1)) { | |
1937 timeout = timeout.Subtract(QuicTime::Delta::FromSeconds(1)); | |
1938 } | |
1939 | |
1940 if (timeout < idle_network_timeout_) { | |
1941 idle_network_timeout_ = timeout; | |
1942 SetTimeoutAlarm(); | |
1943 } else { | |
1944 idle_network_timeout_ = timeout; | |
1945 } | |
1946 } | |
1947 | |
1948 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { | |
1949 if (timeout < overall_connection_timeout_) { | |
1950 overall_connection_timeout_ = timeout; | |
1951 SetTimeoutAlarm(); | |
1952 } else { | |
1953 overall_connection_timeout_ = timeout; | |
1954 } | |
1955 } | |
1956 | |
1957 void QuicConnection::SetNetworkTimeouts(QuicTime::Delta overall_timeout, | 1926 void QuicConnection::SetNetworkTimeouts(QuicTime::Delta overall_timeout, |
1958 QuicTime::Delta idle_timeout) { | 1927 QuicTime::Delta idle_timeout) { |
1959 LOG_IF(DFATAL, idle_timeout > overall_timeout) | 1928 LOG_IF(DFATAL, idle_timeout > overall_timeout) |
1960 << "idle_timeout:" << idle_timeout.ToMilliseconds() | 1929 << "idle_timeout:" << idle_timeout.ToMilliseconds() |
1961 << " overall_timeout:" << overall_timeout.ToMilliseconds(); | 1930 << " overall_timeout:" << overall_timeout.ToMilliseconds(); |
1962 // Adjust the idle timeout on client and server to prevent clients from | 1931 // Adjust the idle timeout on client and server to prevent clients from |
1963 // sending requests to servers which have already closed the connection. | 1932 // sending requests to servers which have already closed the connection. |
1964 if (is_server_) { | 1933 if (is_server_) { |
1965 idle_timeout = idle_timeout.Add(QuicTime::Delta::FromSeconds(3)); | 1934 idle_timeout = idle_timeout.Add(QuicTime::Delta::FromSeconds(3)); |
1966 } else if (idle_timeout > QuicTime::Delta::FromSeconds(1)) { | 1935 } else if (idle_timeout > QuicTime::Delta::FromSeconds(1)) { |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2099 } | 2068 } |
2100 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 2069 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
2101 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 2070 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
2102 return true; | 2071 return true; |
2103 } | 2072 } |
2104 } | 2073 } |
2105 return false; | 2074 return false; |
2106 } | 2075 } |
2107 | 2076 |
2108 } // namespace net | 2077 } // namespace net |
OLD | NEW |