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> |
11 #include <iterator> | 11 #include <iterator> |
12 #include <limits> | 12 #include <limits> |
13 #include <memory> | 13 #include <memory> |
14 #include <set> | 14 #include <set> |
15 #include <utility> | 15 #include <utility> |
16 | 16 |
17 #include "base/debug/stack_trace.h" | 17 #include "base/debug/stack_trace.h" |
18 #include "base/format_macros.h" | 18 #include "base/format_macros.h" |
19 #include "base/logging.h" | 19 #include "base/logging.h" |
20 #include "base/stl_util.h" | 20 #include "base/stl_util.h" |
21 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
22 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
23 #include "net/quic/crypto/quic_decrypter.h" | 23 #include "net/quic/crypto/quic_decrypter.h" |
24 #include "net/quic/crypto/quic_encrypter.h" | 24 #include "net/quic/crypto/quic_encrypter.h" |
25 #include "net/quic/iovector.h" | 25 #include "net/quic/iovector.h" |
26 #include "net/quic/quic_bandwidth.h" | 26 #include "net/quic/quic_bandwidth.h" |
27 #include "net/quic/quic_config.h" | 27 #include "net/quic/quic_config.h" |
28 #include "net/quic/quic_fec_group.h" | 28 #include "net/quic/quic_fec_group.h" |
29 #include "net/quic/quic_flags.h" | 29 #include "net/quic/quic_flags.h" |
| 30 #include "net/quic/quic_packet_generator.h" |
30 #include "net/quic/quic_utils.h" | 31 #include "net/quic/quic_utils.h" |
31 | 32 |
32 using base::StringPiece; | 33 using base::StringPiece; |
33 using base::StringPrintf; | 34 using base::StringPrintf; |
34 using base::hash_map; | 35 using base::hash_map; |
35 using base::hash_set; | 36 using base::hash_set; |
36 using std::list; | 37 using std::list; |
37 using std::make_pair; | 38 using std::make_pair; |
38 using std::max; | 39 using std::max; |
39 using std::min; | 40 using std::min; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 connection_->SendPing(); | 155 connection_->SendPing(); |
155 return QuicTime::Zero(); | 156 return QuicTime::Zero(); |
156 } | 157 } |
157 | 158 |
158 private: | 159 private: |
159 QuicConnection* connection_; | 160 QuicConnection* connection_; |
160 | 161 |
161 DISALLOW_COPY_AND_ASSIGN(PingAlarm); | 162 DISALLOW_COPY_AND_ASSIGN(PingAlarm); |
162 }; | 163 }; |
163 | 164 |
| 165 // This alarm may be scheduled when an FEC protected packet is sent out. |
| 166 class FecAlarm : public QuicAlarm::Delegate { |
| 167 public: |
| 168 explicit FecAlarm(QuicPacketGenerator* packet_generator) |
| 169 : packet_generator_(packet_generator) {} |
| 170 |
| 171 QuicTime OnAlarm() override { |
| 172 packet_generator_->OnFecTimeout(); |
| 173 return QuicTime::Zero(); |
| 174 } |
| 175 |
| 176 private: |
| 177 QuicPacketGenerator* packet_generator_; |
| 178 |
| 179 DISALLOW_COPY_AND_ASSIGN(FecAlarm); |
| 180 }; |
| 181 |
164 } // namespace | 182 } // namespace |
165 | 183 |
166 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, | 184 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, |
167 EncryptionLevel level) | 185 EncryptionLevel level) |
168 : serialized_packet(packet), | 186 : serialized_packet(packet), |
169 encryption_level(level), | 187 encryption_level(level), |
170 transmission_type(NOT_RETRANSMISSION), | 188 transmission_type(NOT_RETRANSMISSION), |
171 original_sequence_number(0) { | 189 original_sequence_number(0) { |
172 } | 190 } |
173 | 191 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 ack_queued_(false), | 237 ack_queued_(false), |
220 num_packets_received_since_last_ack_sent_(0), | 238 num_packets_received_since_last_ack_sent_(0), |
221 stop_waiting_count_(0), | 239 stop_waiting_count_(0), |
222 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), | 240 ack_alarm_(helper->CreateAlarm(new AckAlarm(this))), |
223 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), | 241 retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))), |
224 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), | 242 send_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
225 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), | 243 resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
226 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), | 244 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
227 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), | 245 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), |
228 packet_generator_(connection_id_, &framer_, random_generator_, this), | 246 packet_generator_(connection_id_, &framer_, random_generator_, this), |
| 247 fec_alarm_(helper->CreateAlarm(new FecAlarm(&packet_generator_))), |
229 idle_network_timeout_(QuicTime::Delta::Infinite()), | 248 idle_network_timeout_(QuicTime::Delta::Infinite()), |
230 overall_connection_timeout_(QuicTime::Delta::Infinite()), | 249 overall_connection_timeout_(QuicTime::Delta::Infinite()), |
231 time_of_last_received_packet_(clock_->ApproximateNow()), | 250 time_of_last_received_packet_(clock_->ApproximateNow()), |
232 time_of_last_sent_new_packet_(clock_->ApproximateNow()), | 251 time_of_last_sent_new_packet_(clock_->ApproximateNow()), |
233 sequence_number_of_last_sent_packet_(0), | 252 sequence_number_of_last_sent_packet_(0), |
234 sent_packet_manager_( | 253 sent_packet_manager_( |
235 is_server, | 254 is_server, |
236 clock_, | 255 clock_, |
237 &stats_, | 256 &stats_, |
238 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic, | 257 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic, |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 | 337 |
319 void QuicConnection::OnError(QuicFramer* framer) { | 338 void QuicConnection::OnError(QuicFramer* framer) { |
320 // Packets that we can not or have not decrypted are dropped. | 339 // Packets that we can not or have not decrypted are dropped. |
321 // TODO(rch): add stats to measure this. | 340 // TODO(rch): add stats to measure this. |
322 if (!connected_ || last_packet_decrypted_ == false) { | 341 if (!connected_ || last_packet_decrypted_ == false) { |
323 return; | 342 return; |
324 } | 343 } |
325 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); | 344 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); |
326 } | 345 } |
327 | 346 |
| 347 void QuicConnection::MaybeSetFecAlarm( |
| 348 QuicPacketSequenceNumber sequence_number) { |
| 349 if (fec_alarm_->IsSet()) { |
| 350 return; |
| 351 } |
| 352 QuicTime::Delta timeout = packet_generator_.GetFecTimeout(sequence_number); |
| 353 if (!timeout.IsInfinite()) { |
| 354 fec_alarm_->Set(clock_->ApproximateNow().Add(timeout)); |
| 355 } |
| 356 } |
| 357 |
328 void QuicConnection::OnPacket() { | 358 void QuicConnection::OnPacket() { |
329 DCHECK(last_stream_frames_.empty() && | 359 DCHECK(last_stream_frames_.empty() && |
330 last_ack_frames_.empty() && | 360 last_ack_frames_.empty() && |
331 last_congestion_frames_.empty() && | 361 last_congestion_frames_.empty() && |
332 last_stop_waiting_frames_.empty() && | 362 last_stop_waiting_frames_.empty() && |
333 last_rst_frames_.empty() && | 363 last_rst_frames_.empty() && |
334 last_goaway_frames_.empty() && | 364 last_goaway_frames_.empty() && |
335 last_window_update_frames_.empty() && | 365 last_window_update_frames_.empty() && |
336 last_blocked_frames_.empty() && | 366 last_blocked_frames_.empty() && |
337 last_ping_frames_.empty() && | 367 last_ping_frames_.empty() && |
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 packet->original_sequence_number, | 1522 packet->original_sequence_number, |
1493 packet->encryption_level, | 1523 packet->encryption_level, |
1494 packet->transmission_type, | 1524 packet->transmission_type, |
1495 *encrypted, | 1525 *encrypted, |
1496 packet_send_time); | 1526 packet_send_time); |
1497 } | 1527 } |
1498 if (packet->transmission_type == NOT_RETRANSMISSION) { | 1528 if (packet->transmission_type == NOT_RETRANSMISSION) { |
1499 time_of_last_sent_new_packet_ = packet_send_time; | 1529 time_of_last_sent_new_packet_ = packet_send_time; |
1500 } | 1530 } |
1501 SetPingAlarm(); | 1531 SetPingAlarm(); |
| 1532 MaybeSetFecAlarm(sequence_number); |
1502 DVLOG(1) << ENDPOINT << "time " | 1533 DVLOG(1) << ENDPOINT << "time " |
1503 << (FLAGS_quic_record_send_time_before_write ? | 1534 << (FLAGS_quic_record_send_time_before_write ? |
1504 "we began writing " : "we finished writing ") | 1535 "we began writing " : "we finished writing ") |
1505 << "last sent packet: " | 1536 << "last sent packet: " |
1506 << packet_send_time.ToDebuggingValue(); | 1537 << packet_send_time.ToDebuggingValue(); |
1507 | 1538 |
1508 // TODO(ianswett): Change the sequence number length and other packet creator | 1539 // TODO(ianswett): Change the sequence number length and other packet creator |
1509 // options by a more explicit API than setting a struct value directly, | 1540 // options by a more explicit API than setting a struct value directly, |
1510 // perhaps via the NetworkChangeVisitor. | 1541 // perhaps via the NetworkChangeVisitor. |
1511 packet_generator_.UpdateSequenceNumberLength( | 1542 packet_generator_.UpdateSequenceNumberLength( |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1586 // forward security, start using the forward-secure encrypter. | 1617 // forward security, start using the forward-secure encrypter. |
1587 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && | 1618 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && |
1588 has_forward_secure_encrypter_ && | 1619 has_forward_secure_encrypter_ && |
1589 serialized_packet.sequence_number >= | 1620 serialized_packet.sequence_number >= |
1590 first_required_forward_secure_packet_) { | 1621 first_required_forward_secure_packet_) { |
1591 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); | 1622 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); |
1592 } | 1623 } |
1593 if (serialized_packet.retransmittable_frames) { | 1624 if (serialized_packet.retransmittable_frames) { |
1594 serialized_packet.retransmittable_frames-> | 1625 serialized_packet.retransmittable_frames-> |
1595 set_encryption_level(encryption_level_); | 1626 set_encryption_level(encryption_level_); |
| 1627 |
| 1628 if (FLAGS_quic_ack_notifier_informed_on_serialized) { |
| 1629 sent_packet_manager_.OnSerializedPacket(serialized_packet); |
| 1630 } |
| 1631 } |
| 1632 if (serialized_packet.packet->is_fec_packet() && fec_alarm_->IsSet()) { |
| 1633 // If an FEC packet is serialized with the FEC alarm set, cancel the alarm. |
| 1634 fec_alarm_->Cancel(); |
1596 } | 1635 } |
1597 SendOrQueuePacket(QueuedPacket(serialized_packet, encryption_level_)); | 1636 SendOrQueuePacket(QueuedPacket(serialized_packet, encryption_level_)); |
1598 } | 1637 } |
1599 | 1638 |
1600 void QuicConnection::OnCongestionWindowChange() { | 1639 void QuicConnection::OnCongestionWindowChange() { |
1601 packet_generator_.OnCongestionWindowChange( | 1640 packet_generator_.OnCongestionWindowChange( |
1602 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); | 1641 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); |
1603 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); | 1642 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); |
1604 } | 1643 } |
1605 | 1644 |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1885 } | 1924 } |
1886 connected_ = false; | 1925 connected_ = false; |
1887 if (debug_visitor_.get() != nullptr) { | 1926 if (debug_visitor_.get() != nullptr) { |
1888 debug_visitor_->OnConnectionClosed(error, from_peer); | 1927 debug_visitor_->OnConnectionClosed(error, from_peer); |
1889 } | 1928 } |
1890 visitor_->OnConnectionClosed(error, from_peer); | 1929 visitor_->OnConnectionClosed(error, from_peer); |
1891 // Cancel the alarms so they don't trigger any action now that the | 1930 // Cancel the alarms so they don't trigger any action now that the |
1892 // connection is closed. | 1931 // connection is closed. |
1893 ack_alarm_->Cancel(); | 1932 ack_alarm_->Cancel(); |
1894 ping_alarm_->Cancel(); | 1933 ping_alarm_->Cancel(); |
| 1934 fec_alarm_->Cancel(); |
1895 resume_writes_alarm_->Cancel(); | 1935 resume_writes_alarm_->Cancel(); |
1896 retransmission_alarm_->Cancel(); | 1936 retransmission_alarm_->Cancel(); |
1897 send_alarm_->Cancel(); | 1937 send_alarm_->Cancel(); |
1898 timeout_alarm_->Cancel(); | 1938 timeout_alarm_->Cancel(); |
1899 } | 1939 } |
1900 | 1940 |
1901 void QuicConnection::SendGoAway(QuicErrorCode error, | 1941 void QuicConnection::SendGoAway(QuicErrorCode error, |
1902 QuicStreamId last_good_stream_id, | 1942 QuicStreamId last_good_stream_id, |
1903 const string& reason) { | 1943 const string& reason) { |
1904 DVLOG(1) << ENDPOINT << "Going away with error " | 1944 DVLOG(1) << ENDPOINT << "Going away with error " |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2107 } | 2147 } |
2108 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | 2148 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
2109 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | 2149 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
2110 return true; | 2150 return true; |
2111 } | 2151 } |
2112 } | 2152 } |
2113 return false; | 2153 return false; |
2114 } | 2154 } |
2115 | 2155 |
2116 } // namespace net | 2156 } // namespace net |
OLD | NEW |