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

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

Issue 2515613002: deprecate FLAGS_quic_disable_pre_34 (Closed)
Patch Set: Created 4 years, 1 month 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 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 ping_alarm_( 249 ping_alarm_(
250 alarm_factory_->CreateAlarm(arena_.New<PingAlarmDelegate>(this), 250 alarm_factory_->CreateAlarm(arena_.New<PingAlarmDelegate>(this),
251 &arena_)), 251 &arena_)),
252 mtu_discovery_alarm_(alarm_factory_->CreateAlarm( 252 mtu_discovery_alarm_(alarm_factory_->CreateAlarm(
253 arena_.New<MtuDiscoveryAlarmDelegate>(this), 253 arena_.New<MtuDiscoveryAlarmDelegate>(this),
254 &arena_)), 254 &arena_)),
255 visitor_(nullptr), 255 visitor_(nullptr),
256 debug_visitor_(nullptr), 256 debug_visitor_(nullptr),
257 packet_generator_(connection_id_, 257 packet_generator_(connection_id_,
258 &framer_, 258 &framer_,
259 random_generator_,
260 helper->GetBufferAllocator(), 259 helper->GetBufferAllocator(),
261 this), 260 this),
262 idle_network_timeout_(QuicTime::Delta::Infinite()), 261 idle_network_timeout_(QuicTime::Delta::Infinite()),
263 handshake_timeout_(QuicTime::Delta::Infinite()), 262 handshake_timeout_(QuicTime::Delta::Infinite()),
264 time_of_last_received_packet_(clock_->ApproximateNow()), 263 time_of_last_received_packet_(clock_->ApproximateNow()),
265 time_of_last_sent_new_packet_(clock_->ApproximateNow()), 264 time_of_last_sent_new_packet_(clock_->ApproximateNow()),
266 last_send_for_timeout_(clock_->ApproximateNow()), 265 last_send_for_timeout_(clock_->ApproximateNow()),
267 packet_number_of_last_sent_packet_(0), 266 packet_number_of_last_sent_packet_(0),
268 sent_packet_manager_(new QuicSentPacketManager( 267 sent_packet_manager_(new QuicSentPacketManager(
269 perspective, 268 perspective,
(...skipping 12 matching lines...) Expand all
282 packets_between_mtu_probes_(kPacketsBetweenMtuProbesBase), 281 packets_between_mtu_probes_(kPacketsBetweenMtuProbesBase),
283 next_mtu_probe_at_(kPacketsBetweenMtuProbesBase), 282 next_mtu_probe_at_(kPacketsBetweenMtuProbesBase),
284 largest_received_packet_size_(0), 283 largest_received_packet_size_(0),
285 goaway_sent_(false), 284 goaway_sent_(false),
286 goaway_received_(false), 285 goaway_received_(false),
287 multipath_enabled_(false), 286 multipath_enabled_(false),
288 write_error_occured_(false) { 287 write_error_occured_(false) {
289 DVLOG(1) << ENDPOINT 288 DVLOG(1) << ENDPOINT
290 << "Created connection with connection_id: " << connection_id; 289 << "Created connection with connection_id: " << connection_id;
291 framer_.set_visitor(this); 290 framer_.set_visitor(this);
292 framer_.set_received_entropy_calculator(&received_packet_manager_);
293 if (!FLAGS_quic_receive_packet_once_decrypted) { 291 if (!FLAGS_quic_receive_packet_once_decrypted) {
294 last_stop_waiting_frame_.least_unacked = 0; 292 last_stop_waiting_frame_.least_unacked = 0;
295 } 293 }
296 stats_.connection_creation_time = clock_->ApproximateNow(); 294 stats_.connection_creation_time = clock_->ApproximateNow();
297 if (FLAGS_quic_enable_multipath) { 295 if (FLAGS_quic_enable_multipath) {
298 sent_packet_manager_.reset(new QuicMultipathSentPacketManager( 296 sent_packet_manager_.reset(new QuicMultipathSentPacketManager(
299 sent_packet_manager_.release(), this)); 297 sent_packet_manager_.release(), this));
300 } 298 }
301 // TODO(ianswett): Supply the NetworkChangeVisitor as a constructor argument 299 // TODO(ianswett): Supply the NetworkChangeVisitor as a constructor argument
302 // and make it required non-null, because it's always used. 300 // and make it required non-null, because it's always used.
303 sent_packet_manager_->SetNetworkChangeVisitor(this); 301 sent_packet_manager_->SetNetworkChangeVisitor(this);
304 // Allow the packet writer to potentially reduce the packet size to a value 302 // Allow the packet writer to potentially reduce the packet size to a value
305 // even smaller than kDefaultMaxPacketSize. 303 // even smaller than kDefaultMaxPacketSize.
306 SetMaxPacketLength(perspective_ == Perspective::IS_SERVER 304 SetMaxPacketLength(perspective_ == Perspective::IS_SERVER
307 ? kDefaultServerMaxPacketSize 305 ? kDefaultServerMaxPacketSize
308 : kDefaultMaxPacketSize); 306 : kDefaultMaxPacketSize);
309 received_packet_manager_.SetVersion(version());
310 } 307 }
311 308
312 QuicConnection::~QuicConnection() { 309 QuicConnection::~QuicConnection() {
313 if (owns_writer_) { 310 if (owns_writer_) {
314 delete writer_; 311 delete writer_;
315 } 312 }
316 ClearQueuedPackets(); 313 ClearQueuedPackets();
317 } 314 }
318 315
319 void QuicConnection::ClearQueuedPackets() { 316 void QuicConnection::ClearQueuedPackets() {
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 case NEGOTIATED_VERSION: 490 case NEGOTIATED_VERSION:
494 // Might be old packets that were sent by the client before the version 491 // Might be old packets that were sent by the client before the version
495 // was negotiated. Drop these. 492 // was negotiated. Drop these.
496 return false; 493 return false;
497 494
498 default: 495 default:
499 DCHECK(false); 496 DCHECK(false);
500 } 497 }
501 498
502 version_negotiation_state_ = NEGOTIATED_VERSION; 499 version_negotiation_state_ = NEGOTIATED_VERSION;
503 received_packet_manager_.SetVersion(received_version);
504 visitor_->OnSuccessfulVersionNegotiation(received_version); 500 visitor_->OnSuccessfulVersionNegotiation(received_version);
505 if (debug_visitor_ != nullptr) { 501 if (debug_visitor_ != nullptr) {
506 debug_visitor_->OnSuccessfulVersionNegotiation(received_version); 502 debug_visitor_->OnSuccessfulVersionNegotiation(received_version);
507 } 503 }
508 DVLOG(1) << ENDPOINT << "version negotiated " << received_version; 504 DVLOG(1) << ENDPOINT << "version negotiated " << received_version;
509 505
510 // Store the new version. 506 // Store the new version.
511 framer_.set_version(received_version); 507 framer_.set_version(received_version);
512 508
513 // TODO(satyamshekhar): Store the packet number of this packet and close the 509 // TODO(satyamshekhar): Store the packet number of this packet and close the
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 "No common version found. Supported versions: {" + 552 "No common version found. Supported versions: {" +
557 QuicVersionVectorToString(framer_.supported_versions()) + 553 QuicVersionVectorToString(framer_.supported_versions()) +
558 "}, peer supported versions: {" + 554 "}, peer supported versions: {" +
559 QuicVersionVectorToString(packet.versions) + "}", 555 QuicVersionVectorToString(packet.versions) + "}",
560 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 556 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
561 return; 557 return;
562 } 558 }
563 559
564 DVLOG(1) << ENDPOINT 560 DVLOG(1) << ENDPOINT
565 << "Negotiated version: " << QuicVersionToString(version()); 561 << "Negotiated version: " << QuicVersionToString(version());
566 received_packet_manager_.SetVersion(version());
567 server_supported_versions_ = packet.versions; 562 server_supported_versions_ = packet.versions;
568 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS; 563 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
569 RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); 564 RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
570 } 565 }
571 566
572 bool QuicConnection::OnUnauthenticatedPublicHeader( 567 bool QuicConnection::OnUnauthenticatedPublicHeader(
573 const QuicPacketPublicHeader& header) { 568 const QuicPacketPublicHeader& header) {
574 if (header.connection_id == connection_id_) { 569 if (header.connection_id == connection_id_) {
575 return true; 570 return true;
576 } 571 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 if (error != nullptr) { 720 if (error != nullptr) {
726 CloseConnection(QUIC_INVALID_ACK_DATA, error, 721 CloseConnection(QUIC_INVALID_ACK_DATA, error,
727 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 722 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
728 return false; 723 return false;
729 } 724 }
730 725
731 if (send_alarm_->IsSet()) { 726 if (send_alarm_->IsSet()) {
732 send_alarm_->Cancel(); 727 send_alarm_->Cancel();
733 } 728 }
734 ProcessAckFrame(incoming_ack); 729 ProcessAckFrame(incoming_ack);
735 if (incoming_ack.is_truncated) {
736 should_last_packet_instigate_acks_ = true;
737 }
738 // If the incoming ack's packets set expresses missing packets: peer is still 730 // If the incoming ack's packets set expresses missing packets: peer is still
739 // waiting for a packet lower than a packet that we are no longer planning to 731 // waiting for a packet lower than a packet that we are no longer planning to
740 // send. 732 // send.
741 // If the incoming ack's packets set expresses received packets: peer is still 733 // If the incoming ack's packets set expresses received packets: peer is still
742 // acking packets which we never care about. 734 // acking packets which we never care about.
743 // Send an ack to raise the high water mark. 735 // Send an ack to raise the high water mark.
744 if (!incoming_ack.packets.Empty() && 736 if (!incoming_ack.packets.Empty() &&
745 GetLeastUnacked(incoming_ack.path_id) > incoming_ack.packets.Min()) { 737 GetLeastUnacked(incoming_ack.path_id) > incoming_ack.packets.Min()) {
746 ++stop_waiting_count_; 738 ++stop_waiting_count_;
747 } else { 739 } else {
748 stop_waiting_count_ = 0; 740 stop_waiting_count_ = 0;
749 } 741 }
750 742
751 return connected_; 743 return connected_;
752 } 744 }
753 745
754 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { 746 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) {
755 largest_seen_packet_with_ack_ = last_header_.packet_number; 747 largest_seen_packet_with_ack_ = last_header_.packet_number;
756 sent_packet_manager_->OnIncomingAck(incoming_ack, 748 sent_packet_manager_->OnIncomingAck(incoming_ack,
757 time_of_last_received_packet_); 749 time_of_last_received_packet_);
758 if (version() <= QUIC_VERSION_33) {
759 sent_entropy_manager_.ClearEntropyBefore(
760 sent_packet_manager_->GetLeastPacketAwaitedByPeer(
761 incoming_ack.path_id) -
762 1);
763 }
764 // Always reset the retransmission alarm when an ack comes in, since we now 750 // Always reset the retransmission alarm when an ack comes in, since we now
765 // have a better estimate of the current rtt than when it was set. 751 // have a better estimate of the current rtt than when it was set.
766 SetRetransmissionAlarm(); 752 SetRetransmissionAlarm();
767 } 753 }
768 754
769 void QuicConnection::ProcessStopWaitingFrame( 755 void QuicConnection::ProcessStopWaitingFrame(
770 const QuicStopWaitingFrame& stop_waiting) { 756 const QuicStopWaitingFrame& stop_waiting) {
771 largest_seen_packet_with_stop_waiting_ = last_header_.packet_number; 757 largest_seen_packet_with_stop_waiting_ = last_header_.packet_number;
772 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); 758 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting);
773 } 759 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 << incoming_ack.largest_observed << " vs " 817 << incoming_ack.largest_observed << " vs "
832 << sent_packet_manager_->GetLargestObserved(incoming_ack.path_id) 818 << sent_packet_manager_->GetLargestObserved(incoming_ack.path_id)
833 << " packet_number:" << last_header_.packet_number 819 << " packet_number:" << last_header_.packet_number
834 << " largest seen with ack:" << largest_seen_packet_with_ack_ 820 << " largest seen with ack:" << largest_seen_packet_with_ack_
835 << " connection_id: " << connection_id_; 821 << " connection_id: " << connection_id_;
836 // A new ack has a diminished largest_observed value. Error out. 822 // A new ack has a diminished largest_observed value. Error out.
837 // If this was an old packet, we wouldn't even have checked. 823 // If this was an old packet, we wouldn't even have checked.
838 return "Largest observed too low."; 824 return "Largest observed too low.";
839 } 825 }
840 826
841 if (version() <= QUIC_VERSION_33) { 827 if (!incoming_ack.packets.Empty() &&
842 if (!incoming_ack.packets.Empty() && 828 incoming_ack.packets.Max() != incoming_ack.largest_observed) {
843 incoming_ack.packets.Max() > incoming_ack.largest_observed) { 829 QUIC_BUG << ENDPOINT
844 LOG(WARNING) << ENDPOINT 830 << "Peer last received packet: " << incoming_ack.packets.Max()
845 << "Peer sent missing packet: " << incoming_ack.packets.Max() 831 << " which is not equal to largest observed: "
846 << " which is greater than largest observed: " 832 << incoming_ack.largest_observed;
847 << incoming_ack.largest_observed; 833 return "Last received packet not equal to largest observed.";
848 return "Missing packet higher than largest observed.";
849 }
850
851 if (!incoming_ack.packets.Empty() &&
852 incoming_ack.packets.Min() <
853 sent_packet_manager_->GetLeastPacketAwaitedByPeer(
854 incoming_ack.path_id)) {
855 LOG(WARNING) << ENDPOINT
856 << "Peer sent missing packet: " << incoming_ack.packets.Min()
857 << " which is smaller than least_packet_awaited_by_peer_: "
858 << sent_packet_manager_->GetLeastPacketAwaitedByPeer(
859 incoming_ack.path_id);
860 return "Missing packet smaller than least awaited.";
861 }
862 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed,
863 incoming_ack.packets,
864 incoming_ack.entropy_hash)) {
865 DLOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."
866 << " largest_observed:" << incoming_ack.largest_observed
867 << " last_received:" << last_header_.packet_number;
868 return "Invalid entropy.";
869 }
870 } else {
871 if (!incoming_ack.packets.Empty() &&
872 incoming_ack.packets.Max() != incoming_ack.largest_observed) {
873 QUIC_BUG << ENDPOINT
874 << "Peer last received packet: " << incoming_ack.packets.Max()
875 << " which is not equal to largest observed: "
876 << incoming_ack.largest_observed;
877 return "Last received packet not equal to largest observed.";
878 }
879 } 834 }
880 835
881 return nullptr; 836 return nullptr;
882 } 837 }
883 838
884 const char* QuicConnection::ValidateStopWaitingFrame( 839 const char* QuicConnection::ValidateStopWaitingFrame(
885 const QuicStopWaitingFrame& stop_waiting) { 840 const QuicStopWaitingFrame& stop_waiting) {
886 if (stop_waiting.least_unacked < 841 if (stop_waiting.least_unacked <
887 received_packet_manager_.peer_least_packet_awaiting_ack()) { 842 received_packet_manager_.peer_least_packet_awaiting_ack()) {
888 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " 843 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: "
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 ProcessStopWaitingFrame(last_stop_waiting_frame_); 987 ProcessStopWaitingFrame(last_stop_waiting_frame_);
1033 if (!connected_) { 988 if (!connected_) {
1034 return; 989 return;
1035 } 990 }
1036 } 991 }
1037 992
1038 MaybeQueueAck(was_missing); 993 MaybeQueueAck(was_missing);
1039 } 994 }
1040 995
1041 ClearLastFrames(); 996 ClearLastFrames();
1042 MaybeCloseIfTooManyOutstandingPackets();
1043 } 997 }
1044 998
1045 void QuicConnection::MaybeQueueAck(bool was_missing) { 999 void QuicConnection::MaybeQueueAck(bool was_missing) {
1046 ++num_packets_received_since_last_ack_sent_; 1000 ++num_packets_received_since_last_ack_sent_;
1047 // Always send an ack every 20 packets in order to allow the peer to discard 1001 // Always send an ack every 20 packets in order to allow the peer to discard
1048 // information from the SentPacketManager and provide an RTT measurement. 1002 // information from the SentPacketManager and provide an RTT measurement.
1049 if (num_packets_received_since_last_ack_sent_ >= 1003 if (num_packets_received_since_last_ack_sent_ >=
1050 kMaxPacketsReceivedBeforeAckSend) { 1004 kMaxPacketsReceivedBeforeAckSend) {
1051 ack_queued_ = true; 1005 ack_queued_ = true;
1052 } 1006 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1106 } 1060 }
1107 } 1061 }
1108 1062
1109 void QuicConnection::ClearLastFrames() { 1063 void QuicConnection::ClearLastFrames() {
1110 should_last_packet_instigate_acks_ = false; 1064 should_last_packet_instigate_acks_ = false;
1111 if (!FLAGS_quic_receive_packet_once_decrypted) { 1065 if (!FLAGS_quic_receive_packet_once_decrypted) {
1112 last_stop_waiting_frame_.least_unacked = 0; 1066 last_stop_waiting_frame_.least_unacked = 0;
1113 } 1067 }
1114 } 1068 }
1115 1069
1116 void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() {
1117 if (version() > QUIC_VERSION_33) {
1118 return;
1119 }
1120 // This occurs if we don't discard old packets we've sent fast enough.
1121 // It's possible largest observed is less than least unacked.
1122 if (sent_packet_manager_->GetLargestObserved(last_header_.path_id) >
1123 (sent_packet_manager_->GetLeastUnacked(last_header_.path_id) +
1124 kMaxTrackedPackets)) {
1125 CloseConnection(
1126 QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS,
1127 StringPrintf("More than %" PRIu64 " outstanding.", kMaxTrackedPackets),
1128 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
1129 }
1130 // This occurs if there are received packet gaps and the peer does not raise
1131 // the least unacked fast enough.
1132 if (received_packet_manager_.NumTrackedPackets() > kMaxTrackedPackets) {
1133 CloseConnection(
1134 QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS,
1135 StringPrintf("More than %" PRIu64 " outstanding.", kMaxTrackedPackets),
1136 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
1137 }
1138 }
1139
1140 const QuicFrame QuicConnection::GetUpdatedAckFrame() { 1070 const QuicFrame QuicConnection::GetUpdatedAckFrame() {
1141 return received_packet_manager_.GetUpdatedAckFrame(clock_->ApproximateNow()); 1071 return received_packet_manager_.GetUpdatedAckFrame(clock_->ApproximateNow());
1142 } 1072 }
1143 1073
1144 void QuicConnection::PopulateStopWaitingFrame( 1074 void QuicConnection::PopulateStopWaitingFrame(
1145 QuicStopWaitingFrame* stop_waiting) { 1075 QuicStopWaitingFrame* stop_waiting) {
1146 stop_waiting->least_unacked = GetLeastUnacked(stop_waiting->path_id); 1076 stop_waiting->least_unacked = GetLeastUnacked(stop_waiting->path_id);
1147 if (version() <= QUIC_VERSION_33) {
1148 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
1149 stop_waiting->least_unacked - 1);
1150 }
1151 } 1077 }
1152 1078
1153 QuicPacketNumber QuicConnection::GetLeastUnacked(QuicPathId path_id) const { 1079 QuicPacketNumber QuicConnection::GetLeastUnacked(QuicPathId path_id) const {
1154 return sent_packet_manager_->GetLeastUnacked(path_id); 1080 return sent_packet_manager_->GetLeastUnacked(path_id);
1155 } 1081 }
1156 1082
1157 void QuicConnection::MaybeSendInResponseToPacket() { 1083 void QuicConnection::MaybeSendInResponseToPacket() {
1158 if (!connected_) { 1084 if (!connected_) {
1159 return; 1085 return;
1160 } 1086 }
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1473 " without version flag before version negotiated.", 1399 " without version flag before version negotiated.",
1474 ENDPOINT, header.packet_number); 1400 ENDPOINT, header.packet_number);
1475 DLOG(WARNING) << error_details; 1401 DLOG(WARNING) << error_details;
1476 CloseConnection(QUIC_INVALID_VERSION, error_details, 1402 CloseConnection(QUIC_INVALID_VERSION, error_details,
1477 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 1403 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
1478 return false; 1404 return false;
1479 } else { 1405 } else {
1480 DCHECK_EQ(1u, header.public_header.versions.size()); 1406 DCHECK_EQ(1u, header.public_header.versions.size());
1481 DCHECK_EQ(header.public_header.versions[0], version()); 1407 DCHECK_EQ(header.public_header.versions[0], version());
1482 version_negotiation_state_ = NEGOTIATED_VERSION; 1408 version_negotiation_state_ = NEGOTIATED_VERSION;
1483 received_packet_manager_.SetVersion(version());
1484 visitor_->OnSuccessfulVersionNegotiation(version()); 1409 visitor_->OnSuccessfulVersionNegotiation(version());
1485 if (debug_visitor_ != nullptr) { 1410 if (debug_visitor_ != nullptr) {
1486 debug_visitor_->OnSuccessfulVersionNegotiation(version()); 1411 debug_visitor_->OnSuccessfulVersionNegotiation(version());
1487 } 1412 }
1488 } 1413 }
1489 } else { 1414 } else {
1490 DCHECK(!header.public_header.version_flag); 1415 DCHECK(!header.public_header.version_flag);
1491 // If the client gets a packet without the version flag from the server 1416 // If the client gets a packet without the version flag from the server
1492 // it should stop sending version since the version negotiation is done. 1417 // it should stop sending version since the version negotiation is done.
1493 packet_generator_.StopSendingVersion(); 1418 packet_generator_.StopSendingVersion();
1494 version_negotiation_state_ = NEGOTIATED_VERSION; 1419 version_negotiation_state_ = NEGOTIATED_VERSION;
1495 received_packet_manager_.SetVersion(version());
1496 visitor_->OnSuccessfulVersionNegotiation(version()); 1420 visitor_->OnSuccessfulVersionNegotiation(version());
1497 if (debug_visitor_ != nullptr) { 1421 if (debug_visitor_ != nullptr) {
1498 debug_visitor_->OnSuccessfulVersionNegotiation(version()); 1422 debug_visitor_->OnSuccessfulVersionNegotiation(version());
1499 } 1423 }
1500 } 1424 }
1501 } 1425 }
1502 1426
1503 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_); 1427 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_);
1504 1428
1505 if (last_size_ > largest_received_packet_size_) { 1429 if (last_size_ > largest_received_packet_size_) {
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1870 ack_alarm_->Update(clock_->ApproximateNow(), QuicTime::Delta::Zero()); 1794 ack_alarm_->Update(clock_->ApproximateNow(), QuicTime::Delta::Zero());
1871 } 1795 }
1872 } 1796 }
1873 1797
1874 void QuicConnection::SendOrQueuePacket(SerializedPacket* packet) { 1798 void QuicConnection::SendOrQueuePacket(SerializedPacket* packet) {
1875 // The caller of this function is responsible for checking CanWrite(). 1799 // The caller of this function is responsible for checking CanWrite().
1876 if (packet->encrypted_buffer == nullptr) { 1800 if (packet->encrypted_buffer == nullptr) {
1877 QUIC_BUG << "packet.encrypted_buffer == nullptr in to SendOrQueuePacket"; 1801 QUIC_BUG << "packet.encrypted_buffer == nullptr in to SendOrQueuePacket";
1878 return; 1802 return;
1879 } 1803 }
1880 if (version() <= QUIC_VERSION_33) {
1881 sent_entropy_manager_.RecordPacketEntropyHash(packet->packet_number,
1882 packet->entropy_hash);
1883 }
1884 // If there are already queued packets, queue this one immediately to ensure 1804 // If there are already queued packets, queue this one immediately to ensure
1885 // it's written in sequence number order. 1805 // it's written in sequence number order.
1886 if (!queued_packets_.empty() || !WritePacket(packet)) { 1806 if (!queued_packets_.empty() || !WritePacket(packet)) {
1887 // Take ownership of the underlying encrypted packet. 1807 // Take ownership of the underlying encrypted packet.
1888 packet->encrypted_buffer = QuicUtils::CopyBuffer(*packet); 1808 packet->encrypted_buffer = QuicUtils::CopyBuffer(*packet);
1889 queued_packets_.push_back(*packet); 1809 queued_packets_.push_back(*packet);
1890 packet->retransmittable_frames.clear(); 1810 packet->retransmittable_frames.clear();
1891 } 1811 }
1892 1812
1893 QuicUtils::ClearSerializedPacket(packet); 1813 QuicUtils::ClearSerializedPacket(packet);
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 2480
2561 void QuicConnection::CheckIfApplicationLimited() { 2481 void QuicConnection::CheckIfApplicationLimited() {
2562 if (queued_packets_.empty() && 2482 if (queued_packets_.empty() &&
2563 !sent_packet_manager_->HasPendingRetransmissions() && 2483 !sent_packet_manager_->HasPendingRetransmissions() &&
2564 !visitor_->WillingAndAbleToWrite()) { 2484 !visitor_->WillingAndAbleToWrite()) {
2565 sent_packet_manager_->OnApplicationLimited(); 2485 sent_packet_manager_->OnApplicationLimited();
2566 } 2486 }
2567 } 2487 }
2568 2488
2569 } // namespace net 2489 } // 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