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

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

Issue 23691073: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Compiler/unittests fix Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_helper_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_connection.h" 5 #include "net/quic/quic_connection.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 15 matching lines...) Expand all
26 26
27 namespace net { 27 namespace net {
28 namespace { 28 namespace {
29 29
30 // The largest gap in packets we'll accept without closing the connection. 30 // The largest gap in packets we'll accept without closing the connection.
31 // This will likely have to be tuned. 31 // This will likely have to be tuned.
32 const QuicPacketSequenceNumber kMaxPacketGap = 5000; 32 const QuicPacketSequenceNumber kMaxPacketGap = 5000;
33 33
34 // We want to make sure if we get a large nack packet, we don't queue up too 34 // We want to make sure if we get a large nack packet, we don't queue up too
35 // many packets at once. 10 is arbitrary. 35 // many packets at once. 10 is arbitrary.
36 const int kMaxRetransmissionsPerAck = 10; 36 const size_t kMaxRetransmissionsPerAck = 10;
37 37
38 // TCP retransmits after 2 nacks. We allow for a third in case of out-of-order 38 // TCP retransmits after 2 nacks. We allow for a third in case of out-of-order
39 // delivery. 39 // delivery.
40 // TODO(ianswett): Change to match TCP's rule of retransmitting once an ack 40 // TODO(ianswett): Change to match TCP's rule of retransmitting once an ack
41 // at least 3 sequence numbers larger arrives. 41 // at least 3 sequence numbers larger arrives.
42 const size_t kNumberOfNacksBeforeRetransmission = 3; 42 const size_t kNumberOfNacksBeforeRetransmission = 3;
43 43
44 // Limit the number of packets we send per retransmission-alarm so we 44 // Limit the number of packets we send per retransmission-alarm so we
45 // eventually cede. 10 is arbitrary. 45 // eventually cede. 10 is arbitrary.
46 const size_t kMaxPacketsPerRetransmissionAlarm = 10; 46 const size_t kMaxPacketsPerRetransmissionAlarm = 10;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 virtual QuicTime OnAlarm() OVERRIDE { 119 virtual QuicTime OnAlarm() OVERRIDE {
120 connection_->CheckForTimeout(); 120 connection_->CheckForTimeout();
121 // Never reschedule the alarm, since CheckForTimeout does that. 121 // Never reschedule the alarm, since CheckForTimeout does that.
122 return QuicTime::Zero(); 122 return QuicTime::Zero();
123 } 123 }
124 124
125 private: 125 private:
126 QuicConnection* connection_; 126 QuicConnection* connection_;
127 }; 127 };
128 128
129 // Indicates if any of the frames are intended to be sent with FORCE.
130 // Returns true when one of the frames is a CONNECTION_CLOSE_FRAME.
131 net::QuicConnection::Force HasForcedFrames(
132 const RetransmittableFrames* retransmittable_frames) {
133 if (!retransmittable_frames) {
134 return net::QuicConnection::NO_FORCE;
135 }
136 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) {
137 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) {
138 return net::QuicConnection::FORCE;
139 }
140 }
141 return net::QuicConnection::NO_FORCE;
142 }
143
129 } // namespace 144 } // namespace
130 145
131 // TODO(rch): Remove this. 146 // TODO(rch): Remove this.
132 // Because of a bug in the interaction between the TcpCubicSender and 147 // Because of a bug in the interaction between the TcpCubicSender and
133 // QuicConnection, acks currently count against the congestion window. 148 // QuicConnection, acks currently count against the congestion window.
134 // This means that if acks are not acked, and data is only flowing in 149 // This means that if acks are not acked, and data is only flowing in
135 // one direction, then the connection will deadlock. 150 // one direction, then the connection will deadlock.
136 // static 151 // static
137 bool QuicConnection::g_acks_do_not_instigate_acks = false; 152 bool QuicConnection::g_acks_do_not_instigate_acks = false;
138 153
(...skipping 23 matching lines...) Expand all
162 debug_visitor_(NULL), 177 debug_visitor_(NULL),
163 packet_creator_(guid_, &framer_, random_generator_, is_server), 178 packet_creator_(guid_, &framer_, random_generator_, is_server),
164 packet_generator_(this, NULL, &packet_creator_), 179 packet_generator_(this, NULL, &packet_creator_),
165 idle_network_timeout_( 180 idle_network_timeout_(
166 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), 181 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)),
167 overall_connection_timeout_(QuicTime::Delta::Infinite()), 182 overall_connection_timeout_(QuicTime::Delta::Infinite()),
168 creation_time_(clock_->ApproximateNow()), 183 creation_time_(clock_->ApproximateNow()),
169 time_of_last_received_packet_(clock_->ApproximateNow()), 184 time_of_last_received_packet_(clock_->ApproximateNow()),
170 time_of_last_sent_packet_(clock_->ApproximateNow()), 185 time_of_last_sent_packet_(clock_->ApproximateNow()),
171 congestion_manager_(clock_, kTCP), 186 congestion_manager_(clock_, kTCP),
187 sent_packet_manager_(is_server, this),
172 version_negotiation_state_(START_NEGOTIATION), 188 version_negotiation_state_(START_NEGOTIATION),
173 max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm), 189 max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm),
174 is_server_(is_server), 190 is_server_(is_server),
175 connected_(true), 191 connected_(true),
176 received_truncated_ack_(false), 192 received_truncated_ack_(false),
177 send_ack_in_response_to_packet_(false), 193 send_ack_in_response_to_packet_(false),
178 address_migrating_(false) { 194 address_migrating_(false) {
179 helper_->SetConnection(this); 195 helper_->SetConnection(this);
180 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_)); 196 timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_));
181 framer_.set_visitor(this); 197 framer_.set_visitor(this);
182 framer_.set_received_entropy_calculator(&received_packet_manager_); 198 framer_.set_received_entropy_calculator(&received_packet_manager_);
183 199
184 /* 200 /*
185 if (FLAGS_fake_packet_loss_percentage > 0) { 201 if (FLAGS_fake_packet_loss_percentage > 0) {
186 int32 seed = RandomBase::WeakSeed32(); 202 int32 seed = RandomBase::WeakSeed32();
187 LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed; 203 LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed;
188 random_.reset(new MTRandom(seed)); 204 random_.reset(new MTRandom(seed));
189 } 205 }
190 */ 206 */
191 } 207 }
192 208
193 QuicConnection::~QuicConnection() { 209 QuicConnection::~QuicConnection() {
194 STLDeleteElements(&ack_notifiers_); 210 STLDeleteElements(&ack_notifiers_);
195 STLDeleteElements(&undecryptable_packets_); 211 STLDeleteElements(&undecryptable_packets_);
196 STLDeleteValues(&unacked_packets_);
197 STLDeleteValues(&group_map_); 212 STLDeleteValues(&group_map_);
198 for (QueuedPacketList::iterator it = queued_packets_.begin(); 213 for (QueuedPacketList::iterator it = queued_packets_.begin();
199 it != queued_packets_.end(); ++it) { 214 it != queued_packets_.end(); ++it) {
200 delete it->packet; 215 delete it->packet;
201 } 216 }
202 } 217 }
203 218
204 bool QuicConnection::SelectMutualVersion( 219 bool QuicConnection::SelectMutualVersion(
205 const QuicVersionVector& available_versions) { 220 const QuicVersionVector& available_versions) {
206 // Try to find the highest mutual version by iterating over supported 221 // Try to find the highest mutual version by iterating over supported
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 445
431 if (last_header_.packet_sequence_number <= largest_seen_packet_with_ack_) { 446 if (last_header_.packet_sequence_number <= largest_seen_packet_with_ack_) {
432 DLOG(INFO) << ENDPOINT << "Received an old ack frame: ignoring"; 447 DLOG(INFO) << ENDPOINT << "Received an old ack frame: ignoring";
433 return true; 448 return true;
434 } 449 }
435 450
436 if (!ValidateAckFrame(incoming_ack)) { 451 if (!ValidateAckFrame(incoming_ack)) {
437 SendConnectionClose(QUIC_INVALID_ACK_DATA); 452 SendConnectionClose(QUIC_INVALID_ACK_DATA);
438 return false; 453 return false;
439 } 454 }
455
456 // Reset the RTO timeout for each packet when an ack is received.
457 if (retransmission_alarm_->IsSet()) {
458 retransmission_alarm_->Cancel();
459 QuicTime::Delta retransmission_delay =
460 congestion_manager_.GetRetransmissionDelay(
461 sent_packet_manager_.GetNumUnackedPackets(), 0);
462 retransmission_alarm_->Set(clock_->ApproximateNow().Add(
463 retransmission_delay));
464 }
465
440 last_ack_frames_.push_back(incoming_ack); 466 last_ack_frames_.push_back(incoming_ack);
441 return connected_; 467 return connected_;
442 } 468 }
443 469
444 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { 470 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) {
445 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; 471 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number;
446 472
447 received_truncated_ack_ = 473 received_truncated_ack_ =
448 incoming_ack.received_info.missing_packets.size() >= 474 incoming_ack.received_info.missing_packets.size() >=
449 QuicFramer::GetMaxUnackedPackets(last_header_); 475 QuicFramer::GetMaxUnackedPackets(last_header_);
450 476
451 received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack); 477 received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack);
452 received_packet_manager_.UpdatePacketInformationSentByPeer(incoming_ack); 478 received_packet_manager_.UpdatePacketInformationSentByPeer(incoming_ack);
453 // Possibly close any FecGroups which are now irrelevant. 479 // Possibly close any FecGroups which are now irrelevant.
454 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); 480 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1);
455 481
456 sent_entropy_manager_.ClearEntropyBefore( 482 sent_entropy_manager_.ClearEntropyBefore(
457 received_packet_manager_.least_packet_awaited_by_peer() - 1); 483 received_packet_manager_.least_packet_awaited_by_peer() - 1);
458 484
485 retransmitted_nacked_packet_count_ = 0;
459 SequenceNumberSet acked_packets; 486 SequenceNumberSet acked_packets;
460 HandleAckForSentPackets(incoming_ack, &acked_packets); 487 sent_packet_manager_.HandleAckForSentPackets(incoming_ack, &acked_packets);
461 HandleAckForSentFecPackets(incoming_ack, &acked_packets); 488 sent_packet_manager_.HandleAckForSentFecPackets(incoming_ack, &acked_packets);
462 if (acked_packets.size() > 0) { 489 if (acked_packets.size() > 0) {
463 visitor_->OnAck(acked_packets);
464
465 // Inform all the registered AckNotifiers of the new ACKs. 490 // Inform all the registered AckNotifiers of the new ACKs.
466 // TODO(rjshade): Make this more efficient by maintaining a mapping of 491 // TODO(rjshade): Make this more efficient by maintaining a mapping of
467 // <sequence number, set<AckNotifierList>> so that OnAck 492 // <sequence number, set<AckNotifierList>> so that OnAck
468 // is only called on AckNotifiers that care about the 493 // is only called on AckNotifiers that care about the
469 // packets being ACKed. 494 // packets being ACKed.
470 AckNotifierList::iterator it = ack_notifiers_.begin(); 495 AckNotifierList::iterator it = ack_notifiers_.begin();
471 while (it != ack_notifiers_.end()) { 496 while (it != ack_notifiers_.end()) {
472 if ((*it)->OnAck(acked_packets)) { 497 if ((*it)->OnAck(acked_packets)) {
473 // The QuicAckNotifier has seen all the ACKs it was interested in, and 498 // The QuicAckNotifier has seen all the ACKs it was interested in, and
474 // has triggered its callback. No more use for it. 499 // has triggered its callback. No more use for it.
475 delete *it; 500 delete *it;
476 it = ack_notifiers_.erase(it); 501 it = ack_notifiers_.erase(it);
477 } else { 502 } else {
478 ++it; 503 ++it;
479 } 504 }
480 } 505 }
481 } 506 }
507 // Clear the earliest retransmission timeouts that are no longer unacked to
508 // ensure the priority queue doesn't become too large.
509 while (!retransmission_timeouts_.empty() &&
510 !sent_packet_manager_.IsUnacked(
511 retransmission_timeouts_.top().sequence_number)) {
512 retransmission_timeouts_.pop();
513 }
482 congestion_manager_.OnIncomingAckFrame(incoming_ack, 514 congestion_manager_.OnIncomingAckFrame(incoming_ack,
483 time_of_last_received_packet_); 515 time_of_last_received_packet_);
484 } 516 }
485 517
486 bool QuicConnection::OnCongestionFeedbackFrame( 518 bool QuicConnection::OnCongestionFeedbackFrame(
487 const QuicCongestionFeedbackFrame& feedback) { 519 const QuicCongestionFeedbackFrame& feedback) {
488 DCHECK(connected_); 520 DCHECK(connected_);
489 if (debug_visitor_) { 521 if (debug_visitor_) {
490 debug_visitor_->OnCongestionFeedbackFrame(feedback); 522 debug_visitor_->OnCongestionFeedbackFrame(feedback);
491 } 523 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 incoming_ack.received_info.largest_observed, 592 incoming_ack.received_info.largest_observed,
561 incoming_ack.received_info.missing_packets, 593 incoming_ack.received_info.missing_packets,
562 incoming_ack.received_info.entropy_hash)) { 594 incoming_ack.received_info.entropy_hash)) {
563 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; 595 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy.";
564 return false; 596 return false;
565 } 597 }
566 598
567 return true; 599 return true;
568 } 600 }
569 601
570 void QuicConnection::HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
571 SequenceNumberSet* acked_packets) {
572 int retransmitted_packets = 0;
573 // Go through the packets we have not received an ack for and see if this
574 // incoming_ack shows they've been seen by the peer.
575 UnackedPacketMap::iterator it = unacked_packets_.begin();
576 while (it != unacked_packets_.end()) {
577 QuicPacketSequenceNumber sequence_number = it->first;
578 if (sequence_number >
579 received_packet_manager_.peer_largest_observed_packet()) {
580 // These are very new sequence_numbers.
581 break;
582 }
583 RetransmittableFrames* unacked = it->second;
584 if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
585 // Packet was acked, so remove it from our unacked packet list.
586 DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number;
587 acked_packets->insert(sequence_number);
588 delete unacked;
589 unacked_packets_.erase(it++);
590 retransmission_map_.erase(sequence_number);
591 } else {
592 // This is a packet which we planned on retransmitting and has not been
593 // seen at the time of this ack being sent out. See if it's our new
594 // lowest unacked packet.
595 DVLOG(1) << ENDPOINT << "still missing packet " << sequence_number;
596 ++it;
597 // The peer got packets after this sequence number. This is an explicit
598 // nack.
599 RetransmissionMap::iterator retransmission_it =
600 retransmission_map_.find(sequence_number);
601 ++(retransmission_it->second.number_nacks);
602 if (retransmission_it->second.number_nacks >=
603 kNumberOfNacksBeforeRetransmission &&
604 retransmitted_packets < kMaxRetransmissionsPerAck) {
605 ++retransmitted_packets;
606 DVLOG(1) << ENDPOINT << "Trying to retransmit packet "
607 << sequence_number
608 << " as it has been nacked 3 or more times.";
609 // RetransmitPacket will retransmit with a new sequence_number.
610 RetransmitPacket(sequence_number);
611 }
612 }
613 }
614 }
615
616 void QuicConnection::HandleAckForSentFecPackets(
617 const QuicAckFrame& incoming_ack, SequenceNumberSet* acked_packets) {
618 UnackedPacketMap::iterator it = unacked_fec_packets_.begin();
619 while (it != unacked_fec_packets_.end()) {
620 QuicPacketSequenceNumber sequence_number = it->first;
621 if (sequence_number >
622 received_packet_manager_.peer_largest_observed_packet()) {
623 break;
624 }
625 if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
626 DVLOG(1) << ENDPOINT << "Got an ack for fec packet: " << sequence_number;
627 acked_packets->insert(sequence_number);
628 unacked_fec_packets_.erase(it++);
629 } else {
630 DVLOG(1) << ENDPOINT << "Still missing ack for fec packet: "
631 << sequence_number;
632 ++it;
633 }
634 }
635 }
636
637 void QuicConnection::OnFecData(const QuicFecData& fec) { 602 void QuicConnection::OnFecData(const QuicFecData& fec) {
638 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); 603 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
639 DCHECK_NE(0u, last_header_.fec_group); 604 DCHECK_NE(0u, last_header_.fec_group);
640 QuicFecGroup* group = GetFecGroup(); 605 QuicFecGroup* group = GetFecGroup();
641 if (group != NULL) { 606 if (group != NULL) {
642 group->UpdateFec(last_header_.packet_sequence_number, 607 group->UpdateFec(last_header_.packet_sequence_number,
643 last_header_.entropy_flag, fec); 608 last_header_.entropy_flag, fec);
644 } 609 }
645 } 610 }
646 611
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 if (!last_packet_revived_) { 661 if (!last_packet_revived_) {
697 congestion_manager_.RecordIncomingPacket( 662 congestion_manager_.RecordIncomingPacket(
698 last_size_, last_header_.packet_sequence_number, 663 last_size_, last_header_.packet_sequence_number,
699 time_of_last_received_packet_, last_packet_revived_); 664 time_of_last_received_packet_, last_packet_revived_);
700 } 665 }
701 666
702 // Must called before ack processing, because processing acks removes entries 667 // Must called before ack processing, because processing acks removes entries
703 // from unacket_packets_, increasing the least_unacked. 668 // from unacket_packets_, increasing the least_unacked.
704 const bool last_packet_should_instigate_ack = ShouldLastPacketInstigateAck(); 669 const bool last_packet_should_instigate_ack = ShouldLastPacketInstigateAck();
705 670
706 if ((last_stream_frames_.empty() || 671 if (last_stream_frames_.empty() ||
707 visitor_->OnPacket(self_address_, peer_address_, 672 visitor_->OnStreamFrames(last_stream_frames_)) {
708 last_header_, last_stream_frames_))) {
709 received_packet_manager_.RecordPacketReceived( 673 received_packet_manager_.RecordPacketReceived(
710 last_header_, time_of_last_received_packet_); 674 last_header_, time_of_last_received_packet_);
711 } 675 }
712 676
713 // Process stream resets, then acks, then congestion feedback. 677 // Process stream resets, then acks, then congestion feedback.
714 for (size_t i = 0; i < last_goaway_frames_.size(); ++i) { 678 for (size_t i = 0; i < last_goaway_frames_.size(); ++i) {
715 visitor_->OnGoAway(last_goaway_frames_[i]); 679 visitor_->OnGoAway(last_goaway_frames_[i]);
716 } 680 }
717 for (size_t i = 0; i < last_rst_frames_.size(); ++i) { 681 for (size_t i = 0; i < last_rst_frames_.size(); ++i) {
718 visitor_->OnRstStream(last_rst_frames_[i]); 682 visitor_->OnRstStream(last_rst_frames_[i]);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 !last_goaway_frames_.empty() || 720 !last_goaway_frames_.empty() ||
757 !last_rst_frames_.empty()) { 721 !last_rst_frames_.empty()) {
758 return true; 722 return true;
759 } 723 }
760 724
761 // If the peer is still waiting for a packet that we are no 725 // If the peer is still waiting for a packet that we are no
762 // longer planning to send, we should send an ack to raise 726 // longer planning to send, we should send an ack to raise
763 // the high water mark. 727 // the high water mark.
764 if (!last_ack_frames_.empty() && 728 if (!last_ack_frames_.empty() &&
765 !last_ack_frames_.back().received_info.missing_packets.empty() && 729 !last_ack_frames_.back().received_info.missing_packets.empty() &&
766 !unacked_packets_.empty()) { 730 sent_packet_manager_.HasUnackedPackets()) {
767 if (unacked_packets_.begin()->first > 731 return sent_packet_manager_.GetLeastUnackedSentPacket() >
768 *last_ack_frames_.back().received_info.missing_packets.begin()) { 732 *last_ack_frames_.back().received_info.missing_packets.begin();
769 return true;
770 }
771 } 733 }
772
773 return false; 734 return false;
774 } 735 }
775 736
776 void QuicConnection::MaybeSendInResponseToPacket( 737 void QuicConnection::MaybeSendInResponseToPacket(
777 bool last_packet_should_instigate_ack) { 738 bool last_packet_should_instigate_ack) {
778 packet_generator_.StartBatchOperations(); 739 packet_generator_.StartBatchOperations();
779 740
780 if (last_packet_should_instigate_ack || 741 if (last_packet_should_instigate_ack ||
781 !g_acks_do_not_instigate_acks) { 742 !g_acks_do_not_instigate_acks) {
782 if (send_ack_in_response_to_packet_) { 743 if (send_ack_in_response_to_packet_) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 supported_versions.push_back(kSupportedQuicVersions[i]); 775 supported_versions.push_back(kSupportedQuicVersions[i]);
815 } 776 }
816 QuicEncryptedPacket* encrypted = 777 QuicEncryptedPacket* encrypted =
817 packet_creator_.SerializeVersionNegotiationPacket(supported_versions); 778 packet_creator_.SerializeVersionNegotiationPacket(supported_versions);
818 // TODO(satyamshekhar): implement zero server state negotiation. 779 // TODO(satyamshekhar): implement zero server state negotiation.
819 int error; 780 int error;
820 helper_->WritePacketToWire(*encrypted, &error); 781 helper_->WritePacketToWire(*encrypted, &error);
821 delete encrypted; 782 delete encrypted;
822 } 783 }
823 784
824 QuicConsumedData QuicConnection::SendvStreamData(QuicStreamId id, 785 QuicConsumedData QuicConnection::SendvStreamDataInner(
825 const struct iovec* iov, 786 QuicStreamId id,
826 int count, 787 const struct iovec* iov,
827 QuicStreamOffset offset, 788 int iov_count,
828 bool fin) { 789 QuicStreamOffset offset,
790 bool fin,
791 QuicAckNotifier* notifier) {
829 // TODO(ianswett): Further improve sending by passing the iovec down 792 // TODO(ianswett): Further improve sending by passing the iovec down
830 // instead of batching into multiple stream frames in a single packet. 793 // instead of batching into multiple stream frames in a single packet.
831 const bool already_in_batch_mode = packet_generator_.InBatchMode(); 794 const bool already_in_batch_mode = packet_generator_.InBatchMode();
832 packet_generator_.StartBatchOperations(); 795 packet_generator_.StartBatchOperations();
833 796
834 size_t bytes_written = 0; 797 size_t bytes_written = 0;
835 bool fin_consumed = false; 798 bool fin_consumed = false;
836 for (int i = 0; i < count; ++i) { 799
837 bool send_fin = fin && (i == count - 1); 800 for (int i = 0; i < iov_count; ++i) {
801 bool send_fin = fin && (i == iov_count - 1);
838 if (!send_fin && iov[i].iov_len == 0) { 802 if (!send_fin && iov[i].iov_len == 0) {
839 LOG(DFATAL) << "Attempt to send empty stream frame"; 803 LOG(DFATAL) << "Attempt to send empty stream frame";
840 } 804 }
841 QuicConsumedData data_consumed = packet_generator_.ConsumeData( 805
842 id, 806 StringPiece data(static_cast<char*>(iov[i].iov_base), iov[i].iov_len);
843 StringPiece(static_cast<char*>(iov[i].iov_base), iov[i].iov_len), 807 int currentOffset = offset + bytes_written;
844 offset + bytes_written, 808 QuicConsumedData consumed_data =
845 send_fin); 809 packet_generator_.ConsumeData(id,
846 DCHECK_LE(data_consumed.bytes_consumed, numeric_limits<uint32>::max()); 810 data,
847 bytes_written += data_consumed.bytes_consumed; 811 currentOffset,
848 fin_consumed = data_consumed.fin_consumed; 812 send_fin,
813 notifier);
814
815 DCHECK_LE(consumed_data.bytes_consumed, numeric_limits<uint32>::max());
816 bytes_written += consumed_data.bytes_consumed;
817 fin_consumed = consumed_data.fin_consumed;
849 // If no bytes were consumed, bail now, because the stream can not write 818 // If no bytes were consumed, bail now, because the stream can not write
850 // more data. 819 // more data.
851 if (data_consumed.bytes_consumed < iov[i].iov_len) { 820 if (consumed_data.bytes_consumed < iov[i].iov_len) {
852 break; 821 break;
853 } 822 }
854 } 823 }
855 // Handle the 0 byte write properly. 824 // Handle the 0 byte write properly.
856 if (count == 0) { 825 if (iov_count == 0) {
857 DCHECK(fin); 826 DCHECK(fin);
858 QuicConsumedData data_consumed = packet_generator_.ConsumeData( 827 QuicConsumedData consumed_data = packet_generator_.ConsumeData(
859 id, StringPiece(), offset, fin); 828 id, StringPiece(), offset, fin, NULL);
860 fin_consumed = data_consumed.fin_consumed; 829 fin_consumed = consumed_data.fin_consumed;
861 } 830 }
862 831
863 // Leave the generator in the original batch state. 832 // Leave the generator in the original batch state.
864 if (!already_in_batch_mode) { 833 if (!already_in_batch_mode) {
865 packet_generator_.FinishBatchOperations(); 834 packet_generator_.FinishBatchOperations();
866 } 835 }
867 DCHECK_EQ(already_in_batch_mode, packet_generator_.InBatchMode()); 836 DCHECK_EQ(already_in_batch_mode, packet_generator_.InBatchMode());
837
868 return QuicConsumedData(bytes_written, fin_consumed); 838 return QuicConsumedData(bytes_written, fin_consumed);
869 } 839 }
870 840
871 QuicConsumedData QuicConnection::SendStreamDataAndNotifyWhenAcked( 841 QuicConsumedData QuicConnection::SendvStreamData(QuicStreamId id,
842 const struct iovec* iov,
843 int iov_count,
844 QuicStreamOffset offset,
845 bool fin) {
846 return SendvStreamDataInner(id, iov, iov_count, offset, fin, NULL);
847 }
848
849 QuicConsumedData QuicConnection::SendvStreamDataAndNotifyWhenAcked(
872 QuicStreamId id, 850 QuicStreamId id,
873 StringPiece data, 851 const struct iovec* iov,
852 int iov_count,
874 QuicStreamOffset offset, 853 QuicStreamOffset offset,
875 bool fin, 854 bool fin,
876 QuicAckNotifier::DelegateInterface* delegate) { 855 QuicAckNotifier::DelegateInterface* delegate) {
877 if (!fin && data.empty()) { 856 if (!fin && iov_count == 0) {
878 LOG(DFATAL) << "Attempt to send empty stream frame"; 857 LOG(DFATAL) << "Attempt to send empty stream frame";
879 } 858 }
880 // This notifier will be deleted in ProcessAckFrame once it has seen ACKs for 859 // This notifier will be deleted in ProcessAckFrame once it has seen ACKs for
881 // all the consumed data (or below if no data was consumed). 860 // all the consumed data (or below if no data was consumed).
882 QuicAckNotifier* notifier = new QuicAckNotifier(delegate); 861 QuicAckNotifier* notifier = new QuicAckNotifier(delegate);
883 QuicConsumedData consumed_data = 862 QuicConsumedData consumed_data =
884 packet_generator_.ConsumeData(id, data, offset, fin, notifier); 863 SendvStreamDataInner(id, iov, iov_count, offset, fin, notifier);
885 864
886 if (consumed_data.bytes_consumed > 0) { 865 if (consumed_data.bytes_consumed > 0) {
887 // If some data was consumed, then the delegate should be registered for 866 // If some data was consumed, then the delegate should be registered for
888 // notification when the data is ACKed. 867 // notification when the data is ACKed.
889 ack_notifiers_.push_back(notifier); 868 ack_notifiers_.push_back(notifier);
890 } else { 869 } else {
891 // No data was consumed, delete the notifier. 870 // No data was consumed, delete the notifier.
892 delete notifier; 871 delete notifier;
893 } 872 }
894 873
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 if (write_blocked_) { 942 if (write_blocked_) {
964 return false; 943 return false;
965 } 944 }
966 return DoWrite(); 945 return DoWrite();
967 } 946 }
968 947
969 bool QuicConnection::DoWrite() { 948 bool QuicConnection::DoWrite() {
970 DCHECK(!write_blocked_); 949 DCHECK(!write_blocked_);
971 WriteQueuedPackets(); 950 WriteQueuedPackets();
972 951
973 // We are postulating if we are not yet forward secure, the visitor may have 952 IsHandshake pending_handshake = visitor_->HasPendingHandshake() ?
974 // handshake messages to send. 953 IS_HANDSHAKE : NOT_HANDSHAKE;
975 // TODO(jar): add a new visitor_ method that returns whether it has handshake
976 // messages to send, and call it and pass the return value to each CanWrite
977 // call.
978 const IsHandshake maybe_handshake =
979 encryption_level_ == ENCRYPTION_FORWARD_SECURE ? NOT_HANDSHAKE
980 : IS_HANDSHAKE;
981
982 // Sending queued packets may have caused the socket to become write blocked, 954 // Sending queued packets may have caused the socket to become write blocked,
983 // or the congestion manager to prohibit sending. If we've sent everything 955 // or the congestion manager to prohibit sending. If we've sent everything
984 // we had queued and we're still not blocked, let the visitor know it can 956 // we had queued and we're still not blocked, let the visitor know it can
985 // write more. 957 // write more.
986 if (CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, 958 if (CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA,
987 maybe_handshake)) { 959 pending_handshake)) {
988 const bool already_in_batch_mode = packet_generator_.InBatchMode(); 960 const bool already_in_batch_mode = packet_generator_.InBatchMode();
989 if (!already_in_batch_mode) { 961 if (!already_in_batch_mode) {
990 packet_generator_.StartBatchOperations(); 962 packet_generator_.StartBatchOperations();
991 } 963 }
992 bool all_bytes_written = visitor_->OnCanWrite(); 964 bool all_bytes_written = visitor_->OnCanWrite();
993 if (!already_in_batch_mode) { 965 if (!already_in_batch_mode) {
994 packet_generator_.FinishBatchOperations(); 966 packet_generator_.FinishBatchOperations();
995 } 967 }
996 968
997 // After the visitor writes, it may have caused the socket to become write 969 // After the visitor writes, it may have caused the socket to become write
998 // blocked or the congestion manager to prohibit sending, so check again. 970 // blocked or the congestion manager to prohibit sending, so check again.
999 // TODO(jar): we need to pass NOT_HANDSHAKE instead of maybe_handshake to 971 pending_handshake = visitor_->HasPendingHandshake() ? IS_HANDSHAKE
1000 // this CanWrite call to avoid getting into an infinite loop calling 972 : NOT_HANDSHAKE;
1001 // DoWrite.
1002 if (!write_blocked_ && !all_bytes_written && 973 if (!write_blocked_ && !all_bytes_written &&
1003 CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, 974 CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA,
1004 NOT_HANDSHAKE)) { 975 pending_handshake)) {
1005 // We're not write blocked, but some stream didn't write out all of its 976 // We're not write blocked, but some stream didn't write out all of its
1006 // bytes. Register for 'immediate' resumption so we'll keep writing after 977 // bytes. Register for 'immediate' resumption so we'll keep writing after
1007 // other quic connections have had a chance to use the socket. 978 // other quic connections have had a chance to use the socket.
1008 send_alarm_->Cancel(); 979 send_alarm_->Cancel();
1009 send_alarm_->Set(clock_->ApproximateNow()); 980 send_alarm_->Set(clock_->ApproximateNow());
1010 } 981 }
1011 } 982 }
1012 983
1013 return !write_blocked_; 984 return !write_blocked_;
1014 } 985 }
(...skipping 13 matching lines...) Expand all
1028 999
1029 bool QuicConnection::WriteQueuedPackets() { 1000 bool QuicConnection::WriteQueuedPackets() {
1030 DCHECK(!write_blocked_); 1001 DCHECK(!write_blocked_);
1031 1002
1032 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); 1003 QueuedPacketList::iterator packet_iterator = queued_packets_.begin();
1033 while (!write_blocked_ && packet_iterator != queued_packets_.end()) { 1004 while (!write_blocked_ && packet_iterator != queued_packets_.end()) {
1034 if (WritePacket(packet_iterator->encryption_level, 1005 if (WritePacket(packet_iterator->encryption_level,
1035 packet_iterator->sequence_number, 1006 packet_iterator->sequence_number,
1036 packet_iterator->packet, 1007 packet_iterator->packet,
1037 packet_iterator->retransmittable, 1008 packet_iterator->retransmittable,
1038 NO_FORCE)) { 1009 packet_iterator->forced)) {
1039 packet_iterator = queued_packets_.erase(packet_iterator); 1010 packet_iterator = queued_packets_.erase(packet_iterator);
1040 } else { 1011 } else {
1041 // Continue, because some queued packets may still be writable. 1012 // Continue, because some queued packets may still be writable.
1042 // This can happen if a retransmit send fail. 1013 // This can happen if a retransmit send fail.
1043 ++packet_iterator; 1014 ++packet_iterator;
1044 } 1015 }
1045 } 1016 }
1046 1017
1047 return !write_blocked_; 1018 return !write_blocked_;
1048 } 1019 }
1049 1020
1050 bool QuicConnection::MaybeRetransmitPacketForRTO( 1021 bool QuicConnection::MaybeRetransmitPacketForRTO(
1051 QuicPacketSequenceNumber sequence_number) { 1022 QuicPacketSequenceNumber sequence_number) {
1052 DCHECK_EQ(ContainsKey(unacked_packets_, sequence_number), 1023 if (!sent_packet_manager_.IsUnacked(sequence_number)) {
1053 ContainsKey(retransmission_map_, sequence_number));
1054
1055 if (!ContainsKey(unacked_packets_, sequence_number)) {
1056 DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number 1024 DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number
1057 << " but it has been acked or already retransmitted with" 1025 << " but it has been acked or already retransmitted with"
1058 << " different sequence number."; 1026 << " a different sequence number.";
1059 // So no extra delay is added for this packet. 1027 // So no extra delay is added for this packet.
1060 return true; 1028 return true;
1061 } 1029 }
1062 1030
1063 RetransmissionMap::iterator retransmission_it =
1064 retransmission_map_.find(sequence_number);
1065 // If the packet hasn't been acked and we're getting truncated acks, ignore 1031 // If the packet hasn't been acked and we're getting truncated acks, ignore
1066 // any RTO for packets larger than the peer's largest observed packet; it may 1032 // any RTO for packets larger than the peer's largest observed packet; it may
1067 // have been received by the peer and just wasn't acked due to the ack frame 1033 // have been received by the peer and just wasn't acked due to the ack frame
1068 // running out of space. 1034 // running out of space.
1069 if (received_truncated_ack_ && sequence_number > 1035 if (received_truncated_ack_ &&
1070 received_packet_manager_.peer_largest_observed_packet() && 1036 sequence_number > GetPeerLargestObservedPacket() &&
1071 // We allow retransmission of already retransmitted packets so that we 1037 // We allow retransmission of already retransmitted packets so that we
1072 // retransmit packets that were retransmissions of the packet with 1038 // retransmit packets that were retransmissions of the packet with
1073 // sequence number < the largest observed field of the truncated ack. 1039 // sequence number < the largest observed field of the truncated ack.
1074 retransmission_it->second.number_retransmissions == 0) { 1040 !sent_packet_manager_.IsRetransmission(sequence_number)) {
1075 return false; 1041 return false;
1076 } else {
1077 ++stats_.rto_count;
1078 RetransmitPacket(sequence_number);
1079 return true;
1080 } 1042 }
1043
1044 ++stats_.rto_count;
1045 RetransmitPacket(sequence_number);
1046 return true;
1081 } 1047 }
1082 1048
1083 void QuicConnection::RetransmitUnackedPackets( 1049 void QuicConnection::RetransmitUnackedPackets(
1084 RetransmissionType retransmission_type) { 1050 RetransmissionType retransmission_type) {
1085 if (unacked_packets_.empty()) { 1051 SequenceNumberSet unacked_packets = sent_packet_manager_.GetUnackedPackets();
1052 if (unacked_packets.empty()) {
1086 return; 1053 return;
1087 } 1054 }
1088 UnackedPacketMap::iterator next_it = unacked_packets_.begin();
1089 QuicPacketSequenceNumber end_sequence_number =
1090 unacked_packets_.rbegin()->first;
1091 do {
1092 UnackedPacketMap::iterator current_it = next_it;
1093 ++next_it;
1094 1055
1056 for (SequenceNumberSet::const_iterator unacked_it = unacked_packets.begin();
1057 unacked_it != unacked_packets.end(); ++unacked_it) {
1058 const RetransmittableFrames& frames =
1059 sent_packet_manager_.GetRetransmittableFrames(*unacked_it);
1095 if (retransmission_type == ALL_PACKETS || 1060 if (retransmission_type == ALL_PACKETS ||
1096 current_it->second->encryption_level() == ENCRYPTION_INITIAL) { 1061 frames.encryption_level() == ENCRYPTION_INITIAL) {
1097 // TODO(satyamshekhar): Think about congestion control here. 1062 // TODO(satyamshekhar): Think about congestion control here.
1098 // Specifically, about the retransmission count of packets being sent 1063 // Specifically, about the retransmission count of packets being sent
1099 // proactively to achieve 0 (minimal) RTT. 1064 // proactively to achieve 0 (minimal) RTT.
1100 RetransmitPacket(current_it->first); 1065 RetransmitPacket(*unacked_it);
1101 } 1066 }
1102 } while (next_it != unacked_packets_.end() && 1067 }
1103 next_it->first <= end_sequence_number);
1104 } 1068 }
1105 1069
1106 void QuicConnection::RetransmitPacket( 1070 void QuicConnection::RetransmitPacket(
1107 QuicPacketSequenceNumber sequence_number) { 1071 QuicPacketSequenceNumber sequence_number) {
1108 UnackedPacketMap::iterator unacked_it = 1072 DCHECK(sent_packet_manager_.IsUnacked(sequence_number));
1109 unacked_packets_.find(sequence_number); 1073
1110 RetransmissionMap::iterator retransmission_it =
1111 retransmission_map_.find(sequence_number);
1112 // There should always be an entry corresponding to |sequence_number| in
1113 // both |retransmission_map_| and |unacked_packets_|. Retransmissions due to
1114 // RTO for sequence numbers that are already acked or retransmitted are
1115 // ignored by MaybeRetransmitPacketForRTO.
1116 DCHECK(unacked_it != unacked_packets_.end());
1117 DCHECK(retransmission_it != retransmission_map_.end());
1118 RetransmittableFrames* unacked = unacked_it->second;
1119 // TODO(pwestin): Need to fix potential issue with FEC and a 1 packet 1074 // TODO(pwestin): Need to fix potential issue with FEC and a 1 packet
1120 // congestion window see b/8331807 for details. 1075 // congestion window see b/8331807 for details.
1121 congestion_manager_.AbandoningPacket(sequence_number); 1076 congestion_manager_.AbandoningPacket(sequence_number);
1122 1077
1078 const RetransmittableFrames& retransmittable_frames =
1079 sent_packet_manager_.GetRetransmittableFrames(sequence_number);
1080
1123 // Re-packetize the frames with a new sequence number for retransmission. 1081 // Re-packetize the frames with a new sequence number for retransmission.
1124 // Retransmitted data packets do not use FEC, even when it's enabled. 1082 // Retransmitted data packets do not use FEC, even when it's enabled.
1125 // Retransmitted packets use the same sequence number length as the original. 1083 // Retransmitted packets use the same sequence number length as the original.
1126 QuicSequenceNumberLength original_sequence_number_length = 1084 QuicSequenceNumberLength original_sequence_number_length =
1127 retransmission_it->second.sequence_number_length; 1085 sent_packet_manager_.GetSequenceNumberLength(sequence_number);
1128 SerializedPacket serialized_packet = 1086 SerializedPacket serialized_packet =
1129 packet_creator_.ReserializeAllFrames(unacked->frames(), 1087 packet_creator_.ReserializeAllFrames(retransmittable_frames.frames(),
1130 original_sequence_number_length); 1088 original_sequence_number_length);
1131 RetransmissionInfo retransmission_info(
1132 serialized_packet.sequence_number,
1133 serialized_packet.sequence_number_length);
1134 retransmission_info.number_retransmissions =
1135 retransmission_it->second.number_retransmissions + 1;
1136 // Remove info with old sequence number.
1137 unacked_packets_.erase(unacked_it);
1138 retransmission_map_.erase(retransmission_it);
1139 DLOG(INFO) << ENDPOINT << "Retransmitting unacked packet " << sequence_number
1140 << " as " << serialized_packet.sequence_number;
1141 DCHECK(unacked_packets_.empty() ||
1142 unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
1143 unacked_packets_.insert(make_pair(serialized_packet.sequence_number,
1144 unacked));
1145 retransmission_map_.insert(make_pair(serialized_packet.sequence_number,
1146 retransmission_info));
1147 1089
1148 // A notifier may be waiting to hear about ACKs for the original sequence 1090 // A notifier may be waiting to hear about ACKs for the original sequence
1149 // number. Inform them that the sequence number has changed. 1091 // number. Inform them that the sequence number has changed.
1150 for (AckNotifierList::iterator notifier_it = ack_notifiers_.begin(); 1092 for (AckNotifierList::iterator notifier_it = ack_notifiers_.begin();
1151 notifier_it != ack_notifiers_.end(); ++notifier_it) { 1093 notifier_it != ack_notifiers_.end(); ++notifier_it) {
1152 (*notifier_it)->UpdateSequenceNumber(sequence_number, 1094 (*notifier_it)->UpdateSequenceNumber(sequence_number,
1153 serialized_packet.sequence_number); 1095 serialized_packet.sequence_number);
1154 } 1096 }
1155 1097
1098 DLOG(INFO) << ENDPOINT << "Retransmitting " << sequence_number << " as "
1099 << serialized_packet.sequence_number;
1156 if (debug_visitor_) { 1100 if (debug_visitor_) {
1157 debug_visitor_->OnPacketRetransmitted(sequence_number, 1101 debug_visitor_->OnPacketRetransmitted(sequence_number,
1158 serialized_packet.sequence_number); 1102 serialized_packet.sequence_number);
1159 } 1103 }
1160 SendOrQueuePacket(unacked->encryption_level(), 1104 sent_packet_manager_.OnRetransmittedPacket(sequence_number,
1105 serialized_packet.sequence_number);
1106
1107 SendOrQueuePacket(retransmittable_frames.encryption_level(),
1161 serialized_packet.sequence_number, 1108 serialized_packet.sequence_number,
1162 serialized_packet.packet, 1109 serialized_packet.packet,
1163 serialized_packet.entropy_hash, 1110 serialized_packet.entropy_hash,
1164 HAS_RETRANSMITTABLE_DATA); 1111 HAS_RETRANSMITTABLE_DATA,
1112 HasForcedFrames(serialized_packet.retransmittable_frames));
1165 } 1113 }
1166 1114
1167 bool QuicConnection::CanWrite(Retransmission retransmission, 1115 bool QuicConnection::CanWrite(Retransmission retransmission,
1168 HasRetransmittableData retransmittable, 1116 HasRetransmittableData retransmittable,
1169 IsHandshake handshake) { 1117 IsHandshake handshake) {
1170 // TODO(ianswett): If the packet is a retransmit, the current send alarm may 1118 // TODO(ianswett): If the packet is a retransmit, the current send alarm may
1171 // be too long. 1119 // be too long.
1172 if (write_blocked_ || send_alarm_->IsSet()) { 1120 if (write_blocked_ || send_alarm_->IsSet()) {
1173 return false; 1121 return false;
1174 } 1122 }
1175 1123
1176 QuicTime now = clock_->Now(); 1124 QuicTime now = clock_->Now();
1177 QuicTime::Delta delay = congestion_manager_.TimeUntilSend( 1125 QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
1178 now, retransmission, retransmittable, handshake); 1126 now, retransmission, retransmittable, handshake);
1179 if (delay.IsInfinite()) { 1127 if (delay.IsInfinite()) {
1180 return false; 1128 return false;
1181 } 1129 }
1182 1130
1183 // If the scheduler requires a delay, then we can not send this packet now. 1131 // If the scheduler requires a delay, then we can not send this packet now.
1184 if (!delay.IsZero()) { 1132 if (!delay.IsZero()) {
1185 send_alarm_->Cancel(); 1133 send_alarm_->Cancel();
1186 send_alarm_->Set(now.Add(delay)); 1134 send_alarm_->Set(now.Add(delay));
1187 return false; 1135 return false;
1188 } 1136 }
1189 return true; 1137 return true;
1190 } 1138 }
1191 1139
1192 bool QuicConnection::IsRetransmission(
1193 QuicPacketSequenceNumber sequence_number) {
1194 RetransmissionMap::iterator it = retransmission_map_.find(sequence_number);
1195 return it != retransmission_map_.end() &&
1196 it->second.number_retransmissions > 0;
1197 }
1198
1199 void QuicConnection::SetupRetransmission( 1140 void QuicConnection::SetupRetransmission(
1200 QuicPacketSequenceNumber sequence_number, 1141 QuicPacketSequenceNumber sequence_number,
1201 EncryptionLevel level) { 1142 EncryptionLevel level) {
1202 RetransmissionMap::iterator it = retransmission_map_.find(sequence_number); 1143 if (!sent_packet_manager_.IsUnacked(sequence_number)) {
1203 if (it == retransmission_map_.end()) {
1204 DVLOG(1) << ENDPOINT << "Will not retransmit packet " << sequence_number; 1144 DVLOG(1) << ENDPOINT << "Will not retransmit packet " << sequence_number;
1205 return; 1145 return;
1206 } 1146 }
1207 1147 size_t retransmission_count =
1208 RetransmissionInfo retransmission_info = it->second; 1148 sent_packet_manager_.GetRetransmissionCount(sequence_number);
1209 // TODO(rch): consider using a much smaller retransmisison_delay 1149 // TODO(rch): consider using a much smaller retransmisison_delay
1210 // for the ENCRYPTION_NONE packets. 1150 // for the ENCRYPTION_NONE packets.
1211 size_t effective_retransmission_count = 1151 size_t effective_retransmission_count =
1212 level == ENCRYPTION_NONE ? 0 : retransmission_info.number_retransmissions; 1152 level == ENCRYPTION_NONE ? 0 : retransmission_count;
1213 QuicTime::Delta retransmission_delay = 1153 QuicTime::Delta retransmission_delay =
1214 congestion_manager_.GetRetransmissionDelay( 1154 congestion_manager_.GetRetransmissionDelay(
1215 unacked_packets_.size(), 1155 sent_packet_manager_.GetNumUnackedPackets(),
1216 effective_retransmission_count); 1156 effective_retransmission_count);
1217 1157
1218 retransmission_timeouts_.push(RetransmissionTime( 1158 retransmission_timeouts_.push(RetransmissionTime(
1219 sequence_number, 1159 sequence_number,
1220 clock_->ApproximateNow().Add(retransmission_delay), 1160 clock_->ApproximateNow().Add(retransmission_delay),
1221 false)); 1161 false));
1222 1162
1223 // Do not set the retransmisson alarm if we're already handling the 1163 // Do not set the retransmisson alarm if we're already handling the
1224 // retransmission alarm because the retransmission alarm will be reset when 1164 // retransmission alarm because the retransmission alarm will be reset when
1225 // OnRetransmissionTimeout completes. 1165 // OnRetransmissionTimeout completes.
1226 if (!handling_retransmission_timeout_ && !retransmission_alarm_->IsSet()) { 1166 if (!handling_retransmission_timeout_ && !retransmission_alarm_->IsSet()) {
1227 retransmission_alarm_->Set( 1167 retransmission_alarm_->Set(
1228 clock_->ApproximateNow().Add(retransmission_delay)); 1168 clock_->ApproximateNow().Add(retransmission_delay));
1229 } 1169 }
1230 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in 1170 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in
1231 // SendStreamData(). 1171 // SendStreamData().
1232 } 1172 }
1233 1173
1234 void QuicConnection::SetupAbandonFecTimer( 1174 void QuicConnection::SetupAbandonFecTimer(
1235 QuicPacketSequenceNumber sequence_number) { 1175 QuicPacketSequenceNumber sequence_number) {
1236 DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
1237 QuicTime::Delta retransmission_delay = 1176 QuicTime::Delta retransmission_delay =
1238 QuicTime::Delta::FromMilliseconds( 1177 QuicTime::Delta::FromMilliseconds(
1239 congestion_manager_.DefaultRetransmissionTime().ToMilliseconds() * 3); 1178 congestion_manager_.DefaultRetransmissionTime().ToMilliseconds() * 3);
1240 retransmission_timeouts_.push(RetransmissionTime( 1179 retransmission_timeouts_.push(RetransmissionTime(
1241 sequence_number, 1180 sequence_number,
1242 clock_->ApproximateNow().Add(retransmission_delay), 1181 clock_->ApproximateNow().Add(retransmission_delay),
1243 true)); 1182 true));
1244 } 1183 }
1245 1184
1246 void QuicConnection::DropPacket(QuicPacketSequenceNumber sequence_number) {
1247 UnackedPacketMap::iterator unacked_it =
1248 unacked_packets_.find(sequence_number);
1249 // Packet was not meant to be retransmitted.
1250 if (unacked_it == unacked_packets_.end()) {
1251 DCHECK(!ContainsKey(retransmission_map_, sequence_number));
1252 return;
1253 }
1254 // Delete the unacked packet.
1255 delete unacked_it->second;
1256 unacked_packets_.erase(unacked_it);
1257 retransmission_map_.erase(sequence_number);
1258 return;
1259 }
1260
1261 bool QuicConnection::WritePacket(EncryptionLevel level, 1185 bool QuicConnection::WritePacket(EncryptionLevel level,
1262 QuicPacketSequenceNumber sequence_number, 1186 QuicPacketSequenceNumber sequence_number,
1263 QuicPacket* packet, 1187 QuicPacket* packet,
1264 HasRetransmittableData retransmittable, 1188 HasRetransmittableData retransmittable,
1265 Force forced) { 1189 Force forced) {
1266 if (!connected_) { 1190 if (!connected_) {
1267 DLOG(INFO) << ENDPOINT 1191 DLOG(INFO) << ENDPOINT
1268 << "Not sending packet as connection is disconnected."; 1192 << "Not sending packet as connection is disconnected.";
1269 delete packet; 1193 delete packet;
1270 // Returning true because we deleted the packet and the caller shouldn't 1194 // Returning true because we deleted the packet and the caller shouldn't
1271 // delete it again. 1195 // delete it again.
1272 return true; 1196 return true;
1273 } 1197 }
1274 1198
1275 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE && 1199 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE &&
1276 level == ENCRYPTION_NONE) { 1200 level == ENCRYPTION_NONE) {
1277 // Drop packets that are NULL encrypted since the peer won't accept them 1201 // Drop packets that are NULL encrypted since the peer won't accept them
1278 // anymore. 1202 // anymore.
1279 DLOG(INFO) << ENDPOINT << "Dropped packet: " << sequence_number 1203 DLOG(INFO) << ENDPOINT << "Dropping packet: " << sequence_number
1280 << " since the packet is NULL encrypted."; 1204 << " since the packet is NULL encrypted.";
1281 DropPacket(sequence_number); 1205 sent_packet_manager_.DiscardPacket(sequence_number);
1282 delete packet; 1206 delete packet;
1283 return true; 1207 return true;
1284 } 1208 }
1285 1209
1286 Retransmission retransmission = IsRetransmission(sequence_number) ? 1210 Retransmission retransmission =
1211 sent_packet_manager_.IsRetransmission(sequence_number) ?
1287 IS_RETRANSMISSION : NOT_RETRANSMISSION; 1212 IS_RETRANSMISSION : NOT_RETRANSMISSION;
1288 // TODO(wtc): use the same logic that is used in the packet generator. 1213 // TODO(wtc): use the same logic that is used in the packet generator.
1289 // Namely, a packet is a handshake if it contains a stream frame for the 1214 // Namely, a packet is a handshake if it contains a stream frame for the
1290 // crypto stream. It should be possible to look at the RetransmittableFrames 1215 // crypto stream. It should be possible to look at the RetransmittableFrames
1291 // in the SerializedPacket to determine this for a packet. 1216 // in the SerializedPacket to determine this for a packet.
1292 IsHandshake handshake = level == ENCRYPTION_NONE ? IS_HANDSHAKE 1217 IsHandshake handshake = level == ENCRYPTION_NONE ? IS_HANDSHAKE
1293 : NOT_HANDSHAKE; 1218 : NOT_HANDSHAKE;
1294 1219
1295 // If we are not forced and we can't write, then simply return false; 1220 // If we are not forced and we can't write, then simply return false;
1296 if (forced == NO_FORCE && 1221 if (forced == NO_FORCE &&
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1388 // WritePacketToWire returned -1, then |error| will be populated with 1313 // WritePacketToWire returned -1, then |error| will be populated with
1389 // an error code, which we want to pass along to the visitor. 1314 // an error code, which we want to pass along to the visitor.
1390 debug_visitor_->OnPacketSent(sequence_number, level, packet, 1315 debug_visitor_->OnPacketSent(sequence_number, level, packet,
1391 bytes_written == -1 ? *error : bytes_written); 1316 bytes_written == -1 ? *error : bytes_written);
1392 } 1317 }
1393 return bytes_written; 1318 return bytes_written;
1394 } 1319 }
1395 1320
1396 bool QuicConnection::OnSerializedPacket( 1321 bool QuicConnection::OnSerializedPacket(
1397 const SerializedPacket& serialized_packet) { 1322 const SerializedPacket& serialized_packet) {
1398 if (serialized_packet.retransmittable_frames != NULL) { 1323 if (serialized_packet.retransmittable_frames) {
1399 DCHECK(unacked_packets_.empty() ||
1400 unacked_packets_.rbegin()->first <
1401 serialized_packet.sequence_number);
1402 // Retransmitted frames will be sent with the same encryption level as the
1403 // original.
1404 serialized_packet.retransmittable_frames->set_encryption_level( 1324 serialized_packet.retransmittable_frames->set_encryption_level(
1405 encryption_level_); 1325 encryption_level_);
1406 unacked_packets_.insert(
1407 make_pair(serialized_packet.sequence_number,
1408 serialized_packet.retransmittable_frames));
1409 // All unacked packets might be retransmitted.
1410 retransmission_map_.insert(
1411 make_pair(serialized_packet.sequence_number,
1412 RetransmissionInfo(
1413 serialized_packet.sequence_number,
1414 serialized_packet.sequence_number_length)));
1415 } else if (serialized_packet.packet->is_fec_packet()) {
1416 unacked_fec_packets_.insert(make_pair(
1417 serialized_packet.sequence_number,
1418 serialized_packet.retransmittable_frames));
1419 } 1326 }
1327 sent_packet_manager_.OnSerializedPacket(serialized_packet);
1420 return SendOrQueuePacket(encryption_level_, 1328 return SendOrQueuePacket(encryption_level_,
1421 serialized_packet.sequence_number, 1329 serialized_packet.sequence_number,
1422 serialized_packet.packet, 1330 serialized_packet.packet,
1423 serialized_packet.entropy_hash, 1331 serialized_packet.entropy_hash,
1424 serialized_packet.retransmittable_frames != NULL ? 1332 serialized_packet.retransmittable_frames != NULL ?
1425 HAS_RETRANSMITTABLE_DATA : 1333 HAS_RETRANSMITTABLE_DATA :
1426 NO_RETRANSMITTABLE_DATA); 1334 NO_RETRANSMITTABLE_DATA,
1335 HasForcedFrames(
1336 serialized_packet.retransmittable_frames));
1337 }
1338
1339 QuicPacketSequenceNumber QuicConnection::GetPeerLargestObservedPacket() {
1340 return received_packet_manager_.peer_largest_observed_packet();
1341 }
1342
1343 QuicPacketSequenceNumber QuicConnection::GetNextPacketSequenceNumber() {
1344 return packet_creator_.sequence_number() + 1;
1345 }
1346
1347 void QuicConnection::OnPacketNacked(QuicPacketSequenceNumber sequence_number,
1348 size_t nack_count) {
1349 if (nack_count >= kNumberOfNacksBeforeRetransmission &&
1350 retransmitted_nacked_packet_count_ < kMaxRetransmissionsPerAck) {
1351 ++retransmitted_nacked_packet_count_;
1352 RetransmitPacket(sequence_number);
1353 }
1427 } 1354 }
1428 1355
1429 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, 1356 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
1430 QuicPacketSequenceNumber sequence_number, 1357 QuicPacketSequenceNumber sequence_number,
1431 QuicPacket* packet, 1358 QuicPacket* packet,
1432 QuicPacketEntropyHash entropy_hash, 1359 QuicPacketEntropyHash entropy_hash,
1433 HasRetransmittableData retransmittable) { 1360 HasRetransmittableData retransmittable,
1361 Force forced) {
1434 sent_entropy_manager_.RecordPacketEntropyHash(sequence_number, entropy_hash); 1362 sent_entropy_manager_.RecordPacketEntropyHash(sequence_number, entropy_hash);
1435 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) { 1363 if (!WritePacket(level, sequence_number, packet, retransmittable, forced)) {
1436 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level, 1364 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level,
1437 retransmittable)); 1365 retransmittable, forced));
1438 return false; 1366 return false;
1439 } 1367 }
1440 return true; 1368 return true;
1441 } 1369 }
1442 1370
1443 bool QuicConnection::ShouldSimulateLostPacket() { 1371 bool QuicConnection::ShouldSimulateLostPacket() {
1444 // TODO(rch): enable this 1372 // TODO(rch): enable this
1445 return false; 1373 return false;
1446 /* 1374 /*
1447 return FLAGS_fake_packet_loss_percentage > 0 && 1375 return FLAGS_fake_packet_loss_percentage > 0 &&
1448 random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage; 1376 random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage;
1449 */ 1377 */
1450 } 1378 }
1451 1379
1452 void QuicConnection::UpdateSentPacketInfo(SentPacketInfo* sent_info) { 1380 void QuicConnection::UpdateSentPacketInfo(SentPacketInfo* sent_info) {
1453 if (!unacked_packets_.empty()) { 1381 sent_info->least_unacked = sent_packet_manager_.GetLeastUnackedSentPacket();
1454 sent_info->least_unacked = unacked_packets_.begin()->first;
1455 } else {
1456 // If there are no unacked packets, set the least unacked packet to
1457 // sequence_number() + 1 since that will be the sequence number of this
1458 // ack packet whenever it is sent.
1459 sent_info->least_unacked = packet_creator_.sequence_number() + 1;
1460 }
1461 sent_info->entropy_hash = sent_entropy_manager_.EntropyHash( 1382 sent_info->entropy_hash = sent_entropy_manager_.EntropyHash(
1462 sent_info->least_unacked - 1); 1383 sent_info->least_unacked - 1);
1463 } 1384 }
1464 1385
1465 void QuicConnection::SendAck() { 1386 void QuicConnection::SendAck() {
1466 ack_alarm_->Cancel(); 1387 ack_alarm_->Cancel();
1467 1388
1468 // TODO(rch): delay this until the CreateFeedbackFrame 1389 // TODO(rch): delay this until the CreateFeedbackFrame
1469 // method is invoked. This requires changes SetShouldSendAck 1390 // method is invoked. This requires changes SetShouldSendAck
1470 // to be a no-arg method, and re-jiggering its implementation. 1391 // to be a no-arg method, and re-jiggering its implementation.
1471 bool send_feedback = false; 1392 bool send_feedback = false;
1472 if (congestion_manager_.GenerateCongestionFeedback( 1393 if (congestion_manager_.GenerateCongestionFeedback(
1473 &outgoing_congestion_feedback_)) { 1394 &outgoing_congestion_feedback_)) {
1474 DVLOG(1) << ENDPOINT << "Sending feedback " 1395 DVLOG(1) << ENDPOINT << "Sending feedback "
1475 << outgoing_congestion_feedback_; 1396 << outgoing_congestion_feedback_;
1476 send_feedback = true; 1397 send_feedback = true;
1477 } 1398 }
1478 1399
1479 packet_generator_.SetShouldSendAck(send_feedback); 1400 packet_generator_.SetShouldSendAck(send_feedback);
1480 } 1401 }
1481 1402
1482 void QuicConnection::MaybeAbandonFecPacket( 1403 void QuicConnection::MaybeAbandonFecPacket(
1483 QuicPacketSequenceNumber sequence_number) { 1404 QuicPacketSequenceNumber sequence_number) {
1484 if (!ContainsKey(unacked_fec_packets_, sequence_number)) { 1405 if (!sent_packet_manager_.IsFecUnacked(sequence_number)) {
1485 DVLOG(2) << ENDPOINT << "no need to abandon fec packet: " 1406 DVLOG(2) << ENDPOINT << "no need to abandon fec packet: "
1486 << sequence_number << "; it's already acked'"; 1407 << sequence_number << "; it's already acked'";
1487 return; 1408 return;
1488 } 1409 }
1489 congestion_manager_.AbandoningPacket(sequence_number); 1410 congestion_manager_.AbandoningPacket(sequence_number);
1490 // TODO(satyashekhar): Should this decrease the congestion window?
1491 } 1411 }
1492 1412
1493 QuicTime QuicConnection::OnRetransmissionTimeout() { 1413 QuicTime QuicConnection::OnRetransmissionTimeout() {
1494 // This guards against registering the alarm later than we should. 1414 // This guards against registering the alarm later than we should.
1495 // 1415 //
1496 // If we have packet A and B in the list and we call 1416 // If we have packet A and B in the list and we call
1497 // MaybeRetransmitPacketForRTO on A, that may trigger a call to 1417 // MaybeRetransmitPacketForRTO on A, that may trigger a call to
1498 // SetRetransmissionAlarm if A is retransmitted as C. In that case we 1418 // SetRetransmissionAlarm if A is retransmitted as C. In that case we
1499 // don't want to register the alarm under SetRetransmissionAlarm; we 1419 // don't want to register the alarm under SetRetransmissionAlarm; we
1500 // want to set it to the RTO of B when we return from this function. 1420 // want to set it to the RTO of B when we return from this function.
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 } 1567 }
1648 group_map_[fec_group_num] = new QuicFecGroup(); 1568 group_map_[fec_group_num] = new QuicFecGroup();
1649 } 1569 }
1650 return group_map_[fec_group_num]; 1570 return group_map_[fec_group_num];
1651 } 1571 }
1652 1572
1653 void QuicConnection::SendConnectionClose(QuicErrorCode error) { 1573 void QuicConnection::SendConnectionClose(QuicErrorCode error) {
1654 SendConnectionCloseWithDetails(error, string()); 1574 SendConnectionCloseWithDetails(error, string());
1655 } 1575 }
1656 1576
1657 void QuicConnection::SendConnectionClosePacket(QuicErrorCode error,
1658 const string& details) {
1659 DLOG(INFO) << ENDPOINT << "Force closing with error "
1660 << QuicUtils::ErrorToString(error) << " (" << error << ") "
1661 << details;
1662 QuicConnectionCloseFrame frame;
1663 frame.error_code = error;
1664 frame.error_details = details;
1665 UpdateSentPacketInfo(&frame.ack_frame.sent_info);
1666 received_packet_manager_.UpdateReceivedPacketInfo(
1667 &frame.ack_frame.received_info, clock_->ApproximateNow());
1668
1669 SerializedPacket serialized_packet =
1670 packet_creator_.SerializeConnectionClose(&frame);
1671
1672 // We need to update the sent entropy hash for all sent packets.
1673 sent_entropy_manager_.RecordPacketEntropyHash(
1674 serialized_packet.sequence_number,
1675 serialized_packet.entropy_hash);
1676
1677 if (!WritePacket(encryption_level_,
1678 serialized_packet.sequence_number,
1679 serialized_packet.packet,
1680 serialized_packet.retransmittable_frames != NULL ?
1681 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA,
1682 FORCE)) {
1683 delete serialized_packet.packet;
1684 }
1685 }
1686
1687 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, 1577 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error,
1688 const string& details) { 1578 const string& details) {
1689 if (!write_blocked_) { 1579 if (!write_blocked_) {
1690 SendConnectionClosePacket(error, details); 1580 SendConnectionClosePacket(error, details);
1691 } 1581 }
1692 CloseConnection(error, false); 1582 CloseConnection(error, false);
1693 } 1583 }
1694 1584
1585 void QuicConnection::SendConnectionClosePacket(QuicErrorCode error,
1586 const string& details) {
1587 DLOG(INFO) << ENDPOINT << "Force closing with error "
1588 << QuicUtils::ErrorToString(error) << " (" << error << ") "
1589 << details;
1590 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame();
1591 frame->error_code = error;
1592 frame->error_details = details;
1593 UpdateSentPacketInfo(&frame->ack_frame.sent_info);
1594 received_packet_manager_.UpdateReceivedPacketInfo(
1595 &frame->ack_frame.received_info, clock_->ApproximateNow());
1596 packet_generator_.AddControlFrame(QuicFrame(frame));
1597 Flush();
1598 }
1599
1695 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) { 1600 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) {
1696 DCHECK(connected_); 1601 DCHECK(connected_);
1697 connected_ = false; 1602 connected_ = false;
1698 visitor_->ConnectionClose(error, from_peer); 1603 visitor_->ConnectionClose(error, from_peer);
1699 } 1604 }
1700 1605
1701 void QuicConnection::SendGoAway(QuicErrorCode error, 1606 void QuicConnection::SendGoAway(QuicErrorCode error,
1702 QuicStreamId last_good_stream_id, 1607 QuicStreamId last_good_stream_id,
1703 const string& reason) { 1608 const string& reason) {
1704 DLOG(INFO) << ENDPOINT << "Going away with error " 1609 DLOG(INFO) << ENDPOINT << "Going away with error "
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 timeout = connection_timeout; 1706 timeout = connection_timeout;
1802 } 1707 }
1803 } 1708 }
1804 1709
1805 timeout_alarm_->Cancel(); 1710 timeout_alarm_->Cancel();
1806 timeout_alarm_->Set(clock_->ApproximateNow().Add(timeout)); 1711 timeout_alarm_->Set(clock_->ApproximateNow().Add(timeout));
1807 return false; 1712 return false;
1808 } 1713 }
1809 1714
1810 } // namespace net 1715 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_helper_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698