| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |