| Index: trunk/src/net/quic/quic_connection.cc
|
| ===================================================================
|
| --- trunk/src/net/quic/quic_connection.cc (revision 204061)
|
| +++ trunk/src/net/quic/quic_connection.cc (working copy)
|
| @@ -125,7 +125,7 @@
|
| it != queued_packets_.end(); ++it) {
|
| delete it->packet;
|
| }
|
| - DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_;
|
| + LOG(ERROR) << "Quic connection " << write_blocked_;
|
| }
|
|
|
| bool QuicConnection::SelectMutualVersion(
|
| @@ -242,7 +242,6 @@
|
| if (!SelectMutualVersion(packet.versions)) {
|
| SendConnectionCloseWithDetails(QUIC_INVALID_VERSION,
|
| "no common version found");
|
| - return;
|
| }
|
|
|
| version_negotiation_state_ = NEGOTIATED_VERSION;
|
| @@ -362,18 +361,19 @@
|
| congestion_manager_.OnIncomingAckFrame(incoming_ack,
|
| time_of_last_received_packet_);
|
|
|
| - // Now the we have received an ack, we might be able to send packets which are
|
| - // queued locally, or drain streams which are blocked.
|
| - QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
|
| - time_of_last_received_packet_, NOT_RETRANSMISSION,
|
| - HAS_RETRANSMITTABLE_DATA);
|
| - if (delay.IsZero()) {
|
| - helper_->UnregisterSendAlarmIfRegistered();
|
| - if (!write_blocked_) {
|
| - OnCanWrite();
|
| + // Now the we have received an ack, we might be able to send queued packets.
|
| + if (!queued_packets_.empty()) {
|
| + QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
|
| + time_of_last_received_packet_, NOT_RETRANSMISSION,
|
| + HAS_RETRANSMITTABLE_DATA);
|
| + if (delay.IsZero()) {
|
| + helper_->UnregisterSendAlarmIfRegistered();
|
| + if (!write_blocked_) {
|
| + OnCanWrite();
|
| + }
|
| + } else if (!delay.IsInfinite()) {
|
| + helper_->SetSendAlarm(time_of_last_received_packet_.Add(delay));
|
| }
|
| - } else if (!delay.IsInfinite()) {
|
| - helper_->SetSendAlarm(time_of_last_received_packet_.Add(delay));
|
| }
|
| return connected_;
|
| }
|
| @@ -461,8 +461,24 @@
|
| return true;
|
| }
|
|
|
| -void QuicConnection::HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
|
| - SequenceNumberSet* acked_packets) {
|
| +void QuicConnection::UpdatePacketInformationReceivedByPeer(
|
| + const QuicAckFrame& incoming_ack) {
|
| + SequenceNumberSet acked_packets;
|
| +
|
| + // ValidateAck should fail if largest_observed ever shrinks.
|
| + DCHECK_LE(peer_largest_observed_packet_,
|
| + incoming_ack.received_info.largest_observed);
|
| + peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed;
|
| +
|
| + if (incoming_ack.received_info.missing_packets.empty()) {
|
| + least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1;
|
| + } else {
|
| + least_packet_awaited_by_peer_ =
|
| + *(incoming_ack.received_info.missing_packets.begin());
|
| + }
|
| +
|
| + entropy_manager_.ClearSentEntropyBefore(least_packet_awaited_by_peer_ - 1);
|
| +
|
| int retransmitted_packets = 0;
|
| // Go through the packets we have not received an ack for and see if this
|
| // incoming_ack shows they've been seen by the peer.
|
| @@ -476,9 +492,11 @@
|
| if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
|
| // Packet was acked, so remove it from our unacked packet list.
|
| DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number;
|
| - acked_packets->insert(sequence_number);
|
| + acked_packets.insert(sequence_number);
|
| delete unacked;
|
| - unacked_packets_.erase(it++);
|
| + UnackedPacketMap::iterator it_tmp = it;
|
| + ++it;
|
| + unacked_packets_.erase(it_tmp);
|
| retransmission_map_.erase(sequence_number);
|
| } else {
|
| // This is a packet which we planned on retransmitting and has not been
|
| @@ -504,48 +522,6 @@
|
| }
|
| }
|
| }
|
| -}
|
| -
|
| -void QuicConnection::HandleAckForSentFecPackets(
|
| - const QuicAckFrame& incoming_ack, SequenceNumberSet* acked_packets) {
|
| - UnackedPacketMap::iterator it = unacked_fec_packets_.begin();
|
| - while (it != unacked_fec_packets_.end()) {
|
| - QuicPacketSequenceNumber sequence_number = it->first;
|
| - if (sequence_number > peer_largest_observed_packet_) {
|
| - break;
|
| - }
|
| - if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
|
| - DVLOG(1) << ENDPOINT << "Got an ack for fec packet: " << sequence_number;
|
| - acked_packets->insert(sequence_number);
|
| - unacked_fec_packets_.erase(it++);
|
| - } else {
|
| - DVLOG(1) << ENDPOINT << "Still missing ack for fec packet: "
|
| - << sequence_number;
|
| - ++it;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void QuicConnection::UpdatePacketInformationReceivedByPeer(
|
| - const QuicAckFrame& incoming_ack) {
|
| - // ValidateAck should fail if largest_observed ever shrinks.
|
| - DCHECK_LE(peer_largest_observed_packet_,
|
| - incoming_ack.received_info.largest_observed);
|
| - peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed;
|
| -
|
| - if (incoming_ack.received_info.missing_packets.empty()) {
|
| - least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1;
|
| - } else {
|
| - least_packet_awaited_by_peer_ =
|
| - *(incoming_ack.received_info.missing_packets.begin());
|
| - }
|
| -
|
| - entropy_manager_.ClearSentEntropyBefore(least_packet_awaited_by_peer_ - 1);
|
| -
|
| - SequenceNumberSet acked_packets;
|
| - HandleAckForSentPackets(incoming_ack, &acked_packets);
|
| - HandleAckForSentFecPackets(incoming_ack, &acked_packets);
|
| -
|
| if (acked_packets.size() > 0) {
|
| visitor_->OnAck(acked_packets);
|
| }
|
| @@ -984,7 +960,7 @@
|
| it->second.number_retransmissions > 0;
|
| }
|
|
|
| -void QuicConnection::SetupRetransmission(
|
| +void QuicConnection::MaybeSetupRetransmission(
|
| QuicPacketSequenceNumber sequence_number) {
|
| RetransmissionMap::iterator it = retransmission_map_.find(sequence_number);
|
| if (it == retransmission_map_.end()) {
|
| @@ -997,12 +973,10 @@
|
| congestion_manager_.GetRetransmissionDelay(
|
| unacked_packets_.size(),
|
| retransmission_info.number_retransmissions);
|
| + retransmission_info.scheduled_time =
|
| + clock_->ApproximateNow().Add(retransmission_delay);
|
| + retransmission_timeouts_.push(retransmission_info);
|
|
|
| - retransmission_timeouts_.push(RetransmissionTime(
|
| - sequence_number,
|
| - clock_->ApproximateNow().Add(retransmission_delay),
|
| - false));
|
| -
|
| // Do not set the retransmisson alarm if we're already handling the
|
| // retransmission alarm because the retransmission alarm will be reset when
|
| // OnRetransmissionTimeout completes.
|
| @@ -1013,18 +987,6 @@
|
| // SendStreamData().
|
| }
|
|
|
| -void QuicConnection::SetupAbandonFecTimer(
|
| - QuicPacketSequenceNumber sequence_number) {
|
| - DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
|
| - QuicTime::Delta retransmission_delay =
|
| - QuicTime::Delta::FromMilliseconds(
|
| - congestion_manager_.DefaultRetransmissionTime().ToMilliseconds() * 3);
|
| - retransmission_timeouts_.push(RetransmissionTime(
|
| - sequence_number,
|
| - clock_->ApproximateNow().Add(retransmission_delay),
|
| - true));
|
| -}
|
| -
|
| void QuicConnection::DropPacket(QuicPacketSequenceNumber sequence_number) {
|
| UnackedPacketMap::iterator unacked_it =
|
| unacked_packets_.find(sequence_number);
|
| @@ -1115,11 +1077,7 @@
|
| // Set the retransmit alarm only when we have sent the packet to the client
|
| // and not when it goes to the pending queue, otherwise we will end up adding
|
| // an entry to retransmission_timeout_ every time we attempt a write.
|
| - if (retransmittable == HAS_RETRANSMITTABLE_DATA) {
|
| - SetupRetransmission(sequence_number);
|
| - } else if (packet->is_fec_packet()) {
|
| - SetupAbandonFecTimer(sequence_number);
|
| - }
|
| + MaybeSetupRetransmission(sequence_number);
|
|
|
| congestion_manager_.SentPacket(sequence_number, now, packet->length(),
|
| retransmission);
|
| @@ -1153,10 +1111,6 @@
|
| retransmission_map_.insert(
|
| make_pair(serialized_packet.sequence_number,
|
| RetransmissionInfo(serialized_packet.sequence_number)));
|
| - } else if (serialized_packet.packet->is_fec_packet()) {
|
| - unacked_fec_packets_.insert(make_pair(
|
| - serialized_packet.sequence_number,
|
| - serialized_packet.retransmittable_frames));
|
| }
|
| return SendOrQueuePacket(encryption_level_,
|
| serialized_packet.sequence_number,
|
| @@ -1226,17 +1180,6 @@
|
| packet_generator_.SetShouldSendAck(send_feedback);
|
| }
|
|
|
| -void QuicConnection::MaybeAbandonFecPacket(
|
| - QuicPacketSequenceNumber sequence_number) {
|
| - if (!ContainsKey(unacked_fec_packets_, sequence_number)) {
|
| - DVLOG(2) << ENDPOINT << "no need to abandon fec packet: "
|
| - << sequence_number << "; it's already acked'";
|
| - return;
|
| - }
|
| - congestion_manager_.AbandoningPacket(sequence_number);
|
| - // TODO(satyashekhar): Should this decrease the congestion window?
|
| -}
|
| -
|
| QuicTime QuicConnection::OnRetransmissionTimeout() {
|
| // This guards against registering the alarm later than we should.
|
| //
|
| @@ -1249,24 +1192,19 @@
|
|
|
| for (size_t i = 0; i < max_packets_per_retransmission_alarm_ &&
|
| !retransmission_timeouts_.empty(); ++i) {
|
| - RetransmissionTime retransmission_time = retransmission_timeouts_.top();
|
| - DCHECK(retransmission_time.scheduled_time.IsInitialized());
|
| - if (retransmission_time.scheduled_time > clock_->ApproximateNow()) {
|
| + RetransmissionInfo retransmission_info = retransmission_timeouts_.top();
|
| + DCHECK(retransmission_info.scheduled_time.IsInitialized());
|
| + if (retransmission_info.scheduled_time > clock_->ApproximateNow()) {
|
| break;
|
| }
|
| retransmission_timeouts_.pop();
|
| -
|
| - if (retransmission_time.for_fec) {
|
| - MaybeAbandonFecPacket(retransmission_time.sequence_number);
|
| - continue;
|
| - } else if (
|
| - !MaybeRetransmitPacketForRTO(retransmission_time.sequence_number)) {
|
| + if (!MaybeRetransmitPacketForRTO(retransmission_info.sequence_number)) {
|
| DLOG(INFO) << ENDPOINT << "MaybeRetransmitPacketForRTO failed: "
|
| << "adding an extra delay for "
|
| - << retransmission_time.sequence_number;
|
| - retransmission_time.scheduled_time = clock_->ApproximateNow().Add(
|
| + << retransmission_info.sequence_number;
|
| + retransmission_info.scheduled_time = clock_->ApproximateNow().Add(
|
| congestion_manager_.DefaultRetransmissionTime());
|
| - retransmission_timeouts_.push(retransmission_time);
|
| + retransmission_timeouts_.push(retransmission_info);
|
| }
|
| }
|
|
|
| @@ -1439,21 +1377,21 @@
|
| }
|
|
|
| void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) {
|
| - if (timeout < idle_network_timeout_) {
|
| + // if (timeout < idle_network_timeout_) {
|
| idle_network_timeout_ = timeout;
|
| CheckForTimeout();
|
| - } else {
|
| - idle_network_timeout_ = timeout;
|
| - }
|
| + // } else {
|
| + // idle_network_timeout_ = timeout;
|
| + // }
|
| }
|
|
|
| void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) {
|
| - if (timeout < overall_connection_timeout_) {
|
| + // if (timeout < overall_connection_timeout_) {
|
| overall_connection_timeout_ = timeout;
|
| CheckForTimeout();
|
| - } else {
|
| - overall_connection_timeout_ = timeout;
|
| - }
|
| + // } else {
|
| + // overall_connection_timeout_ = timeout;
|
| + // }
|
| }
|
|
|
| bool QuicConnection::CheckForTimeout() {
|
| @@ -1461,9 +1399,6 @@
|
| QuicTime time_of_last_packet = std::max(time_of_last_received_packet_,
|
| time_of_last_sent_packet_);
|
|
|
| - // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet|
|
| - // is accurate time. However, this should not change the behavior of
|
| - // timeout handling.
|
| QuicTime::Delta delta = now.Subtract(time_of_last_packet);
|
| DVLOG(1) << ENDPOINT << "last packet "
|
| << time_of_last_packet.ToDebuggingValue()
|
|
|