Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: net/quic/quic_connection.cc

Issue 862133002: Update from https://crrev.com/312398 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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() &&
332 last_stop_waiting_frames_.empty() && 361 last_stop_waiting_frames_.empty() &&
333 last_rst_frames_.empty() && 362 last_rst_frames_.empty() &&
334 last_goaway_frames_.empty() && 363 last_goaway_frames_.empty() &&
335 last_window_update_frames_.empty() && 364 last_window_update_frames_.empty() &&
336 last_blocked_frames_.empty() && 365 last_blocked_frames_.empty() &&
337 last_ping_frames_.empty() && 366 last_ping_frames_.empty() &&
338 last_close_frames_.empty()); 367 last_close_frames_.empty());
339 last_packet_decrypted_ = false; 368 last_packet_decrypted_ = false;
340 last_packet_revived_ = false; 369 last_packet_revived_ = false;
341 } 370 }
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 } 649 }
621 650
622 void QuicConnection::ProcessStopWaitingFrame( 651 void QuicConnection::ProcessStopWaitingFrame(
623 const QuicStopWaitingFrame& stop_waiting) { 652 const QuicStopWaitingFrame& stop_waiting) {
624 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number; 653 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number;
625 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); 654 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting);
626 // Possibly close any FecGroups which are now irrelevant. 655 // Possibly close any FecGroups which are now irrelevant.
627 CloseFecGroupsBefore(stop_waiting.least_unacked + 1); 656 CloseFecGroupsBefore(stop_waiting.least_unacked + 1);
628 } 657 }
629 658
630 bool QuicConnection::OnCongestionFeedbackFrame(
631 const QuicCongestionFeedbackFrame& feedback) {
632 DCHECK(connected_);
633 if (debug_visitor_.get() != nullptr) {
634 debug_visitor_->OnCongestionFeedbackFrame(feedback);
635 }
636 last_congestion_frames_.push_back(feedback);
637 return connected_;
638 }
639
640 bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { 659 bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) {
641 DCHECK(connected_); 660 DCHECK(connected_);
642 661
643 if (last_header_.packet_sequence_number <= 662 if (last_header_.packet_sequence_number <=
644 largest_seen_packet_with_stop_waiting_) { 663 largest_seen_packet_with_stop_waiting_) {
645 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring"; 664 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring";
646 return true; 665 return true;
647 } 666 }
648 667
649 if (!ValidateStopWaitingFrame(frame)) { 668 if (!ValidateStopWaitingFrame(frame)) {
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 // Don't do anything if this packet closed the connection. 840 // Don't do anything if this packet closed the connection.
822 if (!connected_) { 841 if (!connected_) {
823 ClearLastFrames(); 842 ClearLastFrames();
824 return; 843 return;
825 } 844 }
826 845
827 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") 846 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got")
828 << " packet " << last_header_.packet_sequence_number 847 << " packet " << last_header_.packet_sequence_number
829 << " with " << last_stream_frames_.size()<< " stream frames " 848 << " with " << last_stream_frames_.size()<< " stream frames "
830 << last_ack_frames_.size() << " acks, " 849 << last_ack_frames_.size() << " acks, "
831 << last_congestion_frames_.size() << " congestions, "
832 << last_stop_waiting_frames_.size() << " stop_waiting, " 850 << last_stop_waiting_frames_.size() << " stop_waiting, "
833 << last_rst_frames_.size() << " rsts, " 851 << last_rst_frames_.size() << " rsts, "
834 << last_goaway_frames_.size() << " goaways, " 852 << last_goaway_frames_.size() << " goaways, "
835 << last_window_update_frames_.size() << " window updates, " 853 << last_window_update_frames_.size() << " window updates, "
836 << last_blocked_frames_.size() << " blocked, " 854 << last_blocked_frames_.size() << " blocked, "
837 << last_ping_frames_.size() << " pings, " 855 << last_ping_frames_.size() << " pings, "
838 << last_close_frames_.size() << " closes, " 856 << last_close_frames_.size() << " closes, "
839 << "for " << last_header_.public_header.connection_id; 857 << "for " << last_header_.public_header.connection_id;
840 858
841 ++num_packets_received_since_last_ack_sent_; 859 ++num_packets_received_since_last_ack_sent_;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 } 892 }
875 for (size_t i = 0; i < last_goaway_frames_.size(); ++i) { 893 for (size_t i = 0; i < last_goaway_frames_.size(); ++i) {
876 visitor_->OnGoAway(last_goaway_frames_[i]); 894 visitor_->OnGoAway(last_goaway_frames_[i]);
877 } 895 }
878 for (size_t i = 0; i < last_rst_frames_.size(); ++i) { 896 for (size_t i = 0; i < last_rst_frames_.size(); ++i) {
879 visitor_->OnRstStream(last_rst_frames_[i]); 897 visitor_->OnRstStream(last_rst_frames_[i]);
880 } 898 }
881 for (size_t i = 0; i < last_ack_frames_.size(); ++i) { 899 for (size_t i = 0; i < last_ack_frames_.size(); ++i) {
882 ProcessAckFrame(last_ack_frames_[i]); 900 ProcessAckFrame(last_ack_frames_[i]);
883 } 901 }
884 for (size_t i = 0; i < last_congestion_frames_.size(); ++i) {
885 sent_packet_manager_.OnIncomingQuicCongestionFeedbackFrame(
886 last_congestion_frames_[i], time_of_last_received_packet_);
887 }
888 for (size_t i = 0; i < last_stop_waiting_frames_.size(); ++i) { 902 for (size_t i = 0; i < last_stop_waiting_frames_.size(); ++i) {
889 ProcessStopWaitingFrame(last_stop_waiting_frames_[i]); 903 ProcessStopWaitingFrame(last_stop_waiting_frames_[i]);
890 } 904 }
891 if (!last_close_frames_.empty()) { 905 if (!last_close_frames_.empty()) {
892 CloseConnection(last_close_frames_[0].error_code, true); 906 CloseConnection(last_close_frames_[0].error_code, true);
893 DCHECK(!connected_); 907 DCHECK(!connected_);
894 } 908 }
895 909
896 // If there are new missing packets to report, send an ack immediately. 910 // If there are new missing packets to report, send an ack immediately.
897 if (received_packet_manager_.HasNewMissingPackets()) { 911 if (received_packet_manager_.HasNewMissingPackets()) {
(...skipping 23 matching lines...) Expand all
921 } 935 }
922 936
923 if (ack_queued_) { 937 if (ack_queued_) {
924 ack_alarm_->Cancel(); 938 ack_alarm_->Cancel();
925 } 939 }
926 } 940 }
927 941
928 void QuicConnection::ClearLastFrames() { 942 void QuicConnection::ClearLastFrames() {
929 last_stream_frames_.clear(); 943 last_stream_frames_.clear();
930 last_ack_frames_.clear(); 944 last_ack_frames_.clear();
931 last_congestion_frames_.clear();
932 last_stop_waiting_frames_.clear(); 945 last_stop_waiting_frames_.clear();
933 last_rst_frames_.clear(); 946 last_rst_frames_.clear();
934 last_goaway_frames_.clear(); 947 last_goaway_frames_.clear();
935 last_window_update_frames_.clear(); 948 last_window_update_frames_.clear();
936 last_blocked_frames_.clear(); 949 last_blocked_frames_.clear();
937 last_ping_frames_.clear(); 950 last_ping_frames_.clear();
938 last_close_frames_.clear(); 951 last_close_frames_.clear();
939 } 952 }
940 953
941 void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() { 954 void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() {
(...skipping 15 matching lines...) Expand all
957 } 970 }
958 971
959 QuicAckFrame* QuicConnection::CreateAckFrame() { 972 QuicAckFrame* QuicConnection::CreateAckFrame() {
960 QuicAckFrame* outgoing_ack = new QuicAckFrame(); 973 QuicAckFrame* outgoing_ack = new QuicAckFrame();
961 received_packet_manager_.UpdateReceivedPacketInfo( 974 received_packet_manager_.UpdateReceivedPacketInfo(
962 outgoing_ack, clock_->ApproximateNow()); 975 outgoing_ack, clock_->ApproximateNow());
963 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; 976 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack;
964 return outgoing_ack; 977 return outgoing_ack;
965 } 978 }
966 979
967 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() {
968 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_);
969 }
970
971 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { 980 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() {
972 QuicStopWaitingFrame stop_waiting; 981 QuicStopWaitingFrame stop_waiting;
973 UpdateStopWaiting(&stop_waiting); 982 UpdateStopWaiting(&stop_waiting);
974 return new QuicStopWaitingFrame(stop_waiting); 983 return new QuicStopWaitingFrame(stop_waiting);
975 } 984 }
976 985
977 bool QuicConnection::ShouldLastPacketInstigateAck() const { 986 bool QuicConnection::ShouldLastPacketInstigateAck() const {
978 if (!last_stream_frames_.empty() || 987 if (!last_stream_frames_.empty() ||
979 !last_goaway_frames_.empty() || 988 !last_goaway_frames_.empty() ||
980 !last_rst_frames_.empty() || 989 !last_rst_frames_.empty() ||
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 1071
1063 QuicConsumedData QuicConnection::SendStreamData( 1072 QuicConsumedData QuicConnection::SendStreamData(
1064 QuicStreamId id, 1073 QuicStreamId id,
1065 const IOVector& data, 1074 const IOVector& data,
1066 QuicStreamOffset offset, 1075 QuicStreamOffset offset,
1067 bool fin, 1076 bool fin,
1068 FecProtection fec_protection, 1077 FecProtection fec_protection,
1069 QuicAckNotifier::DelegateInterface* delegate) { 1078 QuicAckNotifier::DelegateInterface* delegate) {
1070 if (!fin && data.Empty()) { 1079 if (!fin && data.Empty()) {
1071 LOG(DFATAL) << "Attempt to send empty stream frame"; 1080 LOG(DFATAL) << "Attempt to send empty stream frame";
1072 if (FLAGS_quic_empty_data_no_fin_early_return) { 1081 return QuicConsumedData(0, false);
1073 return QuicConsumedData(0, false);
1074 }
1075 } 1082 }
1076 1083
1077 // Opportunistically bundle an ack with every outgoing packet. 1084 // Opportunistically bundle an ack with every outgoing packet.
1078 // Particularly, we want to bundle with handshake packets since we don't know 1085 // Particularly, we want to bundle with handshake packets since we don't know
1079 // which decrypter will be used on an ack packet following a handshake 1086 // which decrypter will be used on an ack packet following a handshake
1080 // packet (a handshake packet from client to server could result in a REJ or a 1087 // packet (a handshake packet from client to server could result in a REJ or a
1081 // SHLO from the server, leading to two different decrypters at the server.) 1088 // SHLO from the server, leading to two different decrypters at the server.)
1082 // 1089 //
1083 // TODO(jri): Note that ConsumeData may cause a response packet to be sent. 1090 // TODO(jri): Note that ConsumeData may cause a response packet to be sent.
1084 // We may end up sending stale ack information if there are undecryptable 1091 // We may end up sending stale ack information if there are undecryptable
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 packet->original_sequence_number, 1499 packet->original_sequence_number,
1493 packet->encryption_level, 1500 packet->encryption_level,
1494 packet->transmission_type, 1501 packet->transmission_type,
1495 *encrypted, 1502 *encrypted,
1496 packet_send_time); 1503 packet_send_time);
1497 } 1504 }
1498 if (packet->transmission_type == NOT_RETRANSMISSION) { 1505 if (packet->transmission_type == NOT_RETRANSMISSION) {
1499 time_of_last_sent_new_packet_ = packet_send_time; 1506 time_of_last_sent_new_packet_ = packet_send_time;
1500 } 1507 }
1501 SetPingAlarm(); 1508 SetPingAlarm();
1509 MaybeSetFecAlarm(sequence_number);
1502 DVLOG(1) << ENDPOINT << "time " 1510 DVLOG(1) << ENDPOINT << "time "
1503 << (FLAGS_quic_record_send_time_before_write ? 1511 << (FLAGS_quic_record_send_time_before_write ?
1504 "we began writing " : "we finished writing ") 1512 "we began writing " : "we finished writing ")
1505 << "last sent packet: " 1513 << "last sent packet: "
1506 << packet_send_time.ToDebuggingValue(); 1514 << packet_send_time.ToDebuggingValue();
1507 1515
1508 // TODO(ianswett): Change the sequence number length and other packet creator 1516 // TODO(ianswett): Change the sequence number length and other packet creator
1509 // options by a more explicit API than setting a struct value directly, 1517 // options by a more explicit API than setting a struct value directly,
1510 // perhaps via the NetworkChangeVisitor. 1518 // perhaps via the NetworkChangeVisitor.
1511 packet_generator_.UpdateSequenceNumberLength( 1519 packet_generator_.UpdateSequenceNumberLength(
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1586 // forward security, start using the forward-secure encrypter. 1594 // forward security, start using the forward-secure encrypter.
1587 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && 1595 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE &&
1588 has_forward_secure_encrypter_ && 1596 has_forward_secure_encrypter_ &&
1589 serialized_packet.sequence_number >= 1597 serialized_packet.sequence_number >=
1590 first_required_forward_secure_packet_) { 1598 first_required_forward_secure_packet_) {
1591 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); 1599 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
1592 } 1600 }
1593 if (serialized_packet.retransmittable_frames) { 1601 if (serialized_packet.retransmittable_frames) {
1594 serialized_packet.retransmittable_frames-> 1602 serialized_packet.retransmittable_frames->
1595 set_encryption_level(encryption_level_); 1603 set_encryption_level(encryption_level_);
1604
1605 if (FLAGS_quic_ack_notifier_informed_on_serialized) {
1606 sent_packet_manager_.OnSerializedPacket(serialized_packet);
1607 }
1608 }
1609 if (serialized_packet.packet->is_fec_packet() && fec_alarm_->IsSet()) {
1610 // If an FEC packet is serialized with the FEC alarm set, cancel the alarm.
1611 fec_alarm_->Cancel();
1596 } 1612 }
1597 SendOrQueuePacket(QueuedPacket(serialized_packet, encryption_level_)); 1613 SendOrQueuePacket(QueuedPacket(serialized_packet, encryption_level_));
1598 } 1614 }
1599 1615
1600 void QuicConnection::OnCongestionWindowChange() { 1616 void QuicConnection::OnCongestionWindowChange() {
1601 packet_generator_.OnCongestionWindowChange( 1617 packet_generator_.OnCongestionWindowChange(
1602 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); 1618 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
1603 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); 1619 visitor_->OnCongestionWindowChange(clock_->ApproximateNow());
1604 } 1620 }
1605 1621
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 if (retransmission_alarm_->IsSet()) { 1665 if (retransmission_alarm_->IsSet()) {
1650 return; 1666 return;
1651 } 1667 }
1652 packet_generator_.AddControlFrame(QuicFrame(new QuicPingFrame)); 1668 packet_generator_.AddControlFrame(QuicFrame(new QuicPingFrame));
1653 } 1669 }
1654 1670
1655 void QuicConnection::SendAck() { 1671 void QuicConnection::SendAck() {
1656 ack_alarm_->Cancel(); 1672 ack_alarm_->Cancel();
1657 stop_waiting_count_ = 0; 1673 stop_waiting_count_ = 0;
1658 num_packets_received_since_last_ack_sent_ = 0; 1674 num_packets_received_since_last_ack_sent_ = 0;
1659 bool send_feedback = false;
1660 1675
1661 // Deprecating the Congestion Feedback Frame after QUIC_VERSION_22. 1676 packet_generator_.SetShouldSendAck(true);
1662 if (version() <= QUIC_VERSION_22) {
1663 if (received_packet_manager_.GenerateCongestionFeedback(
1664 &outgoing_congestion_feedback_)) {
1665 DVLOG(1) << ENDPOINT << "Sending feedback: "
1666 << outgoing_congestion_feedback_;
1667 send_feedback = true;
1668 }
1669 }
1670
1671 packet_generator_.SetShouldSendAck(send_feedback, true);
1672 } 1677 }
1673 1678
1674 void QuicConnection::OnRetransmissionTimeout() { 1679 void QuicConnection::OnRetransmissionTimeout() {
1675 if (!sent_packet_manager_.HasUnackedPackets()) { 1680 if (!sent_packet_manager_.HasUnackedPackets()) {
1676 return; 1681 return;
1677 } 1682 }
1678 1683
1679 sent_packet_manager_.OnRetransmissionTimeout(); 1684 sent_packet_manager_.OnRetransmissionTimeout();
1680 WriteIfNotBlocked(); 1685 WriteIfNotBlocked();
1681 1686
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 } 1890 }
1886 connected_ = false; 1891 connected_ = false;
1887 if (debug_visitor_.get() != nullptr) { 1892 if (debug_visitor_.get() != nullptr) {
1888 debug_visitor_->OnConnectionClosed(error, from_peer); 1893 debug_visitor_->OnConnectionClosed(error, from_peer);
1889 } 1894 }
1890 visitor_->OnConnectionClosed(error, from_peer); 1895 visitor_->OnConnectionClosed(error, from_peer);
1891 // Cancel the alarms so they don't trigger any action now that the 1896 // Cancel the alarms so they don't trigger any action now that the
1892 // connection is closed. 1897 // connection is closed.
1893 ack_alarm_->Cancel(); 1898 ack_alarm_->Cancel();
1894 ping_alarm_->Cancel(); 1899 ping_alarm_->Cancel();
1900 fec_alarm_->Cancel();
1895 resume_writes_alarm_->Cancel(); 1901 resume_writes_alarm_->Cancel();
1896 retransmission_alarm_->Cancel(); 1902 retransmission_alarm_->Cancel();
1897 send_alarm_->Cancel(); 1903 send_alarm_->Cancel();
1898 timeout_alarm_->Cancel(); 1904 timeout_alarm_->Cancel();
1899 } 1905 }
1900 1906
1901 void QuicConnection::SendGoAway(QuicErrorCode error, 1907 void QuicConnection::SendGoAway(QuicErrorCode error,
1902 QuicStreamId last_good_stream_id, 1908 QuicStreamId last_good_stream_id,
1903 const string& reason) { 1909 const string& reason) {
1904 DVLOG(1) << ENDPOINT << "Going away with error " 1910 DVLOG(1) << ENDPOINT << "Going away with error "
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
2107 } 2113 }
2108 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { 2114 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) {
2109 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { 2115 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) {
2110 return true; 2116 return true;
2111 } 2117 }
2112 } 2118 }
2113 return false; 2119 return false;
2114 } 2120 }
2115 2121
2116 } // namespace net 2122 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_logger.h » ('j') | shell/BUILD.gn » ('J')

Powered by Google App Engine
This is Rietveld 408576698