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

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

Issue 20227003: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Land Recent QUIC changes Created 7 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_helper_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/quic_connection.h" 5 #include "net/quic/quic_connection.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 return delta <= kMaxPacketGap; 62 return delta <= kMaxPacketGap;
63 } 63 }
64 64
65 } // namespace 65 } // namespace
66 66
67 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") 67 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
68 68
69 QuicConnection::QuicConnection(QuicGuid guid, 69 QuicConnection::QuicConnection(QuicGuid guid,
70 IPEndPoint address, 70 IPEndPoint address,
71 QuicConnectionHelperInterface* helper, 71 QuicConnectionHelperInterface* helper,
72 bool is_server) 72 bool is_server,
73 : framer_(kQuicVersion1, 73 QuicVersion version)
74 : framer_(version,
74 helper->GetClock()->ApproximateNow(), 75 helper->GetClock()->ApproximateNow(),
75 is_server), 76 is_server),
76 helper_(helper), 77 helper_(helper),
77 encryption_level_(ENCRYPTION_NONE), 78 encryption_level_(ENCRYPTION_NONE),
78 clock_(helper->GetClock()), 79 clock_(helper->GetClock()),
79 random_generator_(helper->GetRandomGenerator()), 80 random_generator_(helper->GetRandomGenerator()),
80 guid_(guid), 81 guid_(guid),
81 peer_address_(address), 82 peer_address_(address),
82 largest_seen_packet_with_ack_(0), 83 largest_seen_packet_with_ack_(0),
83 peer_largest_observed_packet_(0), 84 peer_largest_observed_packet_(0),
(...skipping 15 matching lines...) Expand all
99 version_negotiation_state_(START_NEGOTIATION), 100 version_negotiation_state_(START_NEGOTIATION),
100 max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm), 101 max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm),
101 is_server_(is_server), 102 is_server_(is_server),
102 connected_(true), 103 connected_(true),
103 received_truncated_ack_(false), 104 received_truncated_ack_(false),
104 send_ack_in_response_to_packet_(false), 105 send_ack_in_response_to_packet_(false),
105 address_migrating_(false) { 106 address_migrating_(false) {
106 helper_->SetConnection(this); 107 helper_->SetConnection(this);
107 helper_->SetTimeoutAlarm(idle_network_timeout_); 108 helper_->SetTimeoutAlarm(idle_network_timeout_);
108 framer_.set_visitor(this); 109 framer_.set_visitor(this);
109 framer_.set_entropy_calculator(&entropy_manager_); 110 framer_.set_received_entropy_calculator(&received_entropy_manager_);
110 outgoing_ack_.sent_info.least_unacked = 0; 111 outgoing_ack_.sent_info.least_unacked = 0;
111 outgoing_ack_.sent_info.entropy_hash = 0; 112 outgoing_ack_.sent_info.entropy_hash = 0;
112 outgoing_ack_.received_info.largest_observed = 0; 113 outgoing_ack_.received_info.largest_observed = 0;
113 outgoing_ack_.received_info.entropy_hash = 0; 114 outgoing_ack_.received_info.entropy_hash = 0;
114 115
115 /* 116 /*
116 if (FLAGS_fake_packet_loss_percentage > 0) { 117 if (FLAGS_fake_packet_loss_percentage > 0) {
117 int32 seed = RandomBase::WeakSeed32(); 118 int32 seed = RandomBase::WeakSeed32();
118 LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed; 119 LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed;
119 random_.reset(new MTRandom(seed)); 120 random_.reset(new MTRandom(seed));
120 } 121 }
121 */ 122 */
122 } 123 }
123 124
124 QuicConnection::~QuicConnection() { 125 QuicConnection::~QuicConnection() {
125 STLDeleteElements(&undecryptable_packets_); 126 STLDeleteElements(&undecryptable_packets_);
126 STLDeleteValues(&unacked_packets_); 127 STLDeleteValues(&unacked_packets_);
127 STLDeleteValues(&group_map_); 128 STLDeleteValues(&group_map_);
128 for (QueuedPacketList::iterator it = queued_packets_.begin(); 129 for (QueuedPacketList::iterator it = queued_packets_.begin();
129 it != queued_packets_.end(); ++it) { 130 it != queued_packets_.end(); ++it) {
130 delete it->packet; 131 delete it->packet;
131 } 132 }
132 DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_; 133 DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_;
133 } 134 }
134 135
135 bool QuicConnection::SelectMutualVersion( 136 bool QuicConnection::SelectMutualVersion(
136 const QuicTagVector& available_versions) { 137 const QuicVersionVector& available_versions) {
137 // TODO(satyamshekhar): Make this generic. 138 // Try to find the highest mutual version by iterating over supported
138 if (std::find(available_versions.begin(), available_versions.end(), 139 // versions, starting with the highest, and breaking out of the loop once we
139 kQuicVersion1) == available_versions.end()) { 140 // find a matching version in the provided available_versions vector.
140 return false; 141 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
142 const QuicVersion& version = kSupportedQuicVersions[i];
143 if (std::find(available_versions.begin(), available_versions.end(),
144 version) != available_versions.end()) {
145 framer_.set_version(version);
146 return true;
147 }
141 } 148 }
142 149
143 // Right now we only support kQuicVersion1 so it's okay not to 150 return false;
144 // update the framer version. When we start supporting more
145 // versions please update.
146 return true;
147 } 151 }
148 152
149 void QuicConnection::OnError(QuicFramer* framer) { 153 void QuicConnection::OnError(QuicFramer* framer) {
150 // Packets that we cannot decrypt are dropped. 154 // Packets that we cannot decrypt are dropped.
151 // TODO(rch): add stats to measure this. 155 // TODO(rch): add stats to measure this.
152 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { 156 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) {
153 return; 157 return;
154 } 158 }
155 SendConnectionClose(framer->error()); 159 SendConnectionClose(framer->error());
156 } 160 }
157 161
158 void QuicConnection::OnPacket() { 162 void QuicConnection::OnPacket() {
159 } 163 }
160 164
161 void QuicConnection::OnPublicResetPacket( 165 void QuicConnection::OnPublicResetPacket(
162 const QuicPublicResetPacket& packet) { 166 const QuicPublicResetPacket& packet) {
163 if (debug_visitor_) { 167 if (debug_visitor_) {
164 debug_visitor_->OnPublicResetPacket(packet); 168 debug_visitor_->OnPublicResetPacket(packet);
165 } 169 }
166 CloseConnection(QUIC_PUBLIC_RESET, true); 170 CloseConnection(QUIC_PUBLIC_RESET, true);
167 } 171 }
168 172
169 bool QuicConnection::OnProtocolVersionMismatch(QuicTag received_version) { 173 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) {
170 // TODO(satyamshekhar): Implement no server state in this mode. 174 // TODO(satyamshekhar): Implement no server state in this mode.
171 if (!is_server_) { 175 if (!is_server_) {
172 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " 176 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. "
173 << "Closing connection."; 177 << "Closing connection.";
174 CloseConnection(QUIC_INTERNAL_ERROR, false); 178 CloseConnection(QUIC_INTERNAL_ERROR, false);
175 return false; 179 return false;
176 } 180 }
177 DCHECK_NE(version(), received_version); 181 DCHECK_NE(version(), received_version);
178 182
179 if (debug_visitor_) { 183 if (debug_visitor_) {
(...skipping 18 matching lines...) Expand all
198 202
199 case NEGOTIATED_VERSION: 203 case NEGOTIATED_VERSION:
200 // Might be old packets that were sent by the client before the version 204 // Might be old packets that were sent by the client before the version
201 // was negotiated. Drop these. 205 // was negotiated. Drop these.
202 return false; 206 return false;
203 207
204 default: 208 default:
205 DCHECK(false); 209 DCHECK(false);
206 } 210 }
207 211
208 // Right now we only support kQuicVersion1 so it's okay not to
209 // update the framer version. When we start supporting more
210 // versions please update.
211 version_negotiation_state_ = NEGOTIATED_VERSION; 212 version_negotiation_state_ = NEGOTIATED_VERSION;
213
214 // Store the new version.
215 framer_.set_version(received_version);
216
212 // TODO(satyamshekhar): Store the sequence number of this packet and close the 217 // TODO(satyamshekhar): Store the sequence number of this packet and close the
213 // connection if we ever received a packet with incorrect version and whose 218 // connection if we ever received a packet with incorrect version and whose
214 // sequence number is greater. 219 // sequence number is greater.
215 return true; 220 return true;
216 } 221 }
217 222
218 // Handles version negotiation for client connection. 223 // Handles version negotiation for client connection.
219 void QuicConnection::OnVersionNegotiationPacket( 224 void QuicConnection::OnVersionNegotiationPacket(
220 const QuicVersionNegotiationPacket& packet) { 225 const QuicVersionNegotiationPacket& packet) {
221 if (is_server_) { 226 if (is_server_) {
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 << packet_creator_.sequence_number(); 406 << packet_creator_.sequence_number();
402 // We got an error for data we have not sent. Error out. 407 // We got an error for data we have not sent. Error out.
403 return false; 408 return false;
404 } 409 }
405 410
406 if (incoming_ack.received_info.largest_observed < 411 if (incoming_ack.received_info.largest_observed <
407 peer_largest_observed_packet_) { 412 peer_largest_observed_packet_) {
408 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" 413 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:"
409 << incoming_ack.received_info.largest_observed << " vs " 414 << incoming_ack.received_info.largest_observed << " vs "
410 << peer_largest_observed_packet_; 415 << peer_largest_observed_packet_;
411 // We got an error for data we have not sent. Error out. 416 // A new ack has a diminished largest_observed value. Error out.
417 // If this was an old packet, we wouldn't even have checked.
412 return false; 418 return false;
413 } 419 }
414 420
415 // We can't have too many unacked packets, or our ack frames go over 421 // We can't have too many unacked packets, or our ack frames go over
416 // kMaxPacketSize. 422 // kMaxPacketSize.
417 DCHECK_LE(incoming_ack.received_info.missing_packets.size(), 423 DCHECK_LE(incoming_ack.received_info.missing_packets.size(),
418 QuicFramer::GetMaxUnackedPackets(last_header_)); 424 QuicFramer::GetMaxUnackedPackets(last_header_));
419 425
420 if (incoming_ack.sent_info.least_unacked < peer_least_packet_awaiting_ack_) { 426 if (incoming_ack.sent_info.least_unacked < peer_least_packet_awaiting_ack_) {
421 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " 427 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: "
(...skipping 25 matching lines...) Expand all
447 if (!incoming_ack.received_info.missing_packets.empty() && 453 if (!incoming_ack.received_info.missing_packets.empty() &&
448 *incoming_ack.received_info.missing_packets.begin() < 454 *incoming_ack.received_info.missing_packets.begin() <
449 least_packet_awaited_by_peer_) { 455 least_packet_awaited_by_peer_) {
450 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 456 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
451 << *incoming_ack.received_info.missing_packets.begin() 457 << *incoming_ack.received_info.missing_packets.begin()
452 << "smaller than least_packet_awaited_by_peer_: " 458 << "smaller than least_packet_awaited_by_peer_: "
453 << least_packet_awaited_by_peer_; 459 << least_packet_awaited_by_peer_;
454 return false; 460 return false;
455 } 461 }
456 462
457 if (!entropy_manager_.IsValidEntropy( 463 if (!sent_entropy_manager_.IsValidEntropy(
458 incoming_ack.received_info.largest_observed, 464 incoming_ack.received_info.largest_observed,
459 incoming_ack.received_info.missing_packets, 465 incoming_ack.received_info.missing_packets,
460 incoming_ack.received_info.entropy_hash)) { 466 incoming_ack.received_info.entropy_hash)) {
461 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; 467 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy.";
462 return false; 468 return false;
463 } 469 }
464 470
465 return true; 471 return true;
466 } 472 }
467 473
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 incoming_ack.received_info.largest_observed); 543 incoming_ack.received_info.largest_observed);
538 peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed; 544 peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed;
539 545
540 if (incoming_ack.received_info.missing_packets.empty()) { 546 if (incoming_ack.received_info.missing_packets.empty()) {
541 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; 547 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1;
542 } else { 548 } else {
543 least_packet_awaited_by_peer_ = 549 least_packet_awaited_by_peer_ =
544 *(incoming_ack.received_info.missing_packets.begin()); 550 *(incoming_ack.received_info.missing_packets.begin());
545 } 551 }
546 552
547 entropy_manager_.ClearSentEntropyBefore(least_packet_awaited_by_peer_ - 1); 553 sent_entropy_manager_.ClearEntropyBefore(least_packet_awaited_by_peer_ - 1);
548 554
549 SequenceNumberSet acked_packets; 555 SequenceNumberSet acked_packets;
550 HandleAckForSentPackets(incoming_ack, &acked_packets); 556 HandleAckForSentPackets(incoming_ack, &acked_packets);
551 HandleAckForSentFecPackets(incoming_ack, &acked_packets); 557 HandleAckForSentFecPackets(incoming_ack, &acked_packets);
552 558
553 if (acked_packets.size() > 0) { 559 if (acked_packets.size() > 0) {
554 visitor_->OnAck(acked_packets); 560 visitor_->OnAck(acked_packets);
555 } 561 }
556 } 562 }
557 563
(...skipping 14 matching lines...) Expand all
572 DCHECK_LE(peer_least_packet_awaiting_ack_, 578 DCHECK_LE(peer_least_packet_awaiting_ack_,
573 incoming_ack.sent_info.least_unacked); 579 incoming_ack.sent_info.least_unacked);
574 if (incoming_ack.sent_info.least_unacked > peer_least_packet_awaiting_ack_) { 580 if (incoming_ack.sent_info.least_unacked > peer_least_packet_awaiting_ack_) {
575 bool missed_packets = 581 bool missed_packets =
576 DontWaitForPacketsBefore(incoming_ack.sent_info.least_unacked); 582 DontWaitForPacketsBefore(incoming_ack.sent_info.least_unacked);
577 if (missed_packets || incoming_ack.sent_info.least_unacked > 583 if (missed_packets || incoming_ack.sent_info.least_unacked >
578 outgoing_ack_.received_info.largest_observed + 1) { 584 outgoing_ack_.received_info.largest_observed + 1) {
579 DVLOG(1) << ENDPOINT << "Updating entropy hashed since we missed packets"; 585 DVLOG(1) << ENDPOINT << "Updating entropy hashed since we missed packets";
580 // There were some missing packets that we won't ever get now. Recalculate 586 // There were some missing packets that we won't ever get now. Recalculate
581 // the received entropy hash. 587 // the received entropy hash.
582 entropy_manager_.RecalculateReceivedEntropyHash( 588 received_entropy_manager_.RecalculateEntropyHash(
583 incoming_ack.sent_info.least_unacked, 589 incoming_ack.sent_info.least_unacked,
584 incoming_ack.sent_info.entropy_hash); 590 incoming_ack.sent_info.entropy_hash);
585 } 591 }
586 peer_least_packet_awaiting_ack_ = incoming_ack.sent_info.least_unacked; 592 peer_least_packet_awaiting_ack_ = incoming_ack.sent_info.least_unacked;
587 } 593 }
588 DCHECK(outgoing_ack_.received_info.missing_packets.empty() || 594 DCHECK(outgoing_ack_.received_info.missing_packets.empty() ||
589 *outgoing_ack_.received_info.missing_packets.begin() >= 595 *outgoing_ack_.received_info.missing_packets.begin() >=
590 peer_least_packet_awaiting_ack_); 596 peer_least_packet_awaiting_ack_);
591 // Possibly close any FecGroups which are now irrelevant 597 // Possibly close any FecGroups which are now irrelevant
592 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); 598 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 SendAck(); 696 SendAck();
691 } else if (!last_stream_frames_.empty()) { 697 } else if (!last_stream_frames_.empty()) {
692 // TODO(alyssar) this case should really be "if the packet contained any 698 // TODO(alyssar) this case should really be "if the packet contained any
693 // non-ack frame", rather than "if the packet contained a stream frame" 699 // non-ack frame", rather than "if the packet contained a stream frame"
694 helper_->SetAckAlarm(congestion_manager_.DefaultRetransmissionTime()); 700 helper_->SetAckAlarm(congestion_manager_.DefaultRetransmissionTime());
695 } 701 }
696 send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_; 702 send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_;
697 } 703 }
698 704
699 void QuicConnection::SendVersionNegotiationPacket() { 705 void QuicConnection::SendVersionNegotiationPacket() {
700 QuicTagVector supported_versions; 706 QuicVersionVector supported_versions;
701 supported_versions.push_back(kQuicVersion1); 707 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
708 supported_versions.push_back(kSupportedQuicVersions[i]);
709 }
702 QuicEncryptedPacket* encrypted = 710 QuicEncryptedPacket* encrypted =
703 packet_creator_.SerializeVersionNegotiationPacket(supported_versions); 711 packet_creator_.SerializeVersionNegotiationPacket(supported_versions);
704 // TODO(satyamshekhar): implement zero server state negotiation. 712 // TODO(satyamshekhar): implement zero server state negotiation.
705 int error; 713 int error;
706 helper_->WritePacketToWire(*encrypted, &error); 714 helper_->WritePacketToWire(*encrypted, &error);
707 delete encrypted; 715 delete encrypted;
708 } 716 }
709 717
710 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id, 718 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id,
711 base::StringPiece data, 719 base::StringPiece data,
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 DVLOG(1) << ENDPOINT << "Removing " << sequence_number 865 DVLOG(1) << ENDPOINT << "Removing " << sequence_number
858 << " from missing list"; 866 << " from missing list";
859 outgoing_ack_.received_info.missing_packets.erase(sequence_number); 867 outgoing_ack_.received_info.missing_packets.erase(sequence_number);
860 } 868 }
861 if (header.packet_sequence_number > 869 if (header.packet_sequence_number >
862 outgoing_ack_.received_info.largest_observed) { 870 outgoing_ack_.received_info.largest_observed) {
863 outgoing_ack_.received_info.largest_observed = 871 outgoing_ack_.received_info.largest_observed =
864 header.packet_sequence_number; 872 header.packet_sequence_number;
865 time_largest_observed_ = time_of_last_received_packet_; 873 time_largest_observed_ = time_of_last_received_packet_;
866 } 874 }
867 entropy_manager_.RecordReceivedPacketEntropyHash(sequence_number, 875 received_entropy_manager_.RecordPacketEntropyHash(
868 header.entropy_hash); 876 sequence_number, header.entropy_hash);
869 } 877 }
870 878
871 bool QuicConnection::MaybeRetransmitPacketForRTO( 879 bool QuicConnection::MaybeRetransmitPacketForRTO(
872 QuicPacketSequenceNumber sequence_number) { 880 QuicPacketSequenceNumber sequence_number) {
873 DCHECK_EQ(ContainsKey(unacked_packets_, sequence_number), 881 DCHECK_EQ(ContainsKey(unacked_packets_, sequence_number),
874 ContainsKey(retransmission_map_, sequence_number)); 882 ContainsKey(retransmission_map_, sequence_number));
875 883
876 if (!ContainsKey(unacked_packets_, sequence_number)) { 884 if (!ContainsKey(unacked_packets_, sequence_number)) {
877 DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number 885 DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number
878 << " but it has been acked or already retransmitted with" 886 << " but it has been acked or already retransmitted with"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 return true; 1161 return true;
1154 } 1162 }
1155 1163
1156 int QuicConnection::WritePacketToWire(QuicPacketSequenceNumber sequence_number, 1164 int QuicConnection::WritePacketToWire(QuicPacketSequenceNumber sequence_number,
1157 EncryptionLevel level, 1165 EncryptionLevel level,
1158 const QuicEncryptedPacket& packet, 1166 const QuicEncryptedPacket& packet,
1159 int* error) { 1167 int* error) {
1160 int bytes_written = helper_->WritePacketToWire(packet, error); 1168 int bytes_written = helper_->WritePacketToWire(packet, error);
1161 if (debug_visitor_) { 1169 if (debug_visitor_) {
1162 // WritePacketToWire returned -1, then |error| will be populated with 1170 // WritePacketToWire returned -1, then |error| will be populated with
1163 // a NetErrorCode, which we want to pass along to the visitor. 1171 // an error code, which we want to pass along to the visitor.
1164 debug_visitor_->OnPacketSent(sequence_number, level, packet, 1172 debug_visitor_->OnPacketSent(sequence_number, level, packet,
1165 bytes_written == -1 ? *error : bytes_written); 1173 bytes_written == -1 ? *error : bytes_written);
1166 } 1174 }
1167 return bytes_written; 1175 return bytes_written;
1168 } 1176 }
1169 1177
1170 bool QuicConnection::OnSerializedPacket( 1178 bool QuicConnection::OnSerializedPacket(
1171 const SerializedPacket& serialized_packet) { 1179 const SerializedPacket& serialized_packet) {
1172 if (serialized_packet.retransmittable_frames != NULL) { 1180 if (serialized_packet.retransmittable_frames != NULL) {
1173 DCHECK(unacked_packets_.empty() || 1181 DCHECK(unacked_packets_.empty() ||
(...skipping 22 matching lines...) Expand all
1196 serialized_packet.retransmittable_frames != NULL ? 1204 serialized_packet.retransmittable_frames != NULL ?
1197 HAS_RETRANSMITTABLE_DATA : 1205 HAS_RETRANSMITTABLE_DATA :
1198 NO_RETRANSMITTABLE_DATA); 1206 NO_RETRANSMITTABLE_DATA);
1199 } 1207 }
1200 1208
1201 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, 1209 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
1202 QuicPacketSequenceNumber sequence_number, 1210 QuicPacketSequenceNumber sequence_number,
1203 QuicPacket* packet, 1211 QuicPacket* packet,
1204 QuicPacketEntropyHash entropy_hash, 1212 QuicPacketEntropyHash entropy_hash,
1205 HasRetransmittableData retransmittable) { 1213 HasRetransmittableData retransmittable) {
1206 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash); 1214 sent_entropy_manager_.RecordPacketEntropyHash(sequence_number, entropy_hash);
1207 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) { 1215 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) {
1208 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level, 1216 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level,
1209 retransmittable)); 1217 retransmittable));
1210 return false; 1218 return false;
1211 } 1219 }
1212 return true; 1220 return true;
1213 } 1221 }
1214 1222
1215 bool QuicConnection::ShouldSimulateLostPacket() { 1223 bool QuicConnection::ShouldSimulateLostPacket() {
1216 // TODO(rch): enable this 1224 // TODO(rch): enable this
1217 return false; 1225 return false;
1218 /* 1226 /*
1219 return FLAGS_fake_packet_loss_percentage > 0 && 1227 return FLAGS_fake_packet_loss_percentage > 0 &&
1220 random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage; 1228 random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage;
1221 */ 1229 */
1222 } 1230 }
1223 1231
1224 void QuicConnection::UpdateOutgoingAck() { 1232 void QuicConnection::UpdateOutgoingAck() {
1225 if (!unacked_packets_.empty()) { 1233 if (!unacked_packets_.empty()) {
1226 outgoing_ack_.sent_info.least_unacked = unacked_packets_.begin()->first; 1234 outgoing_ack_.sent_info.least_unacked = unacked_packets_.begin()->first;
1227 } else { 1235 } else {
1228 // If there are no unacked packets, set the least unacked packet to 1236 // If there are no unacked packets, set the least unacked packet to
1229 // sequence_number() + 1 since that will be the sequence number of this 1237 // sequence_number() + 1 since that will be the sequence number of this
1230 // ack packet whenever it is sent. 1238 // ack packet whenever it is sent.
1231 outgoing_ack_.sent_info.least_unacked = 1239 outgoing_ack_.sent_info.least_unacked =
1232 packet_creator_.sequence_number() + 1; 1240 packet_creator_.sequence_number() + 1;
1233 } 1241 }
1234 outgoing_ack_.sent_info.entropy_hash = entropy_manager_.SentEntropyHash( 1242 outgoing_ack_.sent_info.entropy_hash = sent_entropy_manager_.EntropyHash(
1235 outgoing_ack_.sent_info.least_unacked - 1); 1243 outgoing_ack_.sent_info.least_unacked - 1);
1236 outgoing_ack_.received_info.entropy_hash = 1244 outgoing_ack_.received_info.entropy_hash =
1237 entropy_manager_.ReceivedEntropyHash( 1245 received_entropy_manager_.EntropyHash(
1238 outgoing_ack_.received_info.largest_observed); 1246 outgoing_ack_.received_info.largest_observed);
1239 } 1247 }
1240 1248
1241 void QuicConnection::SendAck() { 1249 void QuicConnection::SendAck() {
1242 helper_->ClearAckAlarm(); 1250 helper_->ClearAckAlarm();
1243 UpdateOutgoingAck(); 1251 UpdateOutgoingAck();
1244 DVLOG(1) << ENDPOINT << "Sending ack: " << outgoing_ack_; 1252 DVLOG(1) << ENDPOINT << "Sending ack: " << outgoing_ack_;
1245 1253
1246 // TODO(rch): delay this until the CreateFeedbackFrame 1254 // TODO(rch): delay this until the CreateFeedbackFrame
1247 // method is invoked. This requires changes SetShouldSendAck 1255 // method is invoked. This requires changes SetShouldSendAck
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 << details; 1447 << details;
1440 QuicConnectionCloseFrame frame; 1448 QuicConnectionCloseFrame frame;
1441 frame.error_code = error; 1449 frame.error_code = error;
1442 frame.error_details = details; 1450 frame.error_details = details;
1443 UpdateOutgoingAck(); 1451 UpdateOutgoingAck();
1444 frame.ack_frame = outgoing_ack_; 1452 frame.ack_frame = outgoing_ack_;
1445 1453
1446 SerializedPacket serialized_packet = 1454 SerializedPacket serialized_packet =
1447 packet_creator_.SerializeConnectionClose(&frame); 1455 packet_creator_.SerializeConnectionClose(&frame);
1448 1456
1449 // We need to update the sent entrophy hash for all sent packets. 1457 // We need to update the sent entropy hash for all sent packets.
1450 entropy_manager_.RecordSentPacketEntropyHash( 1458 sent_entropy_manager_.RecordPacketEntropyHash(
1451 serialized_packet.sequence_number, 1459 serialized_packet.sequence_number,
1452 serialized_packet.entropy_hash); 1460 serialized_packet.entropy_hash);
1453 1461
1454 WritePacket(encryption_level_, 1462 WritePacket(encryption_level_,
1455 serialized_packet.sequence_number, 1463 serialized_packet.sequence_number,
1456 serialized_packet.packet, 1464 serialized_packet.packet,
1457 serialized_packet.retransmittable_frames != NULL ? 1465 serialized_packet.retransmittable_frames != NULL ?
1458 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, 1466 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA,
1459 FORCE); 1467 FORCE);
1460 } 1468 }
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1564 if (connection_timeout < timeout) { 1572 if (connection_timeout < timeout) {
1565 timeout = connection_timeout; 1573 timeout = connection_timeout;
1566 } 1574 }
1567 } 1575 }
1568 1576
1569 helper_->SetTimeoutAlarm(timeout); 1577 helper_->SetTimeoutAlarm(timeout);
1570 return false; 1578 return false;
1571 } 1579 }
1572 1580
1573 } // namespace net 1581 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_helper_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698