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

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

Issue 2391103003: Landing Recent QUIC changes until 3:24 PM, Oct 01, 2016 UTC-4 (Closed)
Patch Set: Add new error code to quic_error_mapping.cc Created 4 years, 2 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
« no previous file with comments | « net/quic/core/quic_connection.h ('k') | net/quic/core/quic_connection_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/core/quic_connection.h" 5 #include "net/quic/core/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 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 random_generator_(helper->GetRandomGenerator()), 203 random_generator_(helper->GetRandomGenerator()),
204 connection_id_(connection_id), 204 connection_id_(connection_id),
205 peer_address_(address), 205 peer_address_(address),
206 active_peer_migration_type_(NO_CHANGE), 206 active_peer_migration_type_(NO_CHANGE),
207 highest_packet_sent_before_peer_migration_(0), 207 highest_packet_sent_before_peer_migration_(0),
208 last_packet_decrypted_(false), 208 last_packet_decrypted_(false),
209 last_size_(0), 209 last_size_(0),
210 current_packet_data_(nullptr), 210 current_packet_data_(nullptr),
211 last_decrypted_packet_level_(ENCRYPTION_NONE), 211 last_decrypted_packet_level_(ENCRYPTION_NONE),
212 should_last_packet_instigate_acks_(false), 212 should_last_packet_instigate_acks_(false),
213 was_last_packet_missing_(false),
213 largest_seen_packet_with_ack_(0), 214 largest_seen_packet_with_ack_(0),
214 largest_seen_packet_with_stop_waiting_(0), 215 largest_seen_packet_with_stop_waiting_(0),
215 max_undecryptable_packets_(0), 216 max_undecryptable_packets_(0),
216 pending_version_negotiation_packet_(false), 217 pending_version_negotiation_packet_(false),
217 save_crypto_packets_as_termination_packets_(false), 218 save_crypto_packets_as_termination_packets_(false),
218 idle_timeout_connection_close_behavior_( 219 idle_timeout_connection_close_behavior_(
219 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET), 220 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET),
220 close_connection_after_five_rtos_(false), 221 close_connection_after_five_rtos_(false),
221 received_packet_manager_(&stats_), 222 received_packet_manager_(&stats_),
222 ack_queued_(false), 223 ack_queued_(false),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 largest_received_packet_size_(0), 283 largest_received_packet_size_(0),
283 largest_packet_size_supported_(std::numeric_limits<QuicByteCount>::max()), 284 largest_packet_size_supported_(std::numeric_limits<QuicByteCount>::max()),
284 goaway_sent_(false), 285 goaway_sent_(false),
285 goaway_received_(false), 286 goaway_received_(false),
286 multipath_enabled_(false), 287 multipath_enabled_(false),
287 write_error_occured_(false) { 288 write_error_occured_(false) {
288 DVLOG(1) << ENDPOINT 289 DVLOG(1) << ENDPOINT
289 << "Created connection with connection_id: " << connection_id; 290 << "Created connection with connection_id: " << connection_id;
290 framer_.set_visitor(this); 291 framer_.set_visitor(this);
291 framer_.set_received_entropy_calculator(&received_packet_manager_); 292 framer_.set_received_entropy_calculator(&received_packet_manager_);
292 last_stop_waiting_frame_.least_unacked = 0; 293 if (!FLAGS_quic_receive_packet_once_decrypted) {
294 last_stop_waiting_frame_.least_unacked = 0;
295 }
293 stats_.connection_creation_time = clock_->ApproximateNow(); 296 stats_.connection_creation_time = clock_->ApproximateNow();
294 if (FLAGS_quic_enable_multipath) { 297 if (FLAGS_quic_enable_multipath) {
295 sent_packet_manager_.reset(new QuicMultipathSentPacketManager( 298 sent_packet_manager_.reset(new QuicMultipathSentPacketManager(
296 sent_packet_manager_.release(), this)); 299 sent_packet_manager_.release(), this));
297 } 300 }
298 // TODO(ianswett): Supply the NetworkChangeVisitor as a constructor argument 301 // TODO(ianswett): Supply the NetworkChangeVisitor as a constructor argument
299 // and make it required non-null, because it's always used. 302 // and make it required non-null, because it's always used.
300 sent_packet_manager_->SetNetworkChangeVisitor(this); 303 sent_packet_manager_->SetNetworkChangeVisitor(this);
301 // Allow the packet writer to potentially reduce the packet size to a value 304 // Allow the packet writer to potentially reduce the packet size to a value
302 // even smaller than kDefaultMaxPacketSize. 305 // even smaller than kDefaultMaxPacketSize.
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 // packet. 657 // packet.
655 if (active_peer_migration_type_ == NO_CHANGE && 658 if (active_peer_migration_type_ == NO_CHANGE &&
656 peer_migration_type != NO_CHANGE && 659 peer_migration_type != NO_CHANGE &&
657 header.packet_number > received_packet_manager_.GetLargestObserved()) { 660 header.packet_number > received_packet_manager_.GetLargestObserved()) {
658 StartPeerMigration(header.path_id, peer_migration_type); 661 StartPeerMigration(header.path_id, peer_migration_type);
659 } 662 }
660 663
661 --stats_.packets_dropped; 664 --stats_.packets_dropped;
662 DVLOG(1) << ENDPOINT << "Received packet header: " << header; 665 DVLOG(1) << ENDPOINT << "Received packet header: " << header;
663 last_header_ = header; 666 last_header_ = header;
667 if (FLAGS_quic_receive_packet_once_decrypted) {
668 // An ack will be sent if a missing retransmittable packet was received;
669 was_last_packet_missing_ =
670 received_packet_manager_.IsMissing(last_header_.packet_number);
671
672 // Record received to populate ack info correctly before processing stream
673 // frames, since the processing may result in a response packet with a
674 // bundled ack.
675 received_packet_manager_.RecordPacketReceived(
676 last_header_, time_of_last_received_packet_);
677 }
664 DCHECK(connected_); 678 DCHECK(connected_);
665 return true; 679 return true;
666 } 680 }
667 681
668 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { 682 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) {
669 DCHECK(connected_); 683 DCHECK(connected_);
670 if (debug_visitor_ != nullptr) { 684 if (debug_visitor_ != nullptr) {
671 debug_visitor_->OnStreamFrame(frame); 685 debug_visitor_->OnStreamFrame(frame);
672 } 686 }
673 if (frame.stream_id != kCryptoStreamId && 687 if (frame.stream_id != kCryptoStreamId &&
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 if (error != nullptr) { 785 if (error != nullptr) {
772 CloseConnection(QUIC_INVALID_STOP_WAITING_DATA, error, 786 CloseConnection(QUIC_INVALID_STOP_WAITING_DATA, error,
773 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 787 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
774 return false; 788 return false;
775 } 789 }
776 790
777 if (debug_visitor_ != nullptr) { 791 if (debug_visitor_ != nullptr) {
778 debug_visitor_->OnStopWaitingFrame(frame); 792 debug_visitor_->OnStopWaitingFrame(frame);
779 } 793 }
780 794
781 last_stop_waiting_frame_ = frame; 795 if (FLAGS_quic_receive_packet_once_decrypted) {
796 ProcessStopWaitingFrame(frame);
797 } else {
798 last_stop_waiting_frame_ = frame;
799 }
782 return connected_; 800 return connected_;
783 } 801 }
784 802
785 bool QuicConnection::OnPaddingFrame(const QuicPaddingFrame& frame) { 803 bool QuicConnection::OnPaddingFrame(const QuicPaddingFrame& frame) {
786 DCHECK(connected_); 804 DCHECK(connected_);
787 if (debug_visitor_ != nullptr) { 805 if (debug_visitor_ != nullptr) {
788 debug_visitor_->OnPaddingFrame(frame); 806 debug_visitor_->OnPaddingFrame(frame);
789 } 807 }
790 return true; 808 return true;
791 } 809 }
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 void QuicConnection::OnPacketComplete() { 997 void QuicConnection::OnPacketComplete() {
980 // Don't do anything if this packet closed the connection. 998 // Don't do anything if this packet closed the connection.
981 if (!connected_) { 999 if (!connected_) {
982 ClearLastFrames(); 1000 ClearLastFrames();
983 return; 1001 return;
984 } 1002 }
985 1003
986 DVLOG(1) << ENDPOINT << "Got packet " << last_header_.packet_number << " for " 1004 DVLOG(1) << ENDPOINT << "Got packet " << last_header_.packet_number << " for "
987 << last_header_.public_header.connection_id; 1005 << last_header_.public_header.connection_id;
988 1006
989 // An ack will be sent if a missing retransmittable packet was received; 1007 if (FLAGS_quic_receive_packet_once_decrypted) {
990 const bool was_missing = 1008 // An ack will be sent if a missing retransmittable packet was received;
991 should_last_packet_instigate_acks_ && 1009 const bool was_missing =
992 received_packet_manager_.IsMissing(last_header_.packet_number); 1010 should_last_packet_instigate_acks_ && was_last_packet_missing_;
993 1011
994 // Record received to populate ack info correctly before processing stream 1012 // It's possible the ack frame was sent along with response data, so it
995 // frames, since the processing may result in a response packet with a bundled 1013 // no longer needs to be sent.
996 // ack. 1014 if (ack_frame_updated()) {
997 received_packet_manager_.RecordPacketReceived(last_size_, last_header_, 1015 MaybeQueueAck(was_missing);
998 time_of_last_received_packet_); 1016 }
1017 } else {
1018 // An ack will be sent if a missing retransmittable packet was received;
1019 const bool was_missing =
1020 should_last_packet_instigate_acks_ &&
1021 received_packet_manager_.IsMissing(last_header_.packet_number);
999 1022
1000 // Process stop waiting frames here, instead of inline, because the packet 1023 // Record received to populate ack info correctly before processing stream
1001 // needs to be considered 'received' before the entropy can be updated. 1024 // frames, since the processing may result in a response packet with a
1002 if (last_stop_waiting_frame_.least_unacked > 0) { 1025 // bundled ack.
1003 ProcessStopWaitingFrame(last_stop_waiting_frame_); 1026 received_packet_manager_.RecordPacketReceived(
1004 if (!connected_) { 1027 last_header_, time_of_last_received_packet_);
1005 return; 1028
1029 // Process stop waiting frames here, instead of inline, because the packet
1030 // needs to be considered 'received' before the entropy can be updated.
1031 if (last_stop_waiting_frame_.least_unacked > 0) {
1032 ProcessStopWaitingFrame(last_stop_waiting_frame_);
1033 if (!connected_) {
1034 return;
1035 }
1006 } 1036 }
1037
1038 MaybeQueueAck(was_missing);
1007 } 1039 }
1008 1040
1009 MaybeQueueAck(was_missing);
1010
1011 ClearLastFrames(); 1041 ClearLastFrames();
1012 MaybeCloseIfTooManyOutstandingPackets(); 1042 MaybeCloseIfTooManyOutstandingPackets();
1013 } 1043 }
1014 1044
1015 void QuicConnection::MaybeQueueAck(bool was_missing) { 1045 void QuicConnection::MaybeQueueAck(bool was_missing) {
1016 ++num_packets_received_since_last_ack_sent_; 1046 ++num_packets_received_since_last_ack_sent_;
1017 // Always send an ack every 20 packets in order to allow the peer to discard 1047 // Always send an ack every 20 packets in order to allow the peer to discard
1018 // information from the SentPacketManager and provide an RTT measurement. 1048 // information from the SentPacketManager and provide an RTT measurement.
1019 if (num_packets_received_since_last_ack_sent_ >= 1049 if (num_packets_received_since_last_ack_sent_ >=
1020 kMaxPacketsReceivedBeforeAckSend) { 1050 kMaxPacketsReceivedBeforeAckSend) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 } 1101 }
1072 } 1102 }
1073 1103
1074 if (ack_queued_) { 1104 if (ack_queued_) {
1075 ack_alarm_->Cancel(); 1105 ack_alarm_->Cancel();
1076 } 1106 }
1077 } 1107 }
1078 1108
1079 void QuicConnection::ClearLastFrames() { 1109 void QuicConnection::ClearLastFrames() {
1080 should_last_packet_instigate_acks_ = false; 1110 should_last_packet_instigate_acks_ = false;
1081 last_stop_waiting_frame_.least_unacked = 0; 1111 if (!FLAGS_quic_receive_packet_once_decrypted) {
1112 last_stop_waiting_frame_.least_unacked = 0;
1113 }
1082 } 1114 }
1083 1115
1084 void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() { 1116 void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() {
1085 if (version() > QUIC_VERSION_33) { 1117 if (version() > QUIC_VERSION_33) {
1086 return; 1118 return;
1087 } 1119 }
1088 // This occurs if we don't discard old packets we've sent fast enough. 1120 // This occurs if we don't discard old packets we've sent fast enough.
1089 // It's possible largest observed is less than least unacked. 1121 // It's possible largest observed is less than least unacked.
1090 if (sent_packet_manager_->GetLargestObserved(last_header_.path_id) > 1122 if (sent_packet_manager_->GetLargestObserved(last_header_.path_id) >
1091 (sent_packet_manager_->GetLeastUnacked(last_header_.path_id) + 1123 (sent_packet_manager_->GetLeastUnacked(last_header_.path_id) +
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 } 1737 }
1706 1738
1707 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) { 1739 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) {
1708 // Pass the write result to the visitor. 1740 // Pass the write result to the visitor.
1709 debug_visitor_->OnPacketSent(*packet, packet->original_path_id, 1741 debug_visitor_->OnPacketSent(*packet, packet->original_path_id,
1710 packet->original_packet_number, 1742 packet->original_packet_number,
1711 packet->transmission_type, packet_send_time); 1743 packet->transmission_type, packet_send_time);
1712 } 1744 }
1713 if (packet->transmission_type == NOT_RETRANSMISSION) { 1745 if (packet->transmission_type == NOT_RETRANSMISSION) {
1714 time_of_last_sent_new_packet_ = packet_send_time; 1746 time_of_last_sent_new_packet_ = packet_send_time;
1715 if (!FLAGS_quic_better_last_send_for_timeout) {
1716 if (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA &&
1717 last_send_for_timeout_ <= time_of_last_received_packet_) {
1718 last_send_for_timeout_ = packet_send_time;
1719 }
1720 }
1721 } 1747 }
1722 if (FLAGS_quic_better_last_send_for_timeout) { 1748 // Only adjust the last sent time (for the purpose of tracking the idle
1723 // Only adjust the last sent time (for the purpose of tracking the idle 1749 // timeout) if this is the first retransmittable packet sent after a
1724 // timeout) if this is the first retransmittable packet sent after a 1750 // packet is received. If it were updated on every sent packet, then
1725 // packet is received. If it were updated on every sent packet, then 1751 // sending into a black hole might never timeout.
1726 // sending into a black hole might never timeout. 1752 if (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA &&
1727 if (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA && 1753 last_send_for_timeout_ <= time_of_last_received_packet_) {
1728 last_send_for_timeout_ <= time_of_last_received_packet_) { 1754 last_send_for_timeout_ = packet_send_time;
1729 last_send_for_timeout_ = packet_send_time;
1730 }
1731 } 1755 }
1732 SetPingAlarm(); 1756 SetPingAlarm();
1733 MaybeSetMtuAlarm(); 1757 MaybeSetMtuAlarm();
1734 DVLOG(1) << ENDPOINT << "time we began writing last sent packet: " 1758 DVLOG(1) << ENDPOINT << "time we began writing last sent packet: "
1735 << packet_send_time.ToDebuggingValue(); 1759 << packet_send_time.ToDebuggingValue();
1736 1760
1737 bool reset_retransmission_alarm = sent_packet_manager_->OnPacketSent( 1761 bool reset_retransmission_alarm = sent_packet_manager_->OnPacketSent(
1738 packet, packet->original_path_id, packet->original_packet_number, 1762 packet, packet->original_path_id, packet->original_packet_number,
1739 packet_send_time, packet->transmission_type, IsRetransmittable(*packet)); 1763 packet_send_time, packet->transmission_type, IsRetransmittable(*packet));
1740 1764
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
2229 return; 2253 return;
2230 } 2254 }
2231 } 2255 }
2232 2256
2233 SetTimeoutAlarm(); 2257 SetTimeoutAlarm();
2234 } 2258 }
2235 2259
2236 void QuicConnection::SetTimeoutAlarm() { 2260 void QuicConnection::SetTimeoutAlarm() {
2237 QuicTime time_of_last_packet = 2261 QuicTime time_of_last_packet =
2238 max(time_of_last_received_packet_, time_of_last_sent_new_packet_); 2262 max(time_of_last_received_packet_, time_of_last_sent_new_packet_);
2239 if (FLAGS_quic_better_last_send_for_timeout) { 2263 time_of_last_packet =
2240 time_of_last_packet = 2264 max(time_of_last_received_packet_, last_send_for_timeout_);
2241 max(time_of_last_received_packet_, last_send_for_timeout_);
2242 }
2243 2265
2244 QuicTime deadline = time_of_last_packet + idle_network_timeout_; 2266 QuicTime deadline = time_of_last_packet + idle_network_timeout_;
2245 if (!handshake_timeout_.IsInfinite()) { 2267 if (!handshake_timeout_.IsInfinite()) {
2246 deadline = 2268 deadline =
2247 min(deadline, stats_.connection_creation_time + handshake_timeout_); 2269 min(deadline, stats_.connection_creation_time + handshake_timeout_);
2248 } 2270 }
2249 2271
2250 timeout_alarm_->Update(deadline, QuicTime::Delta::Zero()); 2272 timeout_alarm_->Update(deadline, QuicTime::Delta::Zero());
2251 } 2273 }
2252 2274
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
2568 2590
2569 void QuicConnection::CheckIfApplicationLimited() { 2591 void QuicConnection::CheckIfApplicationLimited() {
2570 if (queued_packets_.empty() && 2592 if (queued_packets_.empty() &&
2571 !sent_packet_manager_->HasPendingRetransmissions() && 2593 !sent_packet_manager_->HasPendingRetransmissions() &&
2572 !visitor_->WillingAndAbleToWrite()) { 2594 !visitor_->WillingAndAbleToWrite()) {
2573 sent_packet_manager_->OnApplicationLimited(); 2595 sent_packet_manager_->OnApplicationLimited();
2574 } 2596 }
2575 } 2597 }
2576 2598
2577 } // namespace net 2599 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_connection.h ('k') | net/quic/core/quic_connection_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698