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

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

Issue 1811043002: Landing Recent QUIC changes until 2016-03-15 16:26 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add an export clause. Created 4 years, 9 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/quic_connection.h ('k') | net/quic/quic_connection_stats.h » ('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 <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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 per_packet_options_(nullptr), 216 per_packet_options_(nullptr),
217 writer_(writer), 217 writer_(writer),
218 owns_writer_(owns_writer), 218 owns_writer_(owns_writer),
219 encryption_level_(ENCRYPTION_NONE), 219 encryption_level_(ENCRYPTION_NONE),
220 has_forward_secure_encrypter_(false), 220 has_forward_secure_encrypter_(false),
221 first_required_forward_secure_packet_(0), 221 first_required_forward_secure_packet_(0),
222 clock_(helper->GetClock()), 222 clock_(helper->GetClock()),
223 random_generator_(helper->GetRandomGenerator()), 223 random_generator_(helper->GetRandomGenerator()),
224 connection_id_(connection_id), 224 connection_id_(connection_id),
225 peer_address_(address), 225 peer_address_(address),
226 migrating_peer_port_(0),
227 last_packet_decrypted_(false), 226 last_packet_decrypted_(false),
228 last_size_(0), 227 last_size_(0),
229 current_packet_data_(nullptr), 228 current_packet_data_(nullptr),
230 last_decrypted_packet_level_(ENCRYPTION_NONE), 229 last_decrypted_packet_level_(ENCRYPTION_NONE),
231 should_last_packet_instigate_acks_(false), 230 should_last_packet_instigate_acks_(false),
232 largest_seen_packet_with_ack_(0), 231 largest_seen_packet_with_ack_(0),
233 largest_seen_packet_with_stop_waiting_(0), 232 largest_seen_packet_with_stop_waiting_(0),
234 max_undecryptable_packets_(0), 233 max_undecryptable_packets_(0),
235 pending_version_negotiation_packet_(false), 234 pending_version_negotiation_packet_(false),
236 save_crypto_packets_as_termination_packets_(false), 235 save_crypto_packets_as_termination_packets_(false),
237 silent_close_enabled_(false), 236 silent_close_enabled_(false),
237 close_connection_after_five_rtos_(false),
238 received_packet_manager_(&stats_), 238 received_packet_manager_(&stats_),
239 ack_queued_(false), 239 ack_queued_(false),
240 num_retransmittable_packets_received_since_last_ack_sent_(0), 240 num_retransmittable_packets_received_since_last_ack_sent_(0),
241 last_ack_had_missing_packets_(false), 241 last_ack_had_missing_packets_(false),
242 num_packets_received_since_last_ack_sent_(0), 242 num_packets_received_since_last_ack_sent_(0),
243 stop_waiting_count_(0), 243 stop_waiting_count_(0),
244 ack_mode_(TCP_ACKING), 244 ack_mode_(TCP_ACKING),
245 delay_setting_retransmission_alarm_(false), 245 delay_setting_retransmission_alarm_(false),
246 pending_retransmission_alarm_(false), 246 pending_retransmission_alarm_(false),
247 defer_send_in_response_to_packets_(false), 247 defer_send_in_response_to_packets_(false),
(...skipping 26 matching lines...) Expand all
274 perspective, 274 perspective,
275 kDefaultPathId, 275 kDefaultPathId,
276 clock_, 276 clock_,
277 &stats_, 277 &stats_,
278 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic, 278 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic,
279 FLAGS_quic_use_time_loss_detection ? kTime : kNack, 279 FLAGS_quic_use_time_loss_detection ? kTime : kNack,
280 /*delegate=*/nullptr), 280 /*delegate=*/nullptr),
281 version_negotiation_state_(START_NEGOTIATION), 281 version_negotiation_state_(START_NEGOTIATION),
282 perspective_(perspective), 282 perspective_(perspective),
283 connected_(true), 283 connected_(true),
284 peer_ip_changed_(false),
285 peer_port_changed_(false),
286 self_ip_changed_(false),
287 self_port_changed_(false),
288 can_truncate_connection_ids_(true), 284 can_truncate_connection_ids_(true),
289 mtu_discovery_target_(0), 285 mtu_discovery_target_(0),
290 mtu_probe_count_(0), 286 mtu_probe_count_(0),
291 packets_between_mtu_probes_(kPacketsBetweenMtuProbesBase), 287 packets_between_mtu_probes_(kPacketsBetweenMtuProbesBase),
292 next_mtu_probe_at_(kPacketsBetweenMtuProbesBase), 288 next_mtu_probe_at_(kPacketsBetweenMtuProbesBase),
293 largest_received_packet_size_(0), 289 largest_received_packet_size_(0),
294 goaway_sent_(false), 290 goaway_sent_(false),
295 goaway_received_(false), 291 goaway_received_(false),
296 multipath_enabled_(false) { 292 multipath_enabled_(false) {
297 DVLOG(1) << ENDPOINT 293 DVLOG(1) << ENDPOINT
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 if (debug_visitor_ != nullptr) { 359 if (debug_visitor_ != nullptr) {
364 debug_visitor_->OnSetFromConfig(config); 360 debug_visitor_->OnSetFromConfig(config);
365 } 361 }
366 if (config.HasClientSentConnectionOption(kACKD, perspective_)) { 362 if (config.HasClientSentConnectionOption(kACKD, perspective_)) {
367 ack_mode_ = ACK_DECIMATION; 363 ack_mode_ = ACK_DECIMATION;
368 } 364 }
369 if (FLAGS_quic_ack_decimation2 && 365 if (FLAGS_quic_ack_decimation2 &&
370 config.HasClientSentConnectionOption(kAKD2, perspective_)) { 366 config.HasClientSentConnectionOption(kAKD2, perspective_)) {
371 ack_mode_ = ACK_DECIMATION_WITH_REORDERING; 367 ack_mode_ = ACK_DECIMATION_WITH_REORDERING;
372 } 368 }
369 if (FLAGS_quic_enable_rto_timeout &&
370 config.HasClientSentConnectionOption(k5RTO, perspective_)) {
371 close_connection_after_five_rtos_ = true;
372 }
373 } 373 }
374 374
375 void QuicConnection::OnSendConnectionState( 375 void QuicConnection::OnSendConnectionState(
376 const CachedNetworkParameters& cached_network_params) { 376 const CachedNetworkParameters& cached_network_params) {
377 if (debug_visitor_ != nullptr) { 377 if (debug_visitor_ != nullptr) {
378 debug_visitor_->OnSendConnectionState(cached_network_params); 378 debug_visitor_->OnSendConnectionState(cached_network_params);
379 } 379 }
380 } 380 }
381 381
382 void QuicConnection::OnReceiveConnectionState( 382 void QuicConnection::OnReceiveConnectionState(
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 573
574 // Multipath is not enabled, but a packet with multipath flag on is received. 574 // Multipath is not enabled, but a packet with multipath flag on is received.
575 if (!multipath_enabled_ && header.public_header.multipath_flag) { 575 if (!multipath_enabled_ && header.public_header.multipath_flag) {
576 LOG(DFATAL) << "Received a packet with multipath flag on when multipath is " 576 LOG(DFATAL) << "Received a packet with multipath flag on when multipath is "
577 "not enabled."; 577 "not enabled.";
578 SendConnectionCloseWithDetails(QUIC_BAD_MULTIPATH_FLAG, 578 SendConnectionCloseWithDetails(QUIC_BAD_MULTIPATH_FLAG,
579 "receive a packet with multipath flag on " 579 "receive a packet with multipath flag on "
580 "when multipath is not enabled."); 580 "when multipath is not enabled.");
581 return false; 581 return false;
582 } 582 }
583 if (!packet_generator_.IsPendingPacketEmpty()) {
584 QUIC_BUG << "Pending frames must be serialized before incoming packets are "
585 << "processed, because that may change a queued ack frame.";
586 SendConnectionCloseWithDetails(QUIC_INTERNAL_ERROR,
587 "Should not process packets while sending.");
588 return false;
589 }
583 590
584 // If this packet has already been seen, or the sender has told us that it 591 // If this packet has already been seen, or the sender has told us that it
585 // will not be retransmitted, then stop processing the packet. 592 // will not be retransmitted, then stop processing the packet.
586 if (!received_packet_manager_.IsAwaitingPacket(header.packet_number)) { 593 if (!received_packet_manager_.IsAwaitingPacket(header.packet_number)) {
587 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number 594 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number
588 << " no longer being waited for. Discarding."; 595 << " no longer being waited for. Discarding.";
589 if (debug_visitor_ != nullptr) { 596 if (debug_visitor_ != nullptr) {
590 debug_visitor_->OnDuplicatePacket(header.packet_number); 597 debug_visitor_->OnDuplicatePacket(header.packet_number);
591 } 598 }
592 ++stats_.packets_dropped; 599 ++stats_.packets_dropped;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 DVLOG(1) << ENDPOINT << "Received an old ack frame: ignoring"; 669 DVLOG(1) << ENDPOINT << "Received an old ack frame: ignoring";
663 return true; 670 return true;
664 } 671 }
665 672
666 const char* error = ValidateAckFrame(incoming_ack); 673 const char* error = ValidateAckFrame(incoming_ack);
667 if (error != nullptr) { 674 if (error != nullptr) {
668 SendConnectionCloseWithDetails(QUIC_INVALID_ACK_DATA, error); 675 SendConnectionCloseWithDetails(QUIC_INVALID_ACK_DATA, error);
669 return false; 676 return false;
670 } 677 }
671 678
672 if (FLAGS_quic_respect_send_alarm2 && send_alarm_->IsSet()) { 679 if (send_alarm_->IsSet()) {
673 send_alarm_->Cancel(); 680 send_alarm_->Cancel();
674 } 681 }
675 ProcessAckFrame(incoming_ack); 682 ProcessAckFrame(incoming_ack);
676 if (incoming_ack.is_truncated) { 683 if (incoming_ack.is_truncated) {
677 should_last_packet_instigate_acks_ = true; 684 should_last_packet_instigate_acks_ = true;
678 } 685 }
679 // If the peer is still waiting for a packet that we are no longer planning to 686 // If the peer is still waiting for a packet that we are no longer planning to
680 // send, send an ack to raise the high water mark. 687 // send, send an ack to raise the high water mark.
681 if (!incoming_ack.missing_packets.Empty() && 688 if (!incoming_ack.missing_packets.Empty() &&
682 GetLeastUnacked() > incoming_ack.missing_packets.Min()) { 689 GetLeastUnacked() > incoming_ack.missing_packets.Min()) {
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS, 1024 QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS,
1018 StringPrintf("More than %" PRIu64 " outstanding.", kMaxTrackedPackets)); 1025 StringPrintf("More than %" PRIu64 " outstanding.", kMaxTrackedPackets));
1019 } 1026 }
1020 } 1027 }
1021 1028
1022 void QuicConnection::PopulateAckFrame(QuicAckFrame* ack) { 1029 void QuicConnection::PopulateAckFrame(QuicAckFrame* ack) {
1023 received_packet_manager_.UpdateReceivedPacketInfo(ack, 1030 received_packet_manager_.UpdateReceivedPacketInfo(ack,
1024 clock_->ApproximateNow()); 1031 clock_->ApproximateNow());
1025 } 1032 }
1026 1033
1034 const QuicFrame QuicConnection::GetUpdatedAckFrame() {
1035 return received_packet_manager_.GetUpdatedAckFrame(clock_->ApproximateNow());
1036 }
1037
1027 void QuicConnection::PopulateStopWaitingFrame( 1038 void QuicConnection::PopulateStopWaitingFrame(
1028 QuicStopWaitingFrame* stop_waiting) { 1039 QuicStopWaitingFrame* stop_waiting) {
1029 stop_waiting->least_unacked = GetLeastUnacked(); 1040 stop_waiting->least_unacked = GetLeastUnacked();
1030 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy( 1041 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
1031 stop_waiting->least_unacked - 1); 1042 stop_waiting->least_unacked - 1);
1032 } 1043 }
1033 1044
1034 QuicPacketNumber QuicConnection::GetLeastUnacked() const { 1045 QuicPacketNumber QuicConnection::GetLeastUnacked() const {
1035 return sent_packet_manager_.GetLeastUnacked(); 1046 return sent_packet_manager_.GetLeastUnacked();
1036 } 1047 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 // SHLO from the server, leading to two different decrypters at the server.) 1109 // SHLO from the server, leading to two different decrypters at the server.)
1099 // 1110 //
1100 // TODO(jri): Note that ConsumeData may cause a response packet to be sent. 1111 // TODO(jri): Note that ConsumeData may cause a response packet to be sent.
1101 // We may end up sending stale ack information if there are undecryptable 1112 // We may end up sending stale ack information if there are undecryptable
1102 // packets hanging around and/or there are revivable packets which may get 1113 // packets hanging around and/or there are revivable packets which may get
1103 // handled after this packet is sent. Change ScopedPacketBundler to do the 1114 // handled after this packet is sent. Change ScopedPacketBundler to do the
1104 // right thing: check ack_queued_, and then check undecryptable packets and 1115 // right thing: check ack_queued_, and then check undecryptable packets and
1105 // also if there is possibility of revival. Only bundle an ack if there's no 1116 // also if there is possibility of revival. Only bundle an ack if there's no
1106 // processing left that may cause received_info_ to change. 1117 // processing left that may cause received_info_ to change.
1107 ScopedRetransmissionScheduler alarm_delayer(this); 1118 ScopedRetransmissionScheduler alarm_delayer(this);
1108 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1119 ScopedPacketBundler ack_bundler(this, SEND_ACK_IF_PENDING);
1109 return packet_generator_.ConsumeData(id, iov, offset, fin, listener); 1120 return packet_generator_.ConsumeData(id, iov, offset, fin, listener);
1110 } 1121 }
1111 1122
1112 void QuicConnection::SendRstStream(QuicStreamId id, 1123 void QuicConnection::SendRstStream(QuicStreamId id,
1113 QuicRstStreamErrorCode error, 1124 QuicRstStreamErrorCode error,
1114 QuicStreamOffset bytes_written) { 1125 QuicStreamOffset bytes_written) {
1115 // Opportunistically bundle an ack with this outgoing packet. 1126 // Opportunistically bundle an ack with this outgoing packet.
1116 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1127 ScopedPacketBundler ack_bundler(this, SEND_ACK_IF_PENDING);
1117 packet_generator_.AddControlFrame(QuicFrame(new QuicRstStreamFrame( 1128 packet_generator_.AddControlFrame(QuicFrame(new QuicRstStreamFrame(
1118 id, AdjustErrorForVersion(error, version()), bytes_written))); 1129 id, AdjustErrorForVersion(error, version()), bytes_written)));
1119 1130
1120 if (error == QUIC_STREAM_NO_ERROR && version() > QUIC_VERSION_28) { 1131 if (error == QUIC_STREAM_NO_ERROR && version() > QUIC_VERSION_28) {
1121 // All data for streams which are reset with QUIC_STREAM_NO_ERROR must 1132 // All data for streams which are reset with QUIC_STREAM_NO_ERROR must
1122 // be received by the peer. 1133 // be received by the peer.
1123 return; 1134 return;
1124 } 1135 }
1125 1136
1126 sent_packet_manager_.CancelRetransmissionsForStream(id); 1137 sent_packet_manager_.CancelRetransmissionsForStream(id);
(...skipping 13 matching lines...) Expand all
1140 } 1151 }
1141 delete[] packet_iterator->encrypted_buffer; 1152 delete[] packet_iterator->encrypted_buffer;
1142 QuicUtils::ClearSerializedPacket(&(*packet_iterator)); 1153 QuicUtils::ClearSerializedPacket(&(*packet_iterator));
1143 packet_iterator = queued_packets_.erase(packet_iterator); 1154 packet_iterator = queued_packets_.erase(packet_iterator);
1144 } 1155 }
1145 } 1156 }
1146 1157
1147 void QuicConnection::SendWindowUpdate(QuicStreamId id, 1158 void QuicConnection::SendWindowUpdate(QuicStreamId id,
1148 QuicStreamOffset byte_offset) { 1159 QuicStreamOffset byte_offset) {
1149 // Opportunistically bundle an ack with this outgoing packet. 1160 // Opportunistically bundle an ack with this outgoing packet.
1150 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1161 ScopedPacketBundler ack_bundler(this, SEND_ACK_IF_PENDING);
1151 packet_generator_.AddControlFrame( 1162 packet_generator_.AddControlFrame(
1152 QuicFrame(new QuicWindowUpdateFrame(id, byte_offset))); 1163 QuicFrame(new QuicWindowUpdateFrame(id, byte_offset)));
1153 } 1164 }
1154 1165
1155 void QuicConnection::SendBlocked(QuicStreamId id) { 1166 void QuicConnection::SendBlocked(QuicStreamId id) {
1156 // Opportunistically bundle an ack with this outgoing packet. 1167 // Opportunistically bundle an ack with this outgoing packet.
1157 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1168 ScopedPacketBundler ack_bundler(this, SEND_ACK_IF_PENDING);
1158 packet_generator_.AddControlFrame(QuicFrame(new QuicBlockedFrame(id))); 1169 packet_generator_.AddControlFrame(QuicFrame(new QuicBlockedFrame(id)));
1159 } 1170 }
1160 1171
1161 void QuicConnection::SendPathClose(QuicPathId path_id) { 1172 void QuicConnection::SendPathClose(QuicPathId path_id) {
1162 // Opportunistically bundle an ack with this outgoing packet. 1173 // Opportunistically bundle an ack with this outgoing packet.
1163 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1174 ScopedPacketBundler ack_bundler(this, SEND_ACK_IF_PENDING);
1164 packet_generator_.AddControlFrame(QuicFrame(new QuicPathCloseFrame(path_id))); 1175 packet_generator_.AddControlFrame(QuicFrame(new QuicPathCloseFrame(path_id)));
1165 OnPathClosed(path_id); 1176 OnPathClosed(path_id);
1166 } 1177 }
1167 1178
1168 const QuicConnectionStats& QuicConnection::GetStats() { 1179 const QuicConnectionStats& QuicConnection::GetStats() {
1169 const RttStats* rtt_stats = sent_packet_manager_.GetRttStats(); 1180 const RttStats* rtt_stats = sent_packet_manager_.GetRttStats();
1170 1181
1171 // Update rtt and estimated bandwidth. 1182 // Update rtt and estimated bandwidth.
1172 QuicTime::Delta min_rtt = rtt_stats->min_rtt(); 1183 QuicTime::Delta min_rtt = rtt_stats->min_rtt();
1173 if (min_rtt.IsZero()) { 1184 if (min_rtt.IsZero()) {
(...skipping 20 matching lines...) Expand all
1194 const QuicEncryptedPacket& packet) { 1205 const QuicEncryptedPacket& packet) {
1195 if (!connected_) { 1206 if (!connected_) {
1196 return; 1207 return;
1197 } 1208 }
1198 if (debug_visitor_ != nullptr) { 1209 if (debug_visitor_ != nullptr) {
1199 debug_visitor_->OnPacketReceived(self_address, peer_address, packet); 1210 debug_visitor_->OnPacketReceived(self_address, peer_address, packet);
1200 } 1211 }
1201 last_size_ = packet.length(); 1212 last_size_ = packet.length();
1202 current_packet_data_ = packet.data(); 1213 current_packet_data_ = packet.data();
1203 1214
1204 if (FLAGS_check_peer_address_change_after_decryption) { 1215 last_packet_destination_address_ = self_address;
1205 last_packet_destination_address_ = self_address; 1216 last_packet_source_address_ = peer_address;
1206 last_packet_source_address_ = peer_address; 1217 if (!IsInitializedIPEndPoint(self_address_)) {
1207 if (!IsInitializedIPEndPoint(self_address_)) { 1218 self_address_ = last_packet_destination_address_;
1208 self_address_ = last_packet_destination_address_; 1219 }
1209 } 1220 if (!IsInitializedIPEndPoint(peer_address_)) {
1210 if (!IsInitializedIPEndPoint(peer_address_)) { 1221 peer_address_ = last_packet_source_address_;
1211 peer_address_ = last_packet_source_address_;
1212 }
1213 } else {
1214 CheckForAddressMigration(self_address, peer_address);
1215 } 1222 }
1216 1223
1217 stats_.bytes_received += packet.length(); 1224 stats_.bytes_received += packet.length();
1218 ++stats_.packets_received; 1225 ++stats_.packets_received;
1219 1226
1220 ScopedRetransmissionScheduler alarm_delayer(this); 1227 ScopedRetransmissionScheduler alarm_delayer(this);
1221 if (!framer_.ProcessPacket(packet)) { 1228 if (!framer_.ProcessPacket(packet)) {
1222 // If we are unable to decrypt this packet, it might be 1229 // If we are unable to decrypt this packet, it might be
1223 // because the CHLO or SHLO packet was lost. 1230 // because the CHLO or SHLO packet was lost.
1224 if (framer_.error() == QUIC_DECRYPTION_FAILURE) { 1231 if (framer_.error() == QUIC_DECRYPTION_FAILURE) {
(...skipping 10 matching lines...) Expand all
1235 return; 1242 return;
1236 } 1243 }
1237 1244
1238 ++stats_.packets_processed; 1245 ++stats_.packets_processed;
1239 MaybeProcessUndecryptablePackets(); 1246 MaybeProcessUndecryptablePackets();
1240 MaybeSendInResponseToPacket(); 1247 MaybeSendInResponseToPacket();
1241 SetPingAlarm(); 1248 SetPingAlarm();
1242 current_packet_data_ = nullptr; 1249 current_packet_data_ = nullptr;
1243 } 1250 }
1244 1251
1245 void QuicConnection::CheckForAddressMigration(const IPEndPoint& self_address,
1246 const IPEndPoint& peer_address) {
1247 peer_ip_changed_ = false;
1248 peer_port_changed_ = false;
1249 self_ip_changed_ = false;
1250 self_port_changed_ = false;
1251
1252 if (peer_address_.address().empty()) {
1253 peer_address_ = peer_address;
1254 }
1255 if (self_address_.address().empty()) {
1256 self_address_ = self_address;
1257 }
1258
1259 if (!peer_address.address().empty() && !peer_address_.address().empty()) {
1260 peer_ip_changed_ = (peer_address.address() != peer_address_.address());
1261 peer_port_changed_ = (peer_address.port() != peer_address_.port());
1262
1263 // Store in case we want to migrate connection in ProcessValidatedPacket.
1264 migrating_peer_ip_ = peer_address.address();
1265 migrating_peer_port_ = peer_address.port();
1266 }
1267
1268 if (!self_address.address().empty() && !self_address_.address().empty()) {
1269 self_ip_changed_ = (self_address.address() != self_address_.address());
1270 self_port_changed_ = (self_address.port() != self_address_.port());
1271 }
1272 }
1273
1274 void QuicConnection::OnCanWrite() { 1252 void QuicConnection::OnCanWrite() {
1275 DCHECK(!writer_->IsWriteBlocked()); 1253 DCHECK(!writer_->IsWriteBlocked());
1276 1254
1277 WriteQueuedPackets(); 1255 WriteQueuedPackets();
1278 WritePendingRetransmissions(); 1256 WritePendingRetransmissions();
1279 1257
1280 // Sending queued packets may have caused the socket to become write blocked, 1258 // Sending queued packets may have caused the socket to become write blocked,
1281 // or the congestion manager to prohibit sending. If we've sent everything 1259 // or the congestion manager to prohibit sending. If we've sent everything
1282 // we had queued and we're still not blocked, let the visitor know it can 1260 // we had queued and we're still not blocked, let the visitor know it can
1283 // write more. 1261 // write more.
1284 if (!CanWrite(HAS_RETRANSMITTABLE_DATA)) { 1262 if (!CanWrite(HAS_RETRANSMITTABLE_DATA)) {
1285 return; 1263 return;
1286 } 1264 }
1287 1265
1288 { // Limit the scope of the bundler. ACK inclusion happens elsewhere. 1266 {
1289 ScopedPacketBundler bundler(this, NO_ACK); 1267 ScopedPacketBundler bundler(this, SEND_ACK_IF_QUEUED);
1290 visitor_->OnCanWrite(); 1268 visitor_->OnCanWrite();
1291 visitor_->PostProcessAfterData(); 1269 visitor_->PostProcessAfterData();
1292 } 1270 }
1293 1271
1294 // After the visitor writes, it may have caused the socket to become write 1272 // After the visitor writes, it may have caused the socket to become write
1295 // blocked or the congestion manager to prohibit sending, so check again. 1273 // blocked or the congestion manager to prohibit sending, so check again.
1296 if (visitor_->WillingAndAbleToWrite() && !resume_writes_alarm_->IsSet() && 1274 if (visitor_->WillingAndAbleToWrite() && !resume_writes_alarm_->IsSet() &&
1297 CanWrite(HAS_RETRANSMITTABLE_DATA)) { 1275 CanWrite(HAS_RETRANSMITTABLE_DATA)) {
1298 // We're not write blocked, but some stream didn't write out all of its 1276 // We're not write blocked, but some stream didn't write out all of its
1299 // bytes. Register for 'immediate' resumption so we'll keep writing after 1277 // bytes. Register for 'immediate' resumption so we'll keep writing after
1300 // other connections and events have had a chance to use the thread. 1278 // other connections and events have had a chance to use the thread.
1301 resume_writes_alarm_->Set(clock_->ApproximateNow()); 1279 resume_writes_alarm_->Set(clock_->ApproximateNow());
1302 } 1280 }
1303 } 1281 }
1304 1282
1305 void QuicConnection::WriteIfNotBlocked() { 1283 void QuicConnection::WriteIfNotBlocked() {
1306 if (!writer_->IsWriteBlocked()) { 1284 if (!writer_->IsWriteBlocked()) {
1307 OnCanWrite(); 1285 OnCanWrite();
1308 } 1286 }
1309 } 1287 }
1310 1288
1311 void QuicConnection::WriteAndBundleAcksIfNotBlocked() { 1289 void QuicConnection::WriteAndBundleAcksIfNotBlocked() {
1312 if (!writer_->IsWriteBlocked()) { 1290 if (!writer_->IsWriteBlocked()) {
1313 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK); 1291 ScopedPacketBundler bundler(this, SEND_ACK_IF_QUEUED);
1314 OnCanWrite(); 1292 OnCanWrite();
1315 } 1293 }
1316 } 1294 }
1317 1295
1318 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) { 1296 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) {
1319 if (header.fec_flag) { 1297 if (header.fec_flag) {
1320 // Drop any FEC packet. 1298 // Drop any FEC packet.
1321 return false; 1299 return false;
1322 } 1300 }
1323 1301
1324 if (FLAGS_check_peer_address_change_after_decryption) { 1302 if (perspective_ == Perspective::IS_SERVER &&
1325 if (perspective_ == Perspective::IS_SERVER && 1303 IsInitializedIPEndPoint(self_address_) &&
1326 IsInitializedIPEndPoint(self_address_) && 1304 IsInitializedIPEndPoint(last_packet_destination_address_) &&
1327 IsInitializedIPEndPoint(last_packet_destination_address_) && 1305 (!(self_address_ == last_packet_destination_address_))) {
1328 (!(self_address_ == last_packet_destination_address_))) { 1306 SendConnectionCloseWithDetails(
1329 SendConnectionCloseWithDetails( 1307 QUIC_ERROR_MIGRATING_ADDRESS,
1330 QUIC_ERROR_MIGRATING_ADDRESS, 1308 "Self address migration is not supported at the server.");
1331 "Self address migration is not supported at the server."); 1309 return false;
1332 return false;
1333 }
1334 } else {
1335 if (perspective_ == Perspective::IS_SERVER &&
1336 (self_ip_changed_ || self_port_changed_)) {
1337 SendConnectionCloseWithDetails(
1338 QUIC_ERROR_MIGRATING_ADDRESS,
1339 "Self address migration is not supported at the server.");
1340 return false;
1341 }
1342 } 1310 }
1343 1311
1344 if (!Near(header.packet_number, last_header_.packet_number)) { 1312 if (!Near(header.packet_number, last_header_.packet_number)) {
1345 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number 1313 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number
1346 << " out of bounds. Discarding"; 1314 << " out of bounds. Discarding";
1347 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER, 1315 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER,
1348 "packet number out of bounds"); 1316 "packet number out of bounds");
1349 return false; 1317 return false;
1350 } 1318 }
1351 1319
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) { 1435 bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) {
1468 if (!connected_) { 1436 if (!connected_) {
1469 return false; 1437 return false;
1470 } 1438 }
1471 1439
1472 if (writer_->IsWriteBlocked()) { 1440 if (writer_->IsWriteBlocked()) {
1473 visitor_->OnWriteBlocked(); 1441 visitor_->OnWriteBlocked();
1474 return false; 1442 return false;
1475 } 1443 }
1476 1444
1477 if (FLAGS_quic_respect_send_alarm2) { 1445 // Allow acks to be sent immediately.
1478 // Allow acks to be sent immediately. 1446 // TODO(ianswett): Remove retransmittable from
1479 // TODO(ianswett): Remove retransmittable from 1447 // SendAlgorithmInterface::TimeUntilSend.
1480 // SendAlgorithmInterface::TimeUntilSend. 1448 if (retransmittable == NO_RETRANSMITTABLE_DATA) {
1481 if (retransmittable == NO_RETRANSMITTABLE_DATA) { 1449 return true;
1482 return true; 1450 }
1483 } 1451 // If the send alarm is set, wait for it to fire.
1484 // If the send alarm is set, wait for it to fire. 1452 if (send_alarm_->IsSet()) {
1485 if (send_alarm_->IsSet()) { 1453 return false;
1486 return false;
1487 }
1488 } 1454 }
1489 1455
1490 QuicTime now = clock_->Now(); 1456 QuicTime now = clock_->Now();
1491 QuicTime::Delta delay = 1457 QuicTime::Delta delay =
1492 sent_packet_manager_.TimeUntilSend(now, retransmittable); 1458 sent_packet_manager_.TimeUntilSend(now, retransmittable);
1493 if (delay.IsInfinite()) { 1459 if (delay.IsInfinite()) {
1494 send_alarm_->Cancel(); 1460 send_alarm_->Cancel();
1495 return false; 1461 return false;
1496 } 1462 }
1497 1463
1498 // If the scheduler requires a delay, then we can not send this packet now. 1464 // If the scheduler requires a delay, then we can not send this packet now.
1499 if (!delay.IsZero()) { 1465 if (!delay.IsZero()) {
1500 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); 1466 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1));
1501 DVLOG(1) << ENDPOINT << "Delaying sending " << delay.ToMilliseconds() 1467 DVLOG(1) << ENDPOINT << "Delaying sending " << delay.ToMilliseconds()
1502 << "ms"; 1468 << "ms";
1503 return false; 1469 return false;
1504 } 1470 }
1505 if (!FLAGS_quic_respect_send_alarm2) {
1506 send_alarm_->Cancel();
1507 }
1508 return true; 1471 return true;
1509 } 1472 }
1510 1473
1511 bool QuicConnection::WritePacket(SerializedPacket* packet) { 1474 bool QuicConnection::WritePacket(SerializedPacket* packet) {
1512 if (packet->packet_number < sent_packet_manager_.largest_sent_packet()) { 1475 if (packet->packet_number < sent_packet_manager_.largest_sent_packet()) {
1513 QUIC_BUG << "Attempt to write packet:" << packet->packet_number 1476 QUIC_BUG << "Attempt to write packet:" << packet->packet_number
1514 << " after:" << sent_packet_manager_.largest_sent_packet(); 1477 << " after:" << sent_packet_manager_.largest_sent_packet();
1515 SendConnectionCloseWithDetails(QUIC_INTERNAL_ERROR, 1478 SendConnectionCloseWithDetails(QUIC_INTERNAL_ERROR,
1516 "Packet written out of order."); 1479 "Packet written out of order.");
1517 return true; 1480 return true;
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1753 } 1716 }
1754 } 1717 }
1755 1718
1756 void QuicConnection::OnPingTimeout() { 1719 void QuicConnection::OnPingTimeout() {
1757 if (!retransmission_alarm_->IsSet()) { 1720 if (!retransmission_alarm_->IsSet()) {
1758 SendPing(); 1721 SendPing();
1759 } 1722 }
1760 } 1723 }
1761 1724
1762 void QuicConnection::SendPing() { 1725 void QuicConnection::SendPing() {
1763 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK); 1726 ScopedPacketBundler bundler(this, SEND_ACK_IF_QUEUED);
1764 packet_generator_.AddControlFrame(QuicFrame(QuicPingFrame())); 1727 packet_generator_.AddControlFrame(QuicFrame(QuicPingFrame()));
1765 // Send PING frame immediately, without checking for congestion window bounds. 1728 // Send PING frame immediately, without checking for congestion window bounds.
1766 packet_generator_.FlushAllQueuedFrames(); 1729 packet_generator_.FlushAllQueuedFrames();
1767 } 1730 }
1768 1731
1769 void QuicConnection::SendAck() { 1732 void QuicConnection::SendAck() {
1770 ack_alarm_->Cancel(); 1733 ack_alarm_->Cancel();
1771 ack_queued_ = false; 1734 ack_queued_ = false;
1772 stop_waiting_count_ = 0; 1735 stop_waiting_count_ = 0;
1773 num_retransmittable_packets_received_since_last_ack_sent_ = 0; 1736 num_retransmittable_packets_received_since_last_ack_sent_ = 0;
1774 last_ack_had_missing_packets_ = received_packet_manager_.HasMissingPackets(); 1737 last_ack_had_missing_packets_ = received_packet_manager_.HasMissingPackets();
1775 num_packets_received_since_last_ack_sent_ = 0; 1738 num_packets_received_since_last_ack_sent_ = 0;
1776 1739
1777 packet_generator_.SetShouldSendAck(true); 1740 packet_generator_.SetShouldSendAck(true);
1778 } 1741 }
1779 1742
1780 void QuicConnection::OnRetransmissionTimeout() { 1743 void QuicConnection::OnRetransmissionTimeout() {
1781 if (!sent_packet_manager_.HasUnackedPackets()) { 1744 if (!sent_packet_manager_.HasUnackedPackets()) {
1782 return; 1745 return;
1783 } 1746 }
1784 1747
1748 if (close_connection_after_five_rtos_ &&
1749 sent_packet_manager_.consecutive_rto_count() >= 4) {
1750 // Close on the 5th consecutive RTO, so after 4 previous RTOs have occurred.
1751 SendConnectionCloseWithDetails(QUIC_TOO_MANY_RTOS,
1752 "5 consecutive retransmission timeouts");
1753 return;
1754 }
1755
1785 sent_packet_manager_.OnRetransmissionTimeout(); 1756 sent_packet_manager_.OnRetransmissionTimeout();
1786 WriteIfNotBlocked(); 1757 WriteIfNotBlocked();
1787 1758
1788 // A write failure can result in the connection being closed, don't attempt to 1759 // A write failure can result in the connection being closed, don't attempt to
1789 // write further packets, or to set alarms. 1760 // write further packets, or to set alarms.
1790 if (!connected_) { 1761 if (!connected_) {
1791 return; 1762 return;
1792 } 1763 }
1793 1764
1794 // In the TLP case, the SentPacketManager gives the connection the opportunity 1765 // In the TLP case, the SentPacketManager gives the connection the opportunity
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 const string& reason) { 1920 const string& reason) {
1950 if (goaway_sent_) { 1921 if (goaway_sent_) {
1951 return; 1922 return;
1952 } 1923 }
1953 goaway_sent_ = true; 1924 goaway_sent_ = true;
1954 1925
1955 DVLOG(1) << ENDPOINT << "Going away with error " 1926 DVLOG(1) << ENDPOINT << "Going away with error "
1956 << QuicUtils::ErrorToString(error) << " (" << error << ")"; 1927 << QuicUtils::ErrorToString(error) << " (" << error << ")";
1957 1928
1958 // Opportunistically bundle an ack with this outgoing packet. 1929 // Opportunistically bundle an ack with this outgoing packet.
1959 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1930 ScopedPacketBundler ack_bundler(this, SEND_ACK_IF_PENDING);
1960 packet_generator_.AddControlFrame( 1931 packet_generator_.AddControlFrame(
1961 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason))); 1932 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason)));
1962 } 1933 }
1963 1934
1964 QuicByteCount QuicConnection::max_packet_length() const { 1935 QuicByteCount QuicConnection::max_packet_length() const {
1965 return packet_generator_.GetCurrentMaxPacketLength(); 1936 return packet_generator_.GetCurrentMaxPacketLength();
1966 } 1937 }
1967 1938
1968 void QuicConnection::SetMaxPacketLength(QuicByteCount length) { 1939 void QuicConnection::SetMaxPacketLength(QuicByteCount length) {
1969 return packet_generator_.SetMaxPacketLength(LimitMaxPacketSize(length)); 1940 return packet_generator_.SetMaxPacketLength(LimitMaxPacketSize(length));
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
2114 2085
2115 if (packet_number_of_last_sent_packet_ >= next_mtu_probe_at_) { 2086 if (packet_number_of_last_sent_packet_ >= next_mtu_probe_at_) {
2116 // Use an alarm to send the MTU probe to ensure that no ScopedPacketBundlers 2087 // Use an alarm to send the MTU probe to ensure that no ScopedPacketBundlers
2117 // are active. 2088 // are active.
2118 mtu_discovery_alarm_->Set(clock_->ApproximateNow()); 2089 mtu_discovery_alarm_->Set(clock_->ApproximateNow());
2119 } 2090 }
2120 } 2091 }
2121 2092
2122 QuicConnection::ScopedPacketBundler::ScopedPacketBundler( 2093 QuicConnection::ScopedPacketBundler::ScopedPacketBundler(
2123 QuicConnection* connection, 2094 QuicConnection* connection,
2124 AckBundling send_ack) 2095 AckBundling ack_mode)
2125 : connection_(connection), 2096 : connection_(connection),
2126 already_in_batch_mode_(connection != nullptr && 2097 already_in_batch_mode_(connection != nullptr &&
2127 connection->packet_generator_.InBatchMode()) { 2098 connection->packet_generator_.InBatchMode()) {
2128 if (connection_ == nullptr) { 2099 if (connection_ == nullptr) {
2129 return; 2100 return;
2130 } 2101 }
2131 // Move generator into batch mode. If caller wants us to include an ack, 2102 // Move generator into batch mode. If caller wants us to include an ack,
2132 // check the delayed-ack timer to see if there's ack info to be sent. 2103 // check the delayed-ack timer to see if there's ack info to be sent.
2133 if (!already_in_batch_mode_) { 2104 if (!already_in_batch_mode_) {
2134 DVLOG(1) << "Entering Batch Mode."; 2105 DVLOG(1) << "Entering Batch Mode.";
2135 connection_->packet_generator_.StartBatchOperations(); 2106 connection_->packet_generator_.StartBatchOperations();
2136 } 2107 }
2137 // Bundle an ack if the alarm is set or with every second packet if we need to 2108 if (ShouldSendAck(ack_mode)) {
2138 // raise the peer's least unacked.
2139 bool ack_pending =
2140 connection_->ack_alarm_->IsSet() || connection_->stop_waiting_count_ > 1;
2141 if (send_ack == SEND_ACK || (send_ack == BUNDLE_PENDING_ACK && ack_pending)) {
2142 DVLOG(1) << "Bundling ack with outgoing packet."; 2109 DVLOG(1) << "Bundling ack with outgoing packet.";
2143 DCHECK(send_ack == SEND_ACK || connection_->ack_frame_updated() || 2110 DCHECK(ack_mode == SEND_ACK || connection_->ack_frame_updated() ||
2144 connection_->stop_waiting_count_ > 1); 2111 connection_->stop_waiting_count_ > 1);
2145 connection_->SendAck(); 2112 connection_->SendAck();
2146 } 2113 }
2147 } 2114 }
2148 2115
2116 bool QuicConnection::ScopedPacketBundler::ShouldSendAck(
2117 AckBundling ack_mode) const {
2118 switch (ack_mode) {
2119 case SEND_ACK:
2120 return true;
2121 case SEND_ACK_IF_QUEUED:
2122 return connection_->ack_queued();
2123 case SEND_ACK_IF_PENDING:
2124 return connection_->ack_alarm_->IsSet() ||
2125 connection_->stop_waiting_count_ > 1;
2126 default:
2127 QUIC_BUG << "Unsupported ack_mode.";
2128 return true;
2129 }
2130 }
2131
2149 QuicConnection::ScopedPacketBundler::~ScopedPacketBundler() { 2132 QuicConnection::ScopedPacketBundler::~ScopedPacketBundler() {
2150 if (connection_ == nullptr) { 2133 if (connection_ == nullptr) {
2151 return; 2134 return;
2152 } 2135 }
2153 // If we changed the generator's batch state, restore original batch state. 2136 // If we changed the generator's batch state, restore original batch state.
2154 if (!already_in_batch_mode_) { 2137 if (!already_in_batch_mode_) {
2155 DVLOG(1) << "Leaving Batch Mode."; 2138 DVLOG(1) << "Leaving Batch Mode.";
2156 connection_->packet_generator_.FinishBatchOperations(); 2139 connection_->packet_generator_.FinishBatchOperations();
2157 } 2140 }
2158 DCHECK_EQ(already_in_batch_mode_, 2141 DCHECK_EQ(already_in_batch_mode_,
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2264 ++mtu_probe_count_; 2247 ++mtu_probe_count_;
2265 2248
2266 DVLOG(2) << "Sending a path MTU discovery packet #" << mtu_probe_count_; 2249 DVLOG(2) << "Sending a path MTU discovery packet #" << mtu_probe_count_;
2267 SendMtuDiscoveryPacket(mtu_discovery_target_); 2250 SendMtuDiscoveryPacket(mtu_discovery_target_);
2268 2251
2269 DCHECK(!mtu_discovery_alarm_->IsSet()); 2252 DCHECK(!mtu_discovery_alarm_->IsSet());
2270 } 2253 }
2271 2254
2272 void QuicConnection::MaybeMigrateConnectionToNewPeerAddress() { 2255 void QuicConnection::MaybeMigrateConnectionToNewPeerAddress() {
2273 IPEndPoint last_peer_address; 2256 IPEndPoint last_peer_address;
2274 if (FLAGS_check_peer_address_change_after_decryption) { 2257 last_peer_address = last_packet_source_address_;
2275 last_peer_address = last_packet_source_address_;
2276 } else {
2277 last_peer_address = IPEndPoint(
2278 peer_ip_changed_ ? migrating_peer_ip_ : peer_address_.address(),
2279 peer_port_changed_ ? migrating_peer_port_ : peer_address_.port());
2280 }
2281 PeerAddressChangeType peer_address_change_type = 2258 PeerAddressChangeType peer_address_change_type =
2282 QuicUtils::DetermineAddressChangeType(peer_address_, last_peer_address); 2259 QuicUtils::DetermineAddressChangeType(peer_address_, last_peer_address);
2283 // TODO(fayang): Currently, all peer address change type are allowed. Need to 2260 // TODO(fayang): Currently, all peer address change type are allowed. Need to
2284 // add a method ShouldAllowPeerAddressChange(PeerAddressChangeType type) to 2261 // add a method ShouldAllowPeerAddressChange(PeerAddressChangeType type) to
2285 // determine whehter |type| is allowed. 2262 // determine whether |type| is allowed.
2286 if (FLAGS_check_peer_address_change_after_decryption) { 2263 if (peer_address_change_type == NO_CHANGE) {
2287 if (peer_address_change_type == NO_CHANGE) {
2288 return;
2289 }
2290
2291 IPEndPoint old_peer_address = peer_address_;
2292 peer_address_ = last_packet_source_address_;
2293
2294 DVLOG(1) << ENDPOINT << "Peer's ip:port changed from "
2295 << old_peer_address.ToString() << " to "
2296 << peer_address_.ToString() << ", migrating connection.";
2297
2298 visitor_->OnConnectionMigration(peer_address_change_type);
2299 sent_packet_manager_.OnConnectionMigration(peer_address_change_type);
2300
2301 return; 2264 return;
2302 } 2265 }
2303 2266
2304 if (peer_ip_changed_ || peer_port_changed_) { 2267 IPEndPoint old_peer_address = peer_address_;
2305 IPEndPoint old_peer_address = peer_address_; 2268 peer_address_ = last_packet_source_address_;
2306 peer_address_ = IPEndPoint(
2307 peer_ip_changed_ ? migrating_peer_ip_ : peer_address_.address(),
2308 peer_port_changed_ ? migrating_peer_port_ : peer_address_.port());
2309 2269
2310 DVLOG(1) << ENDPOINT << "Peer's ip:port changed from " 2270 DVLOG(1) << ENDPOINT << "Peer's ip:port changed from "
2311 << old_peer_address.ToString() << " to " 2271 << old_peer_address.ToString() << " to " << peer_address_.ToString()
2312 << peer_address_.ToString() << ", migrating connection."; 2272 << ", migrating connection.";
2313 2273
2314 visitor_->OnConnectionMigration(peer_address_change_type); 2274 visitor_->OnConnectionMigration(peer_address_change_type);
2315 DCHECK_NE(peer_address_change_type, NO_CHANGE); 2275 sent_packet_manager_.OnConnectionMigration(peer_address_change_type);
2316 sent_packet_manager_.OnConnectionMigration(peer_address_change_type);
2317 }
2318 } 2276 }
2319 2277
2320 void QuicConnection::OnPathClosed(QuicPathId path_id) { 2278 void QuicConnection::OnPathClosed(QuicPathId path_id) {
2321 // Stop receiving packets on this path. 2279 // Stop receiving packets on this path.
2322 framer_.OnPathClosed(path_id); 2280 framer_.OnPathClosed(path_id);
2323 } 2281 }
2324 2282
2325 bool QuicConnection::ack_frame_updated() const { 2283 bool QuicConnection::ack_frame_updated() const {
2326 return received_packet_manager_.ack_frame_updated(); 2284 return received_packet_manager_.ack_frame_updated();
2327 } 2285 }
2328 2286
2329 StringPiece QuicConnection::GetCurrentPacket() { 2287 StringPiece QuicConnection::GetCurrentPacket() {
2330 if (current_packet_data_ == nullptr) { 2288 if (current_packet_data_ == nullptr) {
2331 return StringPiece(); 2289 return StringPiece();
2332 } 2290 }
2333 return StringPiece(current_packet_data_, last_size_); 2291 return StringPiece(current_packet_data_, last_size_);
2334 } 2292 }
2335 2293
2336 } // namespace net 2294 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_stats.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698