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

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

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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
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 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 const size_t kMaxUndecryptablePackets = 10; 57 const size_t kMaxUndecryptablePackets = 10;
58 58
59 bool Near(QuicPacketSequenceNumber a, QuicPacketSequenceNumber b) { 59 bool Near(QuicPacketSequenceNumber a, QuicPacketSequenceNumber b) {
60 QuicPacketSequenceNumber delta = (a > b) ? a - b : b - a; 60 QuicPacketSequenceNumber delta = (a > b) ? a - b : b - a;
61 return delta <= kMaxPacketGap; 61 return delta <= kMaxPacketGap;
62 } 62 }
63 63
64 // An alarm that is scheduled to send an ack if a timeout occurs. 64 // An alarm that is scheduled to send an ack if a timeout occurs.
65 class AckAlarm : public QuicAlarm::Delegate { 65 class AckAlarm : public QuicAlarm::Delegate {
66 public: 66 public:
67 explicit AckAlarm(QuicConnection* connection) 67 explicit AckAlarm(QuicConnection* connection) : connection_(connection) {}
68 : connection_(connection) {
69 }
70 68
71 virtual QuicTime OnAlarm() OVERRIDE { 69 virtual QuicTime OnAlarm() OVERRIDE {
72 connection_->SendAck(); 70 connection_->SendAck();
73 return QuicTime::Zero(); 71 return QuicTime::Zero();
74 } 72 }
75 73
76 private: 74 private:
77 QuicConnection* connection_; 75 QuicConnection* connection_;
78 76
79 DISALLOW_COPY_AND_ASSIGN(AckAlarm); 77 DISALLOW_COPY_AND_ASSIGN(AckAlarm);
80 }; 78 };
81 79
82 // This alarm will be scheduled any time a data-bearing packet is sent out. 80 // This alarm will be scheduled any time a data-bearing packet is sent out.
83 // When the alarm goes off, the connection checks to see if the oldest packets 81 // When the alarm goes off, the connection checks to see if the oldest packets
84 // have been acked, and retransmit them if they have not. 82 // have been acked, and retransmit them if they have not.
85 class RetransmissionAlarm : public QuicAlarm::Delegate { 83 class RetransmissionAlarm : public QuicAlarm::Delegate {
86 public: 84 public:
87 explicit RetransmissionAlarm(QuicConnection* connection) 85 explicit RetransmissionAlarm(QuicConnection* connection)
88 : connection_(connection) { 86 : connection_(connection) {}
89 }
90 87
91 virtual QuicTime OnAlarm() OVERRIDE { 88 virtual QuicTime OnAlarm() OVERRIDE {
92 connection_->OnRetransmissionTimeout(); 89 connection_->OnRetransmissionTimeout();
93 return QuicTime::Zero(); 90 return QuicTime::Zero();
94 } 91 }
95 92
96 private: 93 private:
97 QuicConnection* connection_; 94 QuicConnection* connection_;
98 95
99 DISALLOW_COPY_AND_ASSIGN(RetransmissionAlarm); 96 DISALLOW_COPY_AND_ASSIGN(RetransmissionAlarm);
100 }; 97 };
101 98
102 // An alarm that is scheduled when the sent scheduler requires a 99 // An alarm that is scheduled when the sent scheduler requires a
103 // a delay before sending packets and fires when the packet may be sent. 100 // a delay before sending packets and fires when the packet may be sent.
104 class SendAlarm : public QuicAlarm::Delegate { 101 class SendAlarm : public QuicAlarm::Delegate {
105 public: 102 public:
106 explicit SendAlarm(QuicConnection* connection) 103 explicit SendAlarm(QuicConnection* connection) : connection_(connection) {}
107 : connection_(connection) {
108 }
109 104
110 virtual QuicTime OnAlarm() OVERRIDE { 105 virtual QuicTime OnAlarm() OVERRIDE {
111 connection_->WriteIfNotBlocked(); 106 connection_->WriteIfNotBlocked();
112 // Never reschedule the alarm, since CanWrite does that. 107 // Never reschedule the alarm, since CanWrite does that.
113 return QuicTime::Zero(); 108 return QuicTime::Zero();
114 } 109 }
115 110
116 private: 111 private:
117 QuicConnection* connection_; 112 QuicConnection* connection_;
118 113
119 DISALLOW_COPY_AND_ASSIGN(SendAlarm); 114 DISALLOW_COPY_AND_ASSIGN(SendAlarm);
120 }; 115 };
121 116
122 class TimeoutAlarm : public QuicAlarm::Delegate { 117 class TimeoutAlarm : public QuicAlarm::Delegate {
123 public: 118 public:
124 explicit TimeoutAlarm(QuicConnection* connection) 119 explicit TimeoutAlarm(QuicConnection* connection) : connection_(connection) {}
125 : connection_(connection) {
126 }
127 120
128 virtual QuicTime OnAlarm() OVERRIDE { 121 virtual QuicTime OnAlarm() OVERRIDE {
129 connection_->CheckForTimeout(); 122 connection_->CheckForTimeout();
130 // Never reschedule the alarm, since CheckForTimeout does that. 123 // Never reschedule the alarm, since CheckForTimeout does that.
131 return QuicTime::Zero(); 124 return QuicTime::Zero();
132 } 125 }
133 126
134 private: 127 private:
135 QuicConnection* connection_; 128 QuicConnection* connection_;
136 129
137 DISALLOW_COPY_AND_ASSIGN(TimeoutAlarm); 130 DISALLOW_COPY_AND_ASSIGN(TimeoutAlarm);
138 }; 131 };
139 132
140 class PingAlarm : public QuicAlarm::Delegate { 133 class PingAlarm : public QuicAlarm::Delegate {
141 public: 134 public:
142 explicit PingAlarm(QuicConnection* connection) 135 explicit PingAlarm(QuicConnection* connection) : connection_(connection) {}
143 : connection_(connection) {
144 }
145 136
146 virtual QuicTime OnAlarm() OVERRIDE { 137 virtual QuicTime OnAlarm() OVERRIDE {
147 connection_->SendPing(); 138 connection_->SendPing();
148 return QuicTime::Zero(); 139 return QuicTime::Zero();
149 } 140 }
150 141
151 private: 142 private:
152 QuicConnection* connection_; 143 QuicConnection* connection_;
153 144
154 DISALLOW_COPY_AND_ASSIGN(PingAlarm); 145 DISALLOW_COPY_AND_ASSIGN(PingAlarm);
(...skipping 10 matching lines...) Expand all
165 } 156 }
166 } 157 }
167 return QuicConnection::NORMAL; 158 return QuicConnection::NORMAL;
168 } 159 }
169 160
170 } // namespace 161 } // namespace
171 162
172 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, 163 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet,
173 EncryptionLevel level, 164 EncryptionLevel level,
174 TransmissionType transmission_type) 165 TransmissionType transmission_type)
175 : sequence_number(packet.sequence_number), 166 : sequence_number(packet.sequence_number),
176 packet(packet.packet), 167 packet(packet.packet),
177 encryption_level(level), 168 encryption_level(level),
178 transmission_type(transmission_type), 169 transmission_type(transmission_type),
179 retransmittable((transmission_type != NOT_RETRANSMISSION || 170 retransmittable((transmission_type != NOT_RETRANSMISSION ||
180 packet.retransmittable_frames != NULL) ? 171 packet.retransmittable_frames != NULL)
181 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA), 172 ? HAS_RETRANSMITTABLE_DATA
182 handshake(packet.retransmittable_frames == NULL ? 173 : NO_RETRANSMITTABLE_DATA),
183 NOT_HANDSHAKE : packet.retransmittable_frames->HasCryptoHandshake()), 174 handshake(packet.retransmittable_frames == NULL
184 type(GetPacketType(packet.retransmittable_frames)), 175 ? NOT_HANDSHAKE
185 length(packet.packet->length()) { 176 : packet.retransmittable_frames->HasCryptoHandshake()),
177 type(GetPacketType(packet.retransmittable_frames)),
178 length(packet.packet->length()) {
186 } 179 }
187 180
188 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") 181 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
189 182
190 QuicConnection::QuicConnection(QuicConnectionId connection_id, 183 QuicConnection::QuicConnection(QuicConnectionId connection_id,
191 IPEndPoint address, 184 IPEndPoint address,
192 QuicConnectionHelperInterface* helper, 185 QuicConnectionHelperInterface* helper,
193 QuicPacketWriter* writer, 186 QuicPacketWriter* writer,
194 bool is_server, 187 bool is_server,
195 const QuicVersionVector& supported_versions, 188 const QuicVersionVector& supported_versions,
196 uint32 max_flow_control_receive_window_bytes) 189 uint32 max_flow_control_receive_window_bytes)
197 : framer_(supported_versions, helper->GetClock()->ApproximateNow(), 190 : framer_(supported_versions,
191 helper->GetClock()->ApproximateNow(),
198 is_server), 192 is_server),
199 helper_(helper), 193 helper_(helper),
200 writer_(writer), 194 writer_(writer),
201 encryption_level_(ENCRYPTION_NONE), 195 encryption_level_(ENCRYPTION_NONE),
202 clock_(helper->GetClock()), 196 clock_(helper->GetClock()),
203 random_generator_(helper->GetRandomGenerator()), 197 random_generator_(helper->GetRandomGenerator()),
204 connection_id_(connection_id), 198 connection_id_(connection_id),
205 peer_address_(address), 199 peer_address_(address),
206 last_packet_revived_(false), 200 last_packet_revived_(false),
207 last_size_(0), 201 last_size_(0),
(...skipping 12 matching lines...) Expand all
220 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), 214 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))),
221 debug_visitor_(NULL), 215 debug_visitor_(NULL),
222 packet_creator_(connection_id_, &framer_, random_generator_, is_server), 216 packet_creator_(connection_id_, &framer_, random_generator_, is_server),
223 packet_generator_(this, NULL, &packet_creator_), 217 packet_generator_(this, NULL, &packet_creator_),
224 idle_network_timeout_( 218 idle_network_timeout_(
225 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), 219 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)),
226 overall_connection_timeout_(QuicTime::Delta::Infinite()), 220 overall_connection_timeout_(QuicTime::Delta::Infinite()),
227 time_of_last_received_packet_(clock_->ApproximateNow()), 221 time_of_last_received_packet_(clock_->ApproximateNow()),
228 time_of_last_sent_new_packet_(clock_->ApproximateNow()), 222 time_of_last_sent_new_packet_(clock_->ApproximateNow()),
229 sequence_number_of_last_sent_packet_(0), 223 sequence_number_of_last_sent_packet_(0),
230 sent_packet_manager_( 224 sent_packet_manager_(is_server,
231 is_server, clock_, &stats_, kTCP, 225 clock_,
232 FLAGS_quic_use_time_loss_detection ? kTime : kNack), 226 &stats_,
227 kTCP,
228 FLAGS_quic_use_time_loss_detection ? kTime : kNack),
233 version_negotiation_state_(START_NEGOTIATION), 229 version_negotiation_state_(START_NEGOTIATION),
234 is_server_(is_server), 230 is_server_(is_server),
235 connected_(true), 231 connected_(true),
236 address_migrating_(false), 232 address_migrating_(false),
237 max_flow_control_receive_window_bytes_( 233 max_flow_control_receive_window_bytes_(
238 max_flow_control_receive_window_bytes) { 234 max_flow_control_receive_window_bytes) {
239 if (max_flow_control_receive_window_bytes_ < kDefaultFlowControlSendWindow) { 235 if (max_flow_control_receive_window_bytes_ < kDefaultFlowControlSendWindow) {
240 DLOG(ERROR) << "Initial receive window (" 236 DLOG(ERROR) << "Initial receive window ("
241 << max_flow_control_receive_window_bytes_ 237 << max_flow_control_receive_window_bytes_
242 << ") cannot be set lower than default (" 238 << ") cannot be set lower than default ("
243 << kDefaultFlowControlSendWindow << ")."; 239 << kDefaultFlowControlSendWindow << ").";
244 max_flow_control_receive_window_bytes_ = kDefaultFlowControlSendWindow; 240 max_flow_control_receive_window_bytes_ = kDefaultFlowControlSendWindow;
245 } 241 }
246 if (!is_server_) { 242 if (!is_server_) {
247 // Pacing will be enabled if the client negotiates it. 243 // Pacing will be enabled if the client negotiates it.
248 sent_packet_manager_.MaybeEnablePacing(); 244 sent_packet_manager_.MaybeEnablePacing();
249 } 245 }
250 DVLOG(1) << ENDPOINT << "Created connection with connection_id: " 246 DVLOG(1) << ENDPOINT
251 << connection_id; 247 << "Created connection with connection_id: " << connection_id;
252 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); 248 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_));
253 framer_.set_visitor(this); 249 framer_.set_visitor(this);
254 framer_.set_received_entropy_calculator(&received_packet_manager_); 250 framer_.set_received_entropy_calculator(&received_packet_manager_);
255 stats_.connection_creation_time = clock_->ApproximateNow(); 251 stats_.connection_creation_time = clock_->ApproximateNow();
256 } 252 }
257 253
258 QuicConnection::~QuicConnection() { 254 QuicConnection::~QuicConnection() {
259 STLDeleteElements(&undecryptable_packets_); 255 STLDeleteElements(&undecryptable_packets_);
260 STLDeleteValues(&group_map_); 256 STLDeleteValues(&group_map_);
261 for (QueuedPacketList::iterator it = queued_packets_.begin(); 257 for (QueuedPacketList::iterator it = queued_packets_.begin();
262 it != queued_packets_.end(); ++it) { 258 it != queued_packets_.end();
259 ++it) {
263 delete it->packet; 260 delete it->packet;
264 } 261 }
265 } 262 }
266 263
267 void QuicConnection::SetFromConfig(const QuicConfig& config) { 264 void QuicConnection::SetFromConfig(const QuicConfig& config) {
268 SetIdleNetworkTimeout(config.idle_connection_state_lifetime()); 265 SetIdleNetworkTimeout(config.idle_connection_state_lifetime());
269 sent_packet_manager_.SetFromConfig(config); 266 sent_packet_manager_.SetFromConfig(config);
270 // TODO(satyamshekhar): Set congestion control and ICSL also. 267 // TODO(satyamshekhar): Set congestion control and ICSL also.
271 } 268 }
272 269
273 bool QuicConnection::SelectMutualVersion( 270 bool QuicConnection::SelectMutualVersion(
274 const QuicVersionVector& available_versions) { 271 const QuicVersionVector& available_versions) {
275 // Try to find the highest mutual version by iterating over supported 272 // Try to find the highest mutual version by iterating over supported
276 // versions, starting with the highest, and breaking out of the loop once we 273 // versions, starting with the highest, and breaking out of the loop once we
277 // find a matching version in the provided available_versions vector. 274 // find a matching version in the provided available_versions vector.
278 const QuicVersionVector& supported_versions = framer_.supported_versions(); 275 const QuicVersionVector& supported_versions = framer_.supported_versions();
279 for (size_t i = 0; i < supported_versions.size(); ++i) { 276 for (size_t i = 0; i < supported_versions.size(); ++i) {
280 const QuicVersion& version = supported_versions[i]; 277 const QuicVersion& version = supported_versions[i];
281 if (std::find(available_versions.begin(), available_versions.end(), 278 if (std::find(available_versions.begin(),
279 available_versions.end(),
282 version) != available_versions.end()) { 280 version) != available_versions.end()) {
283 framer_.set_version(version); 281 framer_.set_version(version);
284 return true; 282 return true;
285 } 283 }
286 } 284 }
287 285
288 return false; 286 return false;
289 } 287 }
290 288
291 void QuicConnection::OnError(QuicFramer* framer) { 289 void QuicConnection::OnError(QuicFramer* framer) {
292 // Packets that we cannot decrypt are dropped. 290 // Packets that we cannot decrypt are dropped.
293 // TODO(rch): add stats to measure this. 291 // TODO(rch): add stats to measure this.
294 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { 292 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) {
295 return; 293 return;
296 } 294 }
297 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); 295 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error());
298 } 296 }
299 297
300 void QuicConnection::OnPacket() { 298 void QuicConnection::OnPacket() {
301 DCHECK(last_stream_frames_.empty() && 299 DCHECK(last_stream_frames_.empty() && last_goaway_frames_.empty() &&
302 last_goaway_frames_.empty() && 300 last_window_update_frames_.empty() && last_blocked_frames_.empty() &&
303 last_window_update_frames_.empty() && 301 last_rst_frames_.empty() && last_ack_frames_.empty() &&
304 last_blocked_frames_.empty() && 302 last_congestion_frames_.empty() && last_stop_waiting_frames_.empty());
305 last_rst_frames_.empty() &&
306 last_ack_frames_.empty() &&
307 last_congestion_frames_.empty() &&
308 last_stop_waiting_frames_.empty());
309 } 303 }
310 304
311 void QuicConnection::OnPublicResetPacket( 305 void QuicConnection::OnPublicResetPacket(const QuicPublicResetPacket& packet) {
312 const QuicPublicResetPacket& packet) {
313 if (debug_visitor_) { 306 if (debug_visitor_) {
314 debug_visitor_->OnPublicResetPacket(packet); 307 debug_visitor_->OnPublicResetPacket(packet);
315 } 308 }
316 CloseConnection(QUIC_PUBLIC_RESET, true); 309 CloseConnection(QUIC_PUBLIC_RESET, true);
317 } 310 }
318 311
319 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) { 312 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) {
320 DVLOG(1) << ENDPOINT << "Received packet with mismatched version " 313 DVLOG(1) << ENDPOINT << "Received packet with mismatched version "
321 << received_version; 314 << received_version;
322 // TODO(satyamshekhar): Implement no server state in this mode. 315 // TODO(satyamshekhar): Implement no server state in this mode.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 } 374 }
382 if (debug_visitor_) { 375 if (debug_visitor_) {
383 debug_visitor_->OnVersionNegotiationPacket(packet); 376 debug_visitor_->OnVersionNegotiationPacket(packet);
384 } 377 }
385 378
386 if (version_negotiation_state_ != START_NEGOTIATION) { 379 if (version_negotiation_state_ != START_NEGOTIATION) {
387 // Possibly a duplicate version negotiation packet. 380 // Possibly a duplicate version negotiation packet.
388 return; 381 return;
389 } 382 }
390 383
391 if (std::find(packet.versions.begin(), 384 if (std::find(packet.versions.begin(), packet.versions.end(), version()) !=
392 packet.versions.end(), version()) !=
393 packet.versions.end()) { 385 packet.versions.end()) {
394 DLOG(WARNING) << ENDPOINT << "The server already supports our version. " 386 DLOG(WARNING) << ENDPOINT << "The server already supports our version. "
395 << "It should have accepted our connection."; 387 << "It should have accepted our connection.";
396 // Just drop the connection. 388 // Just drop the connection.
397 CloseConnection(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, false); 389 CloseConnection(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, false);
398 return; 390 return;
399 } 391 }
400 392
401 if (!SelectMutualVersion(packet.versions)) { 393 if (!SelectMutualVersion(packet.versions)) {
402 SendConnectionCloseWithDetails(QUIC_INVALID_VERSION, 394 SendConnectionCloseWithDetails(QUIC_INVALID_VERSION,
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 550
559 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info, 551 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info,
560 time_of_last_received_packet_); 552 time_of_last_received_packet_);
561 if (sent_packet_manager_.HasPendingRetransmissions()) { 553 if (sent_packet_manager_.HasPendingRetransmissions()) {
562 WriteIfNotBlocked(); 554 WriteIfNotBlocked();
563 } 555 }
564 556
565 // Always reset the retransmission alarm when an ack comes in, since we now 557 // Always reset the retransmission alarm when an ack comes in, since we now
566 // have a better estimate of the current rtt than when it was set. 558 // have a better estimate of the current rtt than when it was set.
567 retransmission_alarm_->Cancel(); 559 retransmission_alarm_->Cancel();
568 QuicTime retransmission_time = 560 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime();
569 sent_packet_manager_.GetRetransmissionTime();
570 if (retransmission_time != QuicTime::Zero()) { 561 if (retransmission_time != QuicTime::Zero()) {
571 retransmission_alarm_->Set(retransmission_time); 562 retransmission_alarm_->Set(retransmission_time);
572 } 563 }
573 } 564 }
574 565
575 void QuicConnection::ProcessStopWaitingFrame( 566 void QuicConnection::ProcessStopWaitingFrame(
576 const QuicStopWaitingFrame& stop_waiting) { 567 const QuicStopWaitingFrame& stop_waiting) {
577 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number; 568 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number;
578 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); 569 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting);
579 // Possibly close any FecGroups which are now irrelevant. 570 // Possibly close any FecGroups which are now irrelevant.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 if (incoming_ack.received_info.largest_observed > 615 if (incoming_ack.received_info.largest_observed >
625 packet_creator_.sequence_number()) { 616 packet_creator_.sequence_number()) {
626 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" 617 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:"
627 << incoming_ack.received_info.largest_observed << " vs " 618 << incoming_ack.received_info.largest_observed << " vs "
628 << packet_creator_.sequence_number(); 619 << packet_creator_.sequence_number();
629 // We got an error for data we have not sent. Error out. 620 // We got an error for data we have not sent. Error out.
630 return false; 621 return false;
631 } 622 }
632 623
633 if (incoming_ack.received_info.largest_observed < 624 if (incoming_ack.received_info.largest_observed <
634 received_packet_manager_.peer_largest_observed_packet()) { 625 received_packet_manager_.peer_largest_observed_packet()) {
635 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" 626 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:"
636 << incoming_ack.received_info.largest_observed << " vs " 627 << incoming_ack.received_info.largest_observed << " vs "
637 << received_packet_manager_.peer_largest_observed_packet(); 628 << received_packet_manager_.peer_largest_observed_packet();
638 // A new ack has a diminished largest_observed value. Error out. 629 // A new ack has a diminished largest_observed value. Error out.
639 // If this was an old packet, we wouldn't even have checked. 630 // If this was an old packet, we wouldn't even have checked.
640 return false; 631 return false;
641 } 632 }
642 633
643 if (version() <= QUIC_VERSION_15) { 634 if (version() <= QUIC_VERSION_15) {
644 if (!ValidateStopWaitingFrame(incoming_ack.sent_info)) { 635 if (!ValidateStopWaitingFrame(incoming_ack.sent_info)) {
645 return false; 636 return false;
646 } 637 }
647 } 638 }
648 639
649 if (!incoming_ack.received_info.missing_packets.empty() && 640 if (!incoming_ack.received_info.missing_packets.empty() &&
650 *incoming_ack.received_info.missing_packets.rbegin() > 641 *incoming_ack.received_info.missing_packets.rbegin() >
651 incoming_ack.received_info.largest_observed) { 642 incoming_ack.received_info.largest_observed) {
652 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 643 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
653 << *incoming_ack.received_info.missing_packets.rbegin() 644 << *incoming_ack.received_info.missing_packets.rbegin()
654 << " which is greater than largest observed: " 645 << " which is greater than largest observed: "
655 << incoming_ack.received_info.largest_observed; 646 << incoming_ack.received_info.largest_observed;
656 return false; 647 return false;
657 } 648 }
658 649
659 if (!incoming_ack.received_info.missing_packets.empty() && 650 if (!incoming_ack.received_info.missing_packets.empty() &&
660 *incoming_ack.received_info.missing_packets.begin() < 651 *incoming_ack.received_info.missing_packets.begin() <
661 received_packet_manager_.least_packet_awaited_by_peer()) { 652 received_packet_manager_.least_packet_awaited_by_peer()) {
662 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 653 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
663 << *incoming_ack.received_info.missing_packets.begin() 654 << *incoming_ack.received_info.missing_packets.begin()
664 << " which is smaller than least_packet_awaited_by_peer_: " 655 << " which is smaller than least_packet_awaited_by_peer_: "
665 << received_packet_manager_.least_packet_awaited_by_peer(); 656 << received_packet_manager_.least_packet_awaited_by_peer();
666 return false; 657 return false;
667 } 658 }
668 659
669 if (!sent_entropy_manager_.IsValidEntropy( 660 if (!sent_entropy_manager_.IsValidEntropy(
670 incoming_ack.received_info.largest_observed, 661 incoming_ack.received_info.largest_observed,
671 incoming_ack.received_info.missing_packets, 662 incoming_ack.received_info.missing_packets,
672 incoming_ack.received_info.entropy_hash)) { 663 incoming_ack.received_info.entropy_hash)) {
673 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; 664 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy.";
674 return false; 665 return false;
675 } 666 }
676 667
677 for (SequenceNumberSet::const_iterator iter = 668 for (SequenceNumberSet::const_iterator iter =
678 incoming_ack.received_info.revived_packets.begin(); 669 incoming_ack.received_info.revived_packets.begin();
679 iter != incoming_ack.received_info.revived_packets.end(); ++iter) { 670 iter != incoming_ack.received_info.revived_packets.end();
671 ++iter) {
680 if (!ContainsKey(incoming_ack.received_info.missing_packets, *iter)) { 672 if (!ContainsKey(incoming_ack.received_info.missing_packets, *iter)) {
681 DLOG(ERROR) << ENDPOINT 673 DLOG(ERROR) << ENDPOINT
682 << "Peer specified revived packet which was not missing."; 674 << "Peer specified revived packet which was not missing.";
683 return false; 675 return false;
684 } 676 }
685 } 677 }
686 return true; 678 return true;
687 } 679 }
688 680
689 bool QuicConnection::ValidateStopWaitingFrame( 681 bool QuicConnection::ValidateStopWaitingFrame(
690 const QuicStopWaitingFrame& stop_waiting) { 682 const QuicStopWaitingFrame& stop_waiting) {
691 if (stop_waiting.least_unacked < 683 if (stop_waiting.least_unacked <
692 received_packet_manager_.peer_least_packet_awaiting_ack()) { 684 received_packet_manager_.peer_least_packet_awaiting_ack()) {
693 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " 685 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: "
694 << stop_waiting.least_unacked << " vs " 686 << stop_waiting.least_unacked << " vs "
695 << received_packet_manager_.peer_least_packet_awaiting_ack(); 687 << received_packet_manager_.peer_least_packet_awaiting_ack();
696 // We never process old ack frames, so this number should only increase. 688 // We never process old ack frames, so this number should only increase.
697 return false; 689 return false;
698 } 690 }
699 691
700 if (stop_waiting.least_unacked > 692 if (stop_waiting.least_unacked > last_header_.packet_sequence_number) {
701 last_header_.packet_sequence_number) { 693 DLOG(ERROR) << ENDPOINT
702 DLOG(ERROR) << ENDPOINT << "Peer sent least_unacked:" 694 << "Peer sent least_unacked:" << stop_waiting.least_unacked
703 << stop_waiting.least_unacked
704 << " greater than the enclosing packet sequence number:" 695 << " greater than the enclosing packet sequence number:"
705 << last_header_.packet_sequence_number; 696 << last_header_.packet_sequence_number;
706 return false; 697 return false;
707 } 698 }
708 699
709 return true; 700 return true;
710 } 701 }
711 702
712 void QuicConnection::OnFecData(const QuicFecData& fec) { 703 void QuicConnection::OnFecData(const QuicFecData& fec) {
713 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); 704 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
(...skipping 16 matching lines...) Expand all
730 } 721 }
731 722
732 bool QuicConnection::OnConnectionCloseFrame( 723 bool QuicConnection::OnConnectionCloseFrame(
733 const QuicConnectionCloseFrame& frame) { 724 const QuicConnectionCloseFrame& frame) {
734 DCHECK(connected_); 725 DCHECK(connected_);
735 if (debug_visitor_) { 726 if (debug_visitor_) {
736 debug_visitor_->OnConnectionCloseFrame(frame); 727 debug_visitor_->OnConnectionCloseFrame(frame);
737 } 728 }
738 DVLOG(1) << ENDPOINT << "Connection " << connection_id() 729 DVLOG(1) << ENDPOINT << "Connection " << connection_id()
739 << " closed with error " 730 << " closed with error "
740 << QuicUtils::ErrorToString(frame.error_code) 731 << QuicUtils::ErrorToString(frame.error_code) << " "
741 << " " << frame.error_details; 732 << frame.error_details;
742 last_close_frames_.push_back(frame); 733 last_close_frames_.push_back(frame);
743 return connected_; 734 return connected_;
744 } 735 }
745 736
746 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) { 737 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
747 DCHECK(connected_); 738 DCHECK(connected_);
748 DVLOG(1) << ENDPOINT << "Go away received with error " 739 DVLOG(1) << ENDPOINT << "Go away received with error "
749 << QuicUtils::ErrorToString(frame.error_code) 740 << QuicUtils::ErrorToString(frame.error_code)
750 << " and reason:" << frame.reason_phrase; 741 << " and reason:" << frame.reason_phrase;
751 last_goaway_frames_.push_back(frame); 742 last_goaway_frames_.push_back(frame);
752 return connected_; 743 return connected_;
753 } 744 }
754 745
755 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { 746 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) {
756 DCHECK(connected_); 747 DCHECK(connected_);
757 DVLOG(1) << ENDPOINT << "WindowUpdate received for stream: " 748 DVLOG(1) << ENDPOINT
758 << frame.stream_id << " with byte offset: " << frame.byte_offset; 749 << "WindowUpdate received for stream: " << frame.stream_id
750 << " with byte offset: " << frame.byte_offset;
759 last_window_update_frames_.push_back(frame); 751 last_window_update_frames_.push_back(frame);
760 return connected_; 752 return connected_;
761 } 753 }
762 754
763 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) { 755 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) {
764 DCHECK(connected_); 756 DCHECK(connected_);
765 DVLOG(1) << ENDPOINT << "Blocked frame received for stream: " 757 DVLOG(1) << ENDPOINT
766 << frame.stream_id; 758 << "Blocked frame received for stream: " << frame.stream_id;
767 last_blocked_frames_.push_back(frame); 759 last_blocked_frames_.push_back(frame);
768 return connected_; 760 return connected_;
769 } 761 }
770 762
771 void QuicConnection::OnPacketComplete() { 763 void QuicConnection::OnPacketComplete() {
772 // Don't do anything if this packet closed the connection. 764 // Don't do anything if this packet closed the connection.
773 if (!connected_) { 765 if (!connected_) {
774 ClearLastFrames(); 766 ClearLastFrames();
775 return; 767 return;
776 } 768 }
777 769
778 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") 770 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got")
779 << " packet " << last_header_.packet_sequence_number 771 << " packet " << last_header_.packet_sequence_number << " with "
780 << " with " << last_ack_frames_.size() << " acks, " 772 << last_ack_frames_.size() << " acks, "
781 << last_congestion_frames_.size() << " congestions, " 773 << last_congestion_frames_.size() << " congestions, "
782 << last_stop_waiting_frames_.size() << " stop_waiting, " 774 << last_stop_waiting_frames_.size() << " stop_waiting, "
783 << last_goaway_frames_.size() << " goaways, " 775 << last_goaway_frames_.size() << " goaways, "
784 << last_window_update_frames_.size() << " window updates, " 776 << last_window_update_frames_.size() << " window updates, "
785 << last_blocked_frames_.size() << " blocked, " 777 << last_blocked_frames_.size() << " blocked, "
786 << last_rst_frames_.size() << " rsts, " 778 << last_rst_frames_.size() << " rsts, " << last_close_frames_.size()
787 << last_close_frames_.size() << " closes, " 779 << " closes, " << last_stream_frames_.size() << " stream frames for "
788 << last_stream_frames_.size()
789 << " stream frames for "
790 << last_header_.public_header.connection_id; 780 << last_header_.public_header.connection_id;
791 781
792 // Call MaybeQueueAck() before recording the received packet, since we want 782 // Call MaybeQueueAck() before recording the received packet, since we want
793 // to trigger an ack if the newly received packet was previously missing. 783 // to trigger an ack if the newly received packet was previously missing.
794 MaybeQueueAck(); 784 MaybeQueueAck();
795 785
796 // Record received or revived packet to populate ack info correctly before 786 // Record received or revived packet to populate ack info correctly before
797 // processing stream frames, since the processing may result in a response 787 // processing stream frames, since the processing may result in a response
798 // packet with a bundled ack. 788 // packet with a bundled ack.
799 if (last_packet_revived_) { 789 if (last_packet_revived_) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 ack_alarm_->Cancel(); 838 ack_alarm_->Cancel();
849 } 839 }
850 840
851 UpdateStopWaitingCount(); 841 UpdateStopWaitingCount();
852 842
853 ClearLastFrames(); 843 ClearLastFrames();
854 } 844 }
855 845
856 void QuicConnection::MaybeQueueAck() { 846 void QuicConnection::MaybeQueueAck() {
857 // If the incoming packet was missing, send an ack immediately. 847 // If the incoming packet was missing, send an ack immediately.
858 ack_queued_ = received_packet_manager_.IsMissing( 848 ack_queued_ =
859 last_header_.packet_sequence_number); 849 received_packet_manager_.IsMissing(last_header_.packet_sequence_number);
860 850
861 if (!ack_queued_ && ShouldLastPacketInstigateAck()) { 851 if (!ack_queued_ && ShouldLastPacketInstigateAck()) {
862 if (ack_alarm_->IsSet()) { 852 if (ack_alarm_->IsSet()) {
863 ack_queued_ = true; 853 ack_queued_ = true;
864 } else { 854 } else {
865 // Send an ack much more quickly for crypto handshake packets. 855 // Send an ack much more quickly for crypto handshake packets.
866 QuicTime::Delta delayed_ack_time = sent_packet_manager_.DelayedAckTime(); 856 QuicTime::Delta delayed_ack_time = sent_packet_manager_.DelayedAckTime();
867 if (last_stream_frames_.size() == 1 && 857 if (last_stream_frames_.size() == 1 &&
868 last_stream_frames_[0].stream_id == kCryptoStreamId) { 858 last_stream_frames_[0].stream_id == kCryptoStreamId) {
869 delayed_ack_time = QuicTime::Delta::Zero(); 859 delayed_ack_time = QuicTime::Delta::Zero();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); 892 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_);
903 } 893 }
904 894
905 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { 895 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() {
906 QuicStopWaitingFrame stop_waiting; 896 QuicStopWaitingFrame stop_waiting;
907 UpdateStopWaiting(&stop_waiting); 897 UpdateStopWaiting(&stop_waiting);
908 return new QuicStopWaitingFrame(stop_waiting); 898 return new QuicStopWaitingFrame(stop_waiting);
909 } 899 }
910 900
911 bool QuicConnection::ShouldLastPacketInstigateAck() const { 901 bool QuicConnection::ShouldLastPacketInstigateAck() const {
912 if (!last_stream_frames_.empty() || 902 if (!last_stream_frames_.empty() || !last_goaway_frames_.empty() ||
913 !last_goaway_frames_.empty() || 903 !last_rst_frames_.empty() || !last_window_update_frames_.empty() ||
914 !last_rst_frames_.empty() ||
915 !last_window_update_frames_.empty() ||
916 !last_blocked_frames_.empty()) { 904 !last_blocked_frames_.empty()) {
917 return true; 905 return true;
918 } 906 }
919 907
920 if (!last_ack_frames_.empty() && 908 if (!last_ack_frames_.empty() &&
921 last_ack_frames_.back().received_info.is_truncated) { 909 last_ack_frames_.back().received_info.is_truncated) {
922 return true; 910 return true;
923 } 911 }
924 return false; 912 return false;
925 } 913 }
926 914
927 void QuicConnection::UpdateStopWaitingCount() { 915 void QuicConnection::UpdateStopWaitingCount() {
928 if (last_ack_frames_.empty()) { 916 if (last_ack_frames_.empty()) {
929 return; 917 return;
930 } 918 }
931 919
932 // If the peer is still waiting for a packet that we are no longer planning to 920 // If the peer is still waiting for a packet that we are no longer planning to
933 // send, send an ack to raise the high water mark. 921 // send, send an ack to raise the high water mark.
934 if (!last_ack_frames_.back().received_info.missing_packets.empty() && 922 if (!last_ack_frames_.back().received_info.missing_packets.empty() &&
935 GetLeastUnacked() > 923 GetLeastUnacked() >
936 *last_ack_frames_.back().received_info.missing_packets.begin()) { 924 *last_ack_frames_.back().received_info.missing_packets.begin()) {
937 ++stop_waiting_count_; 925 ++stop_waiting_count_;
938 } else { 926 } else {
939 stop_waiting_count_ = 0; 927 stop_waiting_count_ = 0;
940 } 928 }
941 } 929 }
942 930
943 QuicPacketSequenceNumber QuicConnection::GetLeastUnacked() const { 931 QuicPacketSequenceNumber QuicConnection::GetLeastUnacked() const {
944 return sent_packet_manager_.HasUnackedPackets() ? 932 return sent_packet_manager_.HasUnackedPackets()
945 sent_packet_manager_.GetLeastUnackedSentPacket() : 933 ? sent_packet_manager_.GetLeastUnackedSentPacket()
946 packet_creator_.sequence_number() + 1; 934 : packet_creator_.sequence_number() + 1;
947 } 935 }
948 936
949 void QuicConnection::MaybeSendInResponseToPacket() { 937 void QuicConnection::MaybeSendInResponseToPacket() {
950 if (!connected_) { 938 if (!connected_) {
951 return; 939 return;
952 } 940 }
953 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK); 941 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK);
954 942
955 // Now that we have received an ack, we might be able to send packets which 943 // Now that we have received an ack, we might be able to send packets which
956 // are queued locally, or drain streams which are blocked. 944 // are queued locally, or drain streams which are blocked.
957 QuicTime::Delta delay = sent_packet_manager_.TimeUntilSend( 945 QuicTime::Delta delay =
958 time_of_last_received_packet_, NOT_RETRANSMISSION, 946 sent_packet_manager_.TimeUntilSend(time_of_last_received_packet_,
959 HAS_RETRANSMITTABLE_DATA); 947 NOT_RETRANSMISSION,
948 HAS_RETRANSMITTABLE_DATA);
960 if (delay.IsZero()) { 949 if (delay.IsZero()) {
961 send_alarm_->Cancel(); 950 send_alarm_->Cancel();
962 WriteIfNotBlocked(); 951 WriteIfNotBlocked();
963 } else if (!delay.IsInfinite()) { 952 } else if (!delay.IsInfinite()) {
964 send_alarm_->Cancel(); 953 send_alarm_->Cancel();
965 send_alarm_->Set(time_of_last_received_packet_.Add(delay)); 954 send_alarm_->Set(time_of_last_received_packet_.Add(delay));
966 } 955 }
967 } 956 }
968 957
969 void QuicConnection::SendVersionNegotiationPacket() { 958 void QuicConnection::SendVersionNegotiationPacket() {
970 // TODO(alyssar): implement zero server state negotiation. 959 // TODO(alyssar): implement zero server state negotiation.
971 pending_version_negotiation_packet_ = true; 960 pending_version_negotiation_packet_ = true;
972 if (writer_->IsWriteBlocked()) { 961 if (writer_->IsWriteBlocked()) {
973 visitor_->OnWriteBlocked(); 962 visitor_->OnWriteBlocked();
974 return; 963 return;
975 } 964 }
976 scoped_ptr<QuicEncryptedPacket> version_packet( 965 scoped_ptr<QuicEncryptedPacket> version_packet(
977 packet_creator_.SerializeVersionNegotiationPacket( 966 packet_creator_.SerializeVersionNegotiationPacket(
978 framer_.supported_versions())); 967 framer_.supported_versions()));
979 WriteResult result = writer_->WritePacket( 968 WriteResult result = writer_->WritePacket(version_packet->data(),
980 version_packet->data(), version_packet->length(), 969 version_packet->length(),
981 self_address().address(), peer_address()); 970 self_address().address(),
971 peer_address());
982 972
983 if (result.status == WRITE_STATUS_ERROR) { 973 if (result.status == WRITE_STATUS_ERROR) {
984 // We can't send an error as the socket is presumably borked. 974 // We can't send an error as the socket is presumably borked.
985 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); 975 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
986 return; 976 return;
987 } 977 }
988 if (result.status == WRITE_STATUS_BLOCKED) { 978 if (result.status == WRITE_STATUS_BLOCKED) {
989 visitor_->OnWriteBlocked(); 979 visitor_->OnWriteBlocked();
990 if (writer_->IsWriteBlockedDataBuffered()) { 980 if (writer_->IsWriteBlockedDataBuffered()) {
991 pending_version_negotiation_packet_ = false; 981 pending_version_negotiation_packet_ = false;
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 MaybeSendInResponseToPacket(); 1112 MaybeSendInResponseToPacket();
1123 SetPingAlarm(); 1113 SetPingAlarm();
1124 } 1114 }
1125 1115
1126 void QuicConnection::OnCanWrite() { 1116 void QuicConnection::OnCanWrite() {
1127 DCHECK(!writer_->IsWriteBlocked()); 1117 DCHECK(!writer_->IsWriteBlocked());
1128 1118
1129 WriteQueuedPackets(); 1119 WriteQueuedPackets();
1130 WritePendingRetransmissions(); 1120 WritePendingRetransmissions();
1131 1121
1132 IsHandshake pending_handshake = visitor_->HasPendingHandshake() ? 1122 IsHandshake pending_handshake =
1133 IS_HANDSHAKE : NOT_HANDSHAKE; 1123 visitor_->HasPendingHandshake() ? IS_HANDSHAKE : NOT_HANDSHAKE;
1134 // Sending queued packets may have caused the socket to become write blocked, 1124 // Sending queued packets may have caused the socket to become write blocked,
1135 // or the congestion manager to prohibit sending. If we've sent everything 1125 // or the congestion manager to prohibit sending. If we've sent everything
1136 // we had queued and we're still not blocked, let the visitor know it can 1126 // we had queued and we're still not blocked, let the visitor know it can
1137 // write more. 1127 // write more.
1138 if (!CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, 1128 if (!CanWrite(
1139 pending_handshake)) { 1129 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, pending_handshake)) {
1140 return; 1130 return;
1141 } 1131 }
1142 1132
1143 { // Limit the scope of the bundler. 1133 { // Limit the scope of the bundler.
1144 // Set |include_ack| to false in bundler; ack inclusion happens elsewhere. 1134 // Set |include_ack| to false in bundler; ack inclusion happens elsewhere.
1145 ScopedPacketBundler bundler(this, NO_ACK); 1135 ScopedPacketBundler bundler(this, NO_ACK);
1146 visitor_->OnCanWrite(); 1136 visitor_->OnCanWrite();
1147 } 1137 }
1148 1138
1149 // After the visitor writes, it may have caused the socket to become write 1139 // After the visitor writes, it may have caused the socket to become write
1150 // blocked or the congestion manager to prohibit sending, so check again. 1140 // blocked or the congestion manager to prohibit sending, so check again.
1151 pending_handshake = visitor_->HasPendingHandshake() ? 1141 pending_handshake =
1152 IS_HANDSHAKE : NOT_HANDSHAKE; 1142 visitor_->HasPendingHandshake() ? IS_HANDSHAKE : NOT_HANDSHAKE;
1153 if (visitor_->HasPendingWrites() && !resume_writes_alarm_->IsSet() && 1143 if (visitor_->HasPendingWrites() && !resume_writes_alarm_->IsSet() &&
1154 CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, 1144 CanWrite(
1155 pending_handshake)) { 1145 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, pending_handshake)) {
1156 // We're not write blocked, but some stream didn't write out all of its 1146 // We're not write blocked, but some stream didn't write out all of its
1157 // bytes. Register for 'immediate' resumption so we'll keep writing after 1147 // bytes. Register for 'immediate' resumption so we'll keep writing after
1158 // other connections and events have had a chance to use the thread. 1148 // other connections and events have had a chance to use the thread.
1159 resume_writes_alarm_->Set(clock_->ApproximateNow()); 1149 resume_writes_alarm_->Set(clock_->ApproximateNow());
1160 } 1150 }
1161 } 1151 }
1162 1152
1163 void QuicConnection::WriteIfNotBlocked() { 1153 void QuicConnection::WriteIfNotBlocked() {
1164 if (!writer_->IsWriteBlocked()) { 1154 if (!writer_->IsWriteBlocked()) {
1165 OnCanWrite(); 1155 OnCanWrite();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 } 1195 }
1206 } 1196 }
1207 1197
1208 void QuicConnection::WritePendingRetransmissions() { 1198 void QuicConnection::WritePendingRetransmissions() {
1209 // Keep writing as long as there's a pending retransmission which can be 1199 // Keep writing as long as there's a pending retransmission which can be
1210 // written. 1200 // written.
1211 while (sent_packet_manager_.HasPendingRetransmissions()) { 1201 while (sent_packet_manager_.HasPendingRetransmissions()) {
1212 const QuicSentPacketManager::PendingRetransmission pending = 1202 const QuicSentPacketManager::PendingRetransmission pending =
1213 sent_packet_manager_.NextPendingRetransmission(); 1203 sent_packet_manager_.NextPendingRetransmission();
1214 if (GetPacketType(&pending.retransmittable_frames) == NORMAL && 1204 if (GetPacketType(&pending.retransmittable_frames) == NORMAL &&
1215 !CanWrite(pending.transmission_type, HAS_RETRANSMITTABLE_DATA, 1205 !CanWrite(pending.transmission_type,
1206 HAS_RETRANSMITTABLE_DATA,
1216 pending.retransmittable_frames.HasCryptoHandshake())) { 1207 pending.retransmittable_frames.HasCryptoHandshake())) {
1217 break; 1208 break;
1218 } 1209 }
1219 1210
1220 // Re-packetize the frames with a new sequence number for retransmission. 1211 // Re-packetize the frames with a new sequence number for retransmission.
1221 // Retransmitted data packets do not use FEC, even when it's enabled. 1212 // Retransmitted data packets do not use FEC, even when it's enabled.
1222 // Retransmitted packets use the same sequence number length as the 1213 // Retransmitted packets use the same sequence number length as the
1223 // original. 1214 // original.
1224 // Flush the packet creator before making a new packet. 1215 // Flush the packet creator before making a new packet.
1225 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that 1216 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that
1226 // does not require the creator to be flushed. 1217 // does not require the creator to be flushed.
1227 Flush(); 1218 Flush();
1228 SerializedPacket serialized_packet = packet_creator_.ReserializeAllFrames( 1219 SerializedPacket serialized_packet = packet_creator_.ReserializeAllFrames(
1229 pending.retransmittable_frames.frames(), 1220 pending.retransmittable_frames.frames(),
1230 pending.sequence_number_length); 1221 pending.sequence_number_length);
1231 1222
1232 DVLOG(1) << ENDPOINT << "Retransmitting " << pending.sequence_number 1223 DVLOG(1) << ENDPOINT << "Retransmitting " << pending.sequence_number
1233 << " as " << serialized_packet.sequence_number; 1224 << " as " << serialized_packet.sequence_number;
1234 if (debug_visitor_) { 1225 if (debug_visitor_) {
1235 debug_visitor_->OnPacketRetransmitted( 1226 debug_visitor_->OnPacketRetransmitted(pending.sequence_number,
1236 pending.sequence_number, serialized_packet.sequence_number); 1227 serialized_packet.sequence_number);
1237 } 1228 }
1238 sent_packet_manager_.OnRetransmittedPacket( 1229 sent_packet_manager_.OnRetransmittedPacket(
1239 pending.sequence_number, serialized_packet.sequence_number); 1230 pending.sequence_number, serialized_packet.sequence_number);
1240 1231
1241 SendOrQueuePacket(pending.retransmittable_frames.encryption_level(), 1232 SendOrQueuePacket(pending.retransmittable_frames.encryption_level(),
1242 serialized_packet, 1233 serialized_packet,
1243 pending.transmission_type); 1234 pending.transmission_type);
1244 } 1235 }
1245 } 1236 }
1246 1237
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 send_alarm_->Cancel(); 1294 send_alarm_->Cancel();
1304 send_alarm_->Set(now.Add(delay)); 1295 send_alarm_->Set(now.Add(delay));
1305 DVLOG(1) << "Delaying sending."; 1296 DVLOG(1) << "Delaying sending.";
1306 return false; 1297 return false;
1307 } 1298 }
1308 return true; 1299 return true;
1309 } 1300 }
1310 1301
1311 bool QuicConnection::WritePacket(QueuedPacket packet) { 1302 bool QuicConnection::WritePacket(QueuedPacket packet) {
1312 QuicPacketSequenceNumber sequence_number = packet.sequence_number; 1303 QuicPacketSequenceNumber sequence_number = packet.sequence_number;
1313 if (ShouldDiscardPacket(packet.encryption_level, 1304 if (ShouldDiscardPacket(
1314 sequence_number, 1305 packet.encryption_level, sequence_number, packet.retransmittable)) {
1315 packet.retransmittable)) {
1316 ++stats_.packets_discarded; 1306 ++stats_.packets_discarded;
1317 return true; 1307 return true;
1318 } 1308 }
1319 1309
1320 // If the packet is CONNECTION_CLOSE, we need to try to send it immediately 1310 // If the packet is CONNECTION_CLOSE, we need to try to send it immediately
1321 // and encrypt it to hand it off to TimeWaitListManager. 1311 // and encrypt it to hand it off to TimeWaitListManager.
1322 // If the packet is QUEUED, we don't re-consult the congestion control. 1312 // If the packet is QUEUED, we don't re-consult the congestion control.
1323 // This ensures packets are sent in sequence number order. 1313 // This ensures packets are sent in sequence number order.
1324 // TODO(ianswett): The congestion control should have been consulted before 1314 // TODO(ianswett): The congestion control should have been consulted before
1325 // serializing the packet, so this could be turned into a LOG_IF(DFATAL). 1315 // serializing the packet, so this could be turned into a LOG_IF(DFATAL).
1326 if (packet.type == NORMAL && !CanWrite(packet.transmission_type, 1316 if (packet.type == NORMAL &&
1327 packet.retransmittable, 1317 !CanWrite(
1328 packet.handshake)) { 1318 packet.transmission_type, packet.retransmittable, packet.handshake)) {
1329 return false; 1319 return false;
1330 } 1320 }
1331 1321
1332 // Some encryption algorithms require the packet sequence numbers not be 1322 // Some encryption algorithms require the packet sequence numbers not be
1333 // repeated. 1323 // repeated.
1334 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); 1324 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number);
1335 sequence_number_of_last_sent_packet_ = sequence_number; 1325 sequence_number_of_last_sent_packet_ = sequence_number;
1336 1326
1337 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( 1327 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(
1338 packet.encryption_level, sequence_number, *packet.packet); 1328 packet.encryption_level, sequence_number, *packet.packet);
(...skipping 16 matching lines...) Expand all
1355 if (writer_->IsWriteBlocked()) { 1345 if (writer_->IsWriteBlocked()) {
1356 visitor_->OnWriteBlocked(); 1346 visitor_->OnWriteBlocked();
1357 return true; 1347 return true;
1358 } 1348 }
1359 } else { 1349 } else {
1360 encrypted_deleter.reset(encrypted); 1350 encrypted_deleter.reset(encrypted);
1361 } 1351 }
1362 1352
1363 LOG_IF(DFATAL, encrypted->length() > options()->max_packet_length) 1353 LOG_IF(DFATAL, encrypted->length() > options()->max_packet_length)
1364 << "Writing an encrypted packet larger than max_packet_length:" 1354 << "Writing an encrypted packet larger than max_packet_length:"
1365 << options()->max_packet_length << " encrypted length: " 1355 << options()->max_packet_length
1366 << encrypted->length(); 1356 << " encrypted length: " << encrypted->length();
1367 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number 1357 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number << " : "
1368 << " : " << (packet.packet->is_fec_packet() ? "FEC " : 1358 << (packet.packet->is_fec_packet()
1369 (packet.retransmittable == HAS_RETRANSMITTABLE_DATA 1359 ? "FEC "
1370 ? "data bearing " : " ack only ")) 1360 : (packet.retransmittable == HAS_RETRANSMITTABLE_DATA
1371 << ", encryption level: " 1361 ? "data bearing "
1362 : " ack only ")) << ", encryption level: "
1372 << QuicUtils::EncryptionLevelToString(packet.encryption_level) 1363 << QuicUtils::EncryptionLevelToString(packet.encryption_level)
1373 << ", length:" << packet.packet->length() << ", encrypted length:" 1364 << ", length:" << packet.packet->length()
1374 << encrypted->length(); 1365 << ", encrypted length:" << encrypted->length();
1375 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl 1366 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl
1376 << QuicUtils::StringToHexASCIIDump(packet.packet->AsStringPiece()); 1367 << QuicUtils::StringToHexASCIIDump(packet.packet->AsStringPiece());
1377 1368
1378 DCHECK(encrypted->length() <= kMaxPacketSize || 1369 DCHECK(encrypted->length() <= kMaxPacketSize ||
1379 FLAGS_quic_allow_oversized_packets_for_test) 1370 FLAGS_quic_allow_oversized_packets_for_test)
1380 << "Packet " << sequence_number << " will not be read; too large: " 1371 << "Packet " << sequence_number
1381 << packet.packet->length() << " " << encrypted->length() << " " 1372 << " will not be read; too large: " << packet.packet->length() << " "
1373 << encrypted->length() << " "
1382 << " close: " << (packet.type == CONNECTION_CLOSE ? "yes" : "no"); 1374 << " close: " << (packet.type == CONNECTION_CLOSE ? "yes" : "no");
1383 1375
1384 DCHECK(pending_write_.get() == NULL); 1376 DCHECK(pending_write_.get() == NULL);
1385 pending_write_.reset(new QueuedPacket(packet)); 1377 pending_write_.reset(new QueuedPacket(packet));
1386 1378
1387 WriteResult result = writer_->WritePacket(encrypted->data(), 1379 WriteResult result = writer_->WritePacket(encrypted->data(),
1388 encrypted->length(), 1380 encrypted->length(),
1389 self_address().address(), 1381 self_address().address(),
1390 peer_address()); 1382 peer_address());
1391 if (result.error_code == ERR_IO_PENDING) { 1383 if (result.error_code == ERR_IO_PENDING) {
(...skipping 24 matching lines...) Expand all
1416 return true; 1408 return true;
1417 } 1409 }
1418 return false; 1410 return false;
1419 } 1411 }
1420 1412
1421 bool QuicConnection::ShouldDiscardPacket( 1413 bool QuicConnection::ShouldDiscardPacket(
1422 EncryptionLevel level, 1414 EncryptionLevel level,
1423 QuicPacketSequenceNumber sequence_number, 1415 QuicPacketSequenceNumber sequence_number,
1424 HasRetransmittableData retransmittable) { 1416 HasRetransmittableData retransmittable) {
1425 if (!connected_) { 1417 if (!connected_) {
1426 DVLOG(1) << ENDPOINT 1418 DVLOG(1) << ENDPOINT << "Not sending packet as connection is disconnected.";
1427 << "Not sending packet as connection is disconnected.";
1428 return true; 1419 return true;
1429 } 1420 }
1430 1421
1431 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE && 1422 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE &&
1432 level == ENCRYPTION_NONE) { 1423 level == ENCRYPTION_NONE) {
1433 // Drop packets that are NULL encrypted since the peer won't accept them 1424 // Drop packets that are NULL encrypted since the peer won't accept them
1434 // anymore. 1425 // anymore.
1435 DVLOG(1) << ENDPOINT << "Dropping packet: " << sequence_number 1426 DVLOG(1) << ENDPOINT << "Dropping packet: " << sequence_number
1436 << " since the packet is NULL encrypted."; 1427 << " since the packet is NULL encrypted.";
1437 sent_packet_manager_.DiscardUnackedPacket(sequence_number); 1428 sent_packet_manager_.DiscardUnackedPacket(sequence_number);
1438 return true; 1429 return true;
1439 } 1430 }
1440 1431
1441 // If the packet has been discarded before sending, don't send it. 1432 // If the packet has been discarded before sending, don't send it.
1442 // This occurs if a packet gets serialized, queued, then discarded. 1433 // This occurs if a packet gets serialized, queued, then discarded.
1443 if (!sent_packet_manager_.IsUnacked(sequence_number)) { 1434 if (!sent_packet_manager_.IsUnacked(sequence_number)) {
1444 DVLOG(1) << ENDPOINT << "Dropping packet before sending: " 1435 DVLOG(1) << ENDPOINT
1445 << sequence_number << " since it has already been discarded."; 1436 << "Dropping packet before sending: " << sequence_number
1437 << " since it has already been discarded.";
1446 return true; 1438 return true;
1447 } 1439 }
1448 1440
1449 if (retransmittable == HAS_RETRANSMITTABLE_DATA && 1441 if (retransmittable == HAS_RETRANSMITTABLE_DATA &&
1450 !sent_packet_manager_.HasRetransmittableFrames(sequence_number)) { 1442 !sent_packet_manager_.HasRetransmittableFrames(sequence_number)) {
1451 DVLOG(1) << ENDPOINT << "Dropping packet: " << sequence_number 1443 DVLOG(1) << ENDPOINT << "Dropping packet: " << sequence_number
1452 << " since a previous transmission has been acked."; 1444 << " since a previous transmission has been acked.";
1453 sent_packet_manager_.DiscardUnackedPacket(sequence_number); 1445 sent_packet_manager_.DiscardUnackedPacket(sequence_number);
1454 return true; 1446 return true;
1455 } 1447 }
1456 1448
1457 return false; 1449 return false;
1458 } 1450 }
1459 1451
1460 bool QuicConnection::OnPacketSent(WriteResult result) { 1452 bool QuicConnection::OnPacketSent(WriteResult result) {
1461 DCHECK_NE(WRITE_STATUS_BLOCKED, result.status); 1453 DCHECK_NE(WRITE_STATUS_BLOCKED, result.status);
1462 if (pending_write_.get() == NULL) { 1454 if (pending_write_.get() == NULL) {
1463 LOG(DFATAL) << "OnPacketSent called without a pending write."; 1455 LOG(DFATAL) << "OnPacketSent called without a pending write.";
1464 return false; 1456 return false;
1465 } 1457 }
1466 1458
1467 QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number; 1459 QuicPacketSequenceNumber sequence_number = pending_write_->sequence_number;
1468 TransmissionType transmission_type = pending_write_->transmission_type; 1460 TransmissionType transmission_type = pending_write_->transmission_type;
1469 HasRetransmittableData retransmittable = pending_write_->retransmittable; 1461 HasRetransmittableData retransmittable = pending_write_->retransmittable;
1470 size_t length = pending_write_->length; 1462 size_t length = pending_write_->length;
1471 pending_write_.reset(); 1463 pending_write_.reset();
1472 1464
1473 if (result.status == WRITE_STATUS_ERROR) { 1465 if (result.status == WRITE_STATUS_ERROR) {
1474 DVLOG(1) << "Write failed with error: " << result.error_code << " (" 1466 DVLOG(1) << "Write failed with error: " << result.error_code << " ("
1475 << ErrorToString(result.error_code) << ")"; 1467 << ErrorToString(result.error_code) << ")";
1476 // We can't send an error as the socket is presumably borked. 1468 // We can't send an error as the socket is presumably borked.
1477 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); 1469 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
1478 return false; 1470 return false;
1479 } 1471 }
1480 1472
1481 QuicTime now = clock_->Now(); 1473 QuicTime now = clock_->Now();
1482 if (transmission_type == NOT_RETRANSMISSION) { 1474 if (transmission_type == NOT_RETRANSMISSION) {
1483 time_of_last_sent_new_packet_ = now; 1475 time_of_last_sent_new_packet_ = now;
1484 } 1476 }
1485 SetPingAlarm(); 1477 SetPingAlarm();
1486 DVLOG(1) << ENDPOINT << "time of last sent packet: " 1478 DVLOG(1) << ENDPOINT
1487 << now.ToDebuggingValue(); 1479 << "time of last sent packet: " << now.ToDebuggingValue();
1488 1480
1489 // TODO(ianswett): Change the sequence number length and other packet creator 1481 // TODO(ianswett): Change the sequence number length and other packet creator
1490 // options by a more explicit API than setting a struct value directly. 1482 // options by a more explicit API than setting a struct value directly.
1491 packet_creator_.UpdateSequenceNumberLength( 1483 packet_creator_.UpdateSequenceNumberLength(
1492 received_packet_manager_.least_packet_awaited_by_peer(), 1484 received_packet_manager_.least_packet_awaited_by_peer(),
1493 sent_packet_manager_.GetCongestionWindow()); 1485 sent_packet_manager_.GetCongestionWindow());
1494 1486
1495 bool reset_retransmission_alarm = 1487 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent(
1496 sent_packet_manager_.OnPacketSent(sequence_number, now, length, 1488 sequence_number, now, length, transmission_type, retransmittable);
1497 transmission_type, retransmittable);
1498 1489
1499 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { 1490 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
1500 retransmission_alarm_->Cancel(); 1491 retransmission_alarm_->Cancel();
1501 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); 1492 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime();
1502 if (retransmission_time != QuicTime::Zero()) { 1493 if (retransmission_time != QuicTime::Zero()) {
1503 retransmission_alarm_->Set(retransmission_time); 1494 retransmission_alarm_->Set(retransmission_time);
1504 } 1495 }
1505 } 1496 }
1506 1497
1507 stats_.bytes_sent += result.bytes_written; 1498 stats_.bytes_sent += result.bytes_written;
1508 ++stats_.packets_sent; 1499 ++stats_.packets_sent;
1509 1500
1510 if (transmission_type != NOT_RETRANSMISSION) { 1501 if (transmission_type != NOT_RETRANSMISSION) {
1511 stats_.bytes_retransmitted += result.bytes_written; 1502 stats_.bytes_retransmitted += result.bytes_written;
1512 ++stats_.packets_retransmitted; 1503 ++stats_.packets_retransmitted;
1513 } 1504 }
1514 1505
1515 return true; 1506 return true;
1516 } 1507 }
1517 1508
1518 bool QuicConnection::OnSerializedPacket( 1509 bool QuicConnection::OnSerializedPacket(
1519 const SerializedPacket& serialized_packet) { 1510 const SerializedPacket& serialized_packet) {
1520 if (serialized_packet.retransmittable_frames) { 1511 if (serialized_packet.retransmittable_frames) {
1521 serialized_packet.retransmittable_frames-> 1512 serialized_packet.retransmittable_frames->set_encryption_level(
1522 set_encryption_level(encryption_level_); 1513 encryption_level_);
1523 } 1514 }
1524 sent_packet_manager_.OnSerializedPacket(serialized_packet); 1515 sent_packet_manager_.OnSerializedPacket(serialized_packet);
1525 // The TransmissionType is NOT_RETRANSMISSION because all retransmissions 1516 // The TransmissionType is NOT_RETRANSMISSION because all retransmissions
1526 // serialize packets and invoke SendOrQueuePacket directly. 1517 // serialize packets and invoke SendOrQueuePacket directly.
1527 return SendOrQueuePacket(encryption_level_, 1518 return SendOrQueuePacket(
1528 serialized_packet, 1519 encryption_level_, serialized_packet, NOT_RETRANSMISSION);
1529 NOT_RETRANSMISSION);
1530 } 1520 }
1531 1521
1532 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, 1522 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
1533 const SerializedPacket& packet, 1523 const SerializedPacket& packet,
1534 TransmissionType transmission_type) { 1524 TransmissionType transmission_type) {
1535 if (packet.packet == NULL) { 1525 if (packet.packet == NULL) {
1536 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket"; 1526 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket";
1537 return true; 1527 return true;
1538 } 1528 }
1539 1529
1540 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number, 1530 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number,
1541 packet.entropy_hash); 1531 packet.entropy_hash);
1542 QueuedPacket queued_packet(packet, level, transmission_type); 1532 QueuedPacket queued_packet(packet, level, transmission_type);
1543 // If there are already queued packets, put this at the end, 1533 // If there are already queued packets, put this at the end,
1544 // unless it's ConnectionClose, in which case it is written immediately. 1534 // unless it's ConnectionClose, in which case it is written immediately.
1545 if ((queued_packet.type == CONNECTION_CLOSE || queued_packets_.empty()) && 1535 if ((queued_packet.type == CONNECTION_CLOSE || queued_packets_.empty()) &&
1546 WritePacket(queued_packet)) { 1536 WritePacket(queued_packet)) {
1547 delete packet.packet; 1537 delete packet.packet;
1548 return true; 1538 return true;
1549 } 1539 }
1550 queued_packet.type = QUEUED; 1540 queued_packet.type = QUEUED;
1551 queued_packets_.push_back(queued_packet); 1541 queued_packets_.push_back(queued_packet);
1552 return false; 1542 return false;
1553 } 1543 }
1554 1544
1555 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { 1545 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) {
1556 stop_waiting->least_unacked = GetLeastUnacked(); 1546 stop_waiting->least_unacked = GetLeastUnacked();
1557 stop_waiting->entropy_hash = sent_entropy_manager_.EntropyHash( 1547 stop_waiting->entropy_hash =
1558 stop_waiting->least_unacked - 1); 1548 sent_entropy_manager_.EntropyHash(stop_waiting->least_unacked - 1);
1559 } 1549 }
1560 1550
1561 void QuicConnection::SendPing() { 1551 void QuicConnection::SendPing() {
1562 if (retransmission_alarm_->IsSet()) { 1552 if (retransmission_alarm_->IsSet()) {
1563 return; 1553 return;
1564 } 1554 }
1565 if (version() <= QUIC_VERSION_17) { 1555 if (version() <= QUIC_VERSION_17) {
1566 // TODO(rch): remove this when we remove version 17. 1556 // TODO(rch): remove this when we remove version 17.
1567 // This is a horrible hideous hack which we should not support. 1557 // This is a horrible hideous hack which we should not support.
1568 IOVector data; 1558 IOVector data;
(...skipping 11 matching lines...) Expand all
1580 1570
1581 void QuicConnection::SendAck() { 1571 void QuicConnection::SendAck() {
1582 ack_alarm_->Cancel(); 1572 ack_alarm_->Cancel();
1583 stop_waiting_count_ = 0; 1573 stop_waiting_count_ = 0;
1584 // TODO(rch): delay this until the CreateFeedbackFrame 1574 // TODO(rch): delay this until the CreateFeedbackFrame
1585 // method is invoked. This requires changes SetShouldSendAck 1575 // method is invoked. This requires changes SetShouldSendAck
1586 // to be a no-arg method, and re-jiggering its implementation. 1576 // to be a no-arg method, and re-jiggering its implementation.
1587 bool send_feedback = false; 1577 bool send_feedback = false;
1588 if (received_packet_manager_.GenerateCongestionFeedback( 1578 if (received_packet_manager_.GenerateCongestionFeedback(
1589 &outgoing_congestion_feedback_)) { 1579 &outgoing_congestion_feedback_)) {
1590 DVLOG(1) << ENDPOINT << "Sending feedback: " 1580 DVLOG(1) << ENDPOINT
1591 << outgoing_congestion_feedback_; 1581 << "Sending feedback: " << outgoing_congestion_feedback_;
1592 send_feedback = true; 1582 send_feedback = true;
1593 } 1583 }
1594 1584
1595 packet_generator_.SetShouldSendAck(send_feedback, 1585 packet_generator_.SetShouldSendAck(send_feedback,
1596 version() > QUIC_VERSION_15); 1586 version() > QUIC_VERSION_15);
1597 } 1587 }
1598 1588
1599 void QuicConnection::OnRetransmissionTimeout() { 1589 void QuicConnection::OnRetransmissionTimeout() {
1600 if (!sent_packet_manager_.HasUnackedPackets()) { 1590 if (!sent_packet_manager_.HasUnackedPackets()) {
1601 return; 1591 return;
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 if (connected_) { 1734 if (connected_) {
1745 // It's possible that while sending the connection close packet, we get a 1735 // It's possible that while sending the connection close packet, we get a
1746 // socket error and disconnect right then and there. Avoid a double 1736 // socket error and disconnect right then and there. Avoid a double
1747 // disconnect in that case. 1737 // disconnect in that case.
1748 CloseConnection(error, false); 1738 CloseConnection(error, false);
1749 } 1739 }
1750 } 1740 }
1751 1741
1752 void QuicConnection::SendConnectionClosePacket(QuicErrorCode error, 1742 void QuicConnection::SendConnectionClosePacket(QuicErrorCode error,
1753 const string& details) { 1743 const string& details) {
1754 DVLOG(1) << ENDPOINT << "Force closing " << connection_id() 1744 DVLOG(1) << ENDPOINT << "Force closing " << connection_id() << " with error "
1755 << " with error " << QuicUtils::ErrorToString(error) 1745 << QuicUtils::ErrorToString(error) << " (" << error << ") "
1756 << " (" << error << ") " << details; 1746 << details;
1757 ScopedPacketBundler ack_bundler(this, SEND_ACK); 1747 ScopedPacketBundler ack_bundler(this, SEND_ACK);
1758 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(); 1748 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame();
1759 frame->error_code = error; 1749 frame->error_code = error;
1760 frame->error_details = details; 1750 frame->error_details = details;
1761 packet_generator_.AddControlFrame(QuicFrame(frame)); 1751 packet_generator_.AddControlFrame(QuicFrame(frame));
1762 Flush(); 1752 Flush();
1763 } 1753 }
1764 1754
1765 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) { 1755 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) {
1766 if (!connected_) { 1756 if (!connected_) {
1767 DLOG(DFATAL) << "Error: attempt to close an already closed connection" 1757 DLOG(DFATAL) << "Error: attempt to close an already closed connection"
1768 << base::debug::StackTrace().ToString(); 1758 << base::debug::StackTrace().ToString();
1769 return; 1759 return;
1770 } 1760 }
1771 connected_ = false; 1761 connected_ = false;
1772 visitor_->OnConnectionClosed(error, from_peer); 1762 visitor_->OnConnectionClosed(error, from_peer);
1773 // Cancel the alarms so they don't trigger any action now that the 1763 // Cancel the alarms so they don't trigger any action now that the
1774 // connection is closed. 1764 // connection is closed.
1775 ack_alarm_->Cancel(); 1765 ack_alarm_->Cancel();
1776 resume_writes_alarm_->Cancel(); 1766 resume_writes_alarm_->Cancel();
1777 retransmission_alarm_->Cancel(); 1767 retransmission_alarm_->Cancel();
1778 send_alarm_->Cancel(); 1768 send_alarm_->Cancel();
1779 timeout_alarm_->Cancel(); 1769 timeout_alarm_->Cancel();
1780 } 1770 }
1781 1771
1782 void QuicConnection::SendGoAway(QuicErrorCode error, 1772 void QuicConnection::SendGoAway(QuicErrorCode error,
1783 QuicStreamId last_good_stream_id, 1773 QuicStreamId last_good_stream_id,
1784 const string& reason) { 1774 const string& reason) {
1785 DVLOG(1) << ENDPOINT << "Going away with error " 1775 DVLOG(1) << ENDPOINT << "Going away with error "
1786 << QuicUtils::ErrorToString(error) 1776 << QuicUtils::ErrorToString(error) << " (" << error << ")";
1787 << " (" << error << ")";
1788 1777
1789 // Opportunistically bundle an ack with this outgoing packet. 1778 // Opportunistically bundle an ack with this outgoing packet.
1790 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1779 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK);
1791 packet_generator_.AddControlFrame( 1780 packet_generator_.AddControlFrame(
1792 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason))); 1781 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason)));
1793 } 1782 }
1794 1783
1795 void QuicConnection::CloseFecGroupsBefore( 1784 void QuicConnection::CloseFecGroupsBefore(
1796 QuicPacketSequenceNumber sequence_number) { 1785 QuicPacketSequenceNumber sequence_number) {
1797 FecGroupMap::iterator it = group_map_.begin(); 1786 FecGroupMap::iterator it = group_map_.begin();
(...skipping 13 matching lines...) Expand all
1811 delete fec_group; 1800 delete fec_group;
1812 it = next; 1801 it = next;
1813 } 1802 }
1814 } 1803 }
1815 1804
1816 void QuicConnection::Flush() { 1805 void QuicConnection::Flush() {
1817 packet_generator_.FlushAllQueuedFrames(); 1806 packet_generator_.FlushAllQueuedFrames();
1818 } 1807 }
1819 1808
1820 bool QuicConnection::HasQueuedData() const { 1809 bool QuicConnection::HasQueuedData() const {
1821 return pending_version_negotiation_packet_ || 1810 return pending_version_negotiation_packet_ || !queued_packets_.empty() ||
1822 !queued_packets_.empty() || packet_generator_.HasQueuedFrames(); 1811 packet_generator_.HasQueuedFrames();
1823 } 1812 }
1824 1813
1825 bool QuicConnection::CanWriteStreamData() { 1814 bool QuicConnection::CanWriteStreamData() {
1826 // Don't write stream data if there are negotiation or queued data packets 1815 // Don't write stream data if there are negotiation or queued data packets
1827 // to send. Otherwise, continue and bundle as many frames as possible. 1816 // to send. Otherwise, continue and bundle as many frames as possible.
1828 if (pending_version_negotiation_packet_ || !queued_packets_.empty()) { 1817 if (pending_version_negotiation_packet_ || !queued_packets_.empty()) {
1829 return false; 1818 return false;
1830 } 1819 }
1831 1820
1832 IsHandshake pending_handshake = visitor_->HasPendingHandshake() ? 1821 IsHandshake pending_handshake =
1833 IS_HANDSHAKE : NOT_HANDSHAKE; 1822 visitor_->HasPendingHandshake() ? IS_HANDSHAKE : NOT_HANDSHAKE;
1834 // Sending queued packets may have caused the socket to become write blocked, 1823 // Sending queued packets may have caused the socket to become write blocked,
1835 // or the congestion manager to prohibit sending. If we've sent everything 1824 // or the congestion manager to prohibit sending. If we've sent everything
1836 // we had queued and we're still not blocked, let the visitor know it can 1825 // we had queued and we're still not blocked, let the visitor know it can
1837 // write more. 1826 // write more.
1838 return ShouldGeneratePacket(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, 1827 return ShouldGeneratePacket(
1839 pending_handshake); 1828 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, pending_handshake);
1840 } 1829 }
1841 1830
1842 void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { 1831 void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) {
1843 if (timeout < idle_network_timeout_) { 1832 if (timeout < idle_network_timeout_) {
1844 idle_network_timeout_ = timeout; 1833 idle_network_timeout_ = timeout;
1845 CheckForTimeout(); 1834 CheckForTimeout();
1846 } else { 1835 } else {
1847 idle_network_timeout_ = timeout; 1836 idle_network_timeout_ = timeout;
1848 } 1837 }
1849 } 1838 }
1850 1839
1851 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { 1840 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) {
1852 if (timeout < overall_connection_timeout_) { 1841 if (timeout < overall_connection_timeout_) {
1853 overall_connection_timeout_ = timeout; 1842 overall_connection_timeout_ = timeout;
1854 CheckForTimeout(); 1843 CheckForTimeout();
1855 } else { 1844 } else {
1856 overall_connection_timeout_ = timeout; 1845 overall_connection_timeout_ = timeout;
1857 } 1846 }
1858 } 1847 }
1859 1848
1860 bool QuicConnection::CheckForTimeout() { 1849 bool QuicConnection::CheckForTimeout() {
1861 QuicTime now = clock_->ApproximateNow(); 1850 QuicTime now = clock_->ApproximateNow();
1862 QuicTime time_of_last_packet = max(time_of_last_received_packet_, 1851 QuicTime time_of_last_packet =
1863 time_of_last_sent_new_packet_); 1852 max(time_of_last_received_packet_, time_of_last_sent_new_packet_);
1864 1853
1865 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet| 1854 // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet|
1866 // is accurate time. However, this should not change the behavior of 1855 // is accurate time. However, this should not change the behavior of
1867 // timeout handling. 1856 // timeout handling.
1868 QuicTime::Delta delta = now.Subtract(time_of_last_packet); 1857 QuicTime::Delta delta = now.Subtract(time_of_last_packet);
1869 DVLOG(1) << ENDPOINT << "last packet " 1858 DVLOG(1) << ENDPOINT << "last packet "
1870 << time_of_last_packet.ToDebuggingValue() 1859 << time_of_last_packet.ToDebuggingValue()
1871 << " now:" << now.ToDebuggingValue() 1860 << " now:" << now.ToDebuggingValue()
1872 << " delta:" << delta.ToMicroseconds() 1861 << " delta:" << delta.ToMicroseconds()
1873 << " network_timeout: " << idle_network_timeout_.ToMicroseconds(); 1862 << " network_timeout: " << idle_network_timeout_.ToMicroseconds();
1874 if (delta >= idle_network_timeout_) { 1863 if (delta >= idle_network_timeout_) {
1875 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; 1864 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity.";
1876 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); 1865 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT);
1877 return true; 1866 return true;
1878 } 1867 }
1879 1868
1880 // Next timeout delta. 1869 // Next timeout delta.
1881 QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta); 1870 QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta);
1882 1871
1883 if (!overall_connection_timeout_.IsInfinite()) { 1872 if (!overall_connection_timeout_.IsInfinite()) {
1884 QuicTime::Delta connected_time = 1873 QuicTime::Delta connected_time =
1885 now.Subtract(stats_.connection_creation_time); 1874 now.Subtract(stats_.connection_creation_time);
1886 DVLOG(1) << ENDPOINT << "connection time: " 1875 DVLOG(1) << ENDPOINT
1887 << connected_time.ToMilliseconds() << " overall timeout: " 1876 << "connection time: " << connected_time.ToMilliseconds()
1877 << " overall timeout: "
1888 << overall_connection_timeout_.ToMilliseconds(); 1878 << overall_connection_timeout_.ToMilliseconds();
1889 if (connected_time >= overall_connection_timeout_) { 1879 if (connected_time >= overall_connection_timeout_) {
1890 DVLOG(1) << ENDPOINT << 1880 DVLOG(1) << ENDPOINT
1891 "Connection timedout due to overall connection timeout."; 1881 << "Connection timedout due to overall connection timeout.";
1892 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); 1882 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT);
1893 return true; 1883 return true;
1894 } 1884 }
1895 1885
1896 // Take the min timeout. 1886 // Take the min timeout.
1897 QuicTime::Delta connection_timeout = 1887 QuicTime::Delta connection_timeout =
1898 overall_connection_timeout_.Subtract(connected_time); 1888 overall_connection_timeout_.Subtract(connected_time);
1899 if (connection_timeout < timeout) { 1889 if (connection_timeout < timeout) {
1900 timeout = connection_timeout; 1890 timeout = connection_timeout;
1901 } 1891 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1945 // If we changed the generator's batch state, restore original batch state. 1935 // If we changed the generator's batch state, restore original batch state.
1946 if (!already_in_batch_mode_) { 1936 if (!already_in_batch_mode_) {
1947 DVLOG(1) << "Leaving Batch Mode."; 1937 DVLOG(1) << "Leaving Batch Mode.";
1948 connection_->packet_generator_.FinishBatchOperations(); 1938 connection_->packet_generator_.FinishBatchOperations();
1949 } 1939 }
1950 DCHECK_EQ(already_in_batch_mode_, 1940 DCHECK_EQ(already_in_batch_mode_,
1951 connection_->packet_generator_.InBatchMode()); 1941 connection_->packet_generator_.InBatchMode());
1952 } 1942 }
1953 1943
1954 } // namespace net 1944 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698