Remove TLP and RTO retransmissions by deprecating gfe2_restart_flag_quic_default_on_pto2. PiperOrigin-RevId: 445670173
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc index 283fdf5..a8fb322 100644 --- a/quiche/quic/core/http/quic_spdy_session_test.cc +++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -2172,7 +2172,7 @@ EXPECT_CALL(*stream6, RetransmitStreamData(_, _, _, _)) .WillOnce(Return(true)); EXPECT_CALL(*send_algorithm, OnApplicationLimited(_)); - session_.RetransmitFrames(frames, TLP_RETRANSMISSION); + session_.RetransmitFrames(frames, PTO_RETRANSMISSION); } TEST_P(QuicSpdySessionTestServer, OnPriorityFrame) {
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index 4ce6658..1d134b5 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -617,12 +617,10 @@ if (config.HasClientSentConnectionOption(k5RTO, perspective_)) { num_rtos_for_blackhole_detection_ = 5; } - if (sent_packet_manager_.pto_enabled()) { - if (config.HasClientSentConnectionOption(k6PTO, perspective_) || - config.HasClientSentConnectionOption(k7PTO, perspective_) || - config.HasClientSentConnectionOption(k8PTO, perspective_)) { - num_rtos_for_blackhole_detection_ = 5; - } + if (config.HasClientSentConnectionOption(k6PTO, perspective_) || + config.HasClientSentConnectionOption(k7PTO, perspective_) || + config.HasClientSentConnectionOption(k8PTO, perspective_)) { + num_rtos_for_blackhole_detection_ = 5; } if (config.HasClientSentConnectionOption(kNSTP, perspective_)) { no_stop_waiting_frames_ = true; @@ -4138,11 +4136,8 @@ packet_creator_.packet_number(); const auto retransmission_mode = sent_packet_manager_.OnRetransmissionTimeout(); - if (sent_packet_manager_.skip_packet_number_for_pto() && - retransmission_mode == QuicSentPacketManager::PTO_MODE && - sent_packet_manager_.pending_timer_transmission_count() == 1) { - // Skip a packet number when a single PTO packet is sent to elicit an - // immediate ACK. + if (retransmission_mode == QuicSentPacketManager::PTO_MODE) { + // Skip a packet number when PTO fires to elicit an immediate ACK. const QuicPacketCount num_packet_numbers_to_skip = 1; packet_creator_.SkipNPacketNumbers( num_packet_numbers_to_skip, @@ -4168,23 +4163,14 @@ if (!connected_) { return; } - - // In the PTO and TLP cases, the SentPacketManager gives the connection the - // opportunity to send new data before retransmitting. - if (sent_packet_manager_.pto_enabled()) { - sent_packet_manager_.MaybeSendProbePackets(); - } else if (sent_packet_manager_.MaybeRetransmitTailLossProbe()) { - // Send the pending retransmission now that it's been queued. - WriteIfNotBlocked(); - } + // When PTO fires, the SentPacketManager gives the connection the opportunity + // to send new data before retransmitting. + sent_packet_manager_.MaybeSendProbePacket(); if (packet_creator_.packet_number() == previous_created_packet_number && - (retransmission_mode == QuicSentPacketManager::TLP_MODE || - retransmission_mode == QuicSentPacketManager::RTO_MODE || - retransmission_mode == QuicSentPacketManager::PTO_MODE) && + retransmission_mode == QuicSentPacketManager::PTO_MODE && !visitor_->WillingAndAbleToWrite()) { - // Send PING if timer fires in TLP/RTO/PTO mode but there is no data to - // send. + // Send PING if timer fires in PTO mode but there is no data to send. QUIC_DLOG(INFO) << ENDPOINT << "No packet gets sent when timer fires in mode " << retransmission_mode << ", send PING"; @@ -4214,13 +4200,9 @@ } } if (retransmission_mode == QuicSentPacketManager::PTO_MODE) { - sent_packet_manager_.AdjustPendingTimerTransmissions(); - } - if (retransmission_mode != QuicSentPacketManager::LOSS_MODE && - retransmission_mode != QuicSentPacketManager::HANDSHAKE_MODE) { - // When timer fires in TLP/RTO/PTO mode, ensure 1) at least one packet is - // created, or there is data to send and available credit (such that - // packets will be sent eventually). + // When timer fires in PTO mode, ensure 1) at least one packet is created, + // or there is data to send and available credit (such that packets will be + // sent eventually). QUIC_BUG_IF( quic_bug_12714_27, packet_creator_.packet_number() == previous_created_packet_number && @@ -5974,10 +5956,9 @@ return true; } if (bundle_retransmittable_with_pto_ack_ && - (sent_packet_manager_.GetConsecutiveRtoCount() > 0 || - sent_packet_manager_.GetConsecutivePtoCount() > 0)) { - // Bundle a retransmittable frame with an ACK if the PTO or RTO has fired - // in order to recover more quickly in cases of temporary network outage. + sent_packet_manager_.GetConsecutivePtoCount() > 0) { + // Bundle a retransmittable frame with an ACK if PTO has fired in order to + // recover more quickly in cases of temporary network outage. return true; } return false; @@ -6337,8 +6318,6 @@ } QUIC_DVLOG(1) << ENDPOINT << error_details; const bool has_consecutive_pto = - sent_packet_manager_.GetConsecutiveTlpCount() > 0 || - sent_packet_manager_.GetConsecutiveRtoCount() > 0 || sent_packet_manager_.GetConsecutivePtoCount() > 0; if (has_consecutive_pto || visitor_->ShouldKeepConnectionAlive()) { if (GetQuicReloadableFlag(quic_add_stream_info_to_idle_close_detail) &&
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h index bed54f3..28d5747 100644 --- a/quiche/quic/core/quic_connection.h +++ b/quiche/quic/core/quic_connection.h
@@ -2103,8 +2103,8 @@ // from the peer. Default to kMaxConsecutiveNonRetransmittablePackets. size_t max_consecutive_num_packets_with_no_retransmittable_frames_; - // If true, bundle an ack-eliciting frame with an ACK if the PTO or RTO alarm - // have previously fired. + // If true, bundle an ack-eliciting frame with an ACK if the PTO alarm have + // previously fired. bool bundle_retransmittable_with_pto_ack_; // If true, the connection will fill up the pipe with extra data whenever the
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc index b77cc15..4a0db07 100644 --- a/quiche/quic/core/quic_connection_test.cc +++ b/quiche/quic/core/quic_connection_test.cc
@@ -478,11 +478,6 @@ .IsInitialized(); } - void SetMaxTailLossProbes(size_t max_tail_loss_probes) { - QuicSentPacketManagerPeer::SetMaxTailLossProbes( - QuicConnectionPeer::GetSentPacketManager(this), max_tail_loss_probes); - } - QuicByteCount GetBytesInFlight() { return QuicConnectionPeer::GetSentPacketManager(this)->GetBytesInFlight(); } @@ -493,16 +488,6 @@ next_effective_peer_addr_ = std::make_unique<QuicSocketAddress>(addr); } - bool PtoEnabled() { - if (QuicConnectionPeer::GetSentPacketManager(this)->pto_enabled()) { - // TLP/RTO related tests are stale when PTO is enabled. - QUICHE_DCHECK(PROTOCOL_TLS1_3 == version().handshake_protocol || - GetQuicRestartFlag(quic_default_on_pto2)); - return true; - } - return false; - } - void SendOrQueuePacket(SerializedPacket packet) override { QuicConnection::SendOrQueuePacket(std::move(packet)); self_address_on_default_path_while_sending_packet_ = self_address(); @@ -1692,10 +1677,8 @@ rtt_stats->set_initial_rtt(default_init_rtt * 2); EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt()); - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(manager_, 1); - EXPECT_EQ(1u, manager_->GetConsecutiveRtoCount()); - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(manager_, 2); - EXPECT_EQ(2u, manager_->GetConsecutiveTlpCount()); + QuicSentPacketManagerPeer::SetConsecutivePtoCount(manager_, 1); + EXPECT_EQ(1u, manager_->GetConsecutivePtoCount()); const QuicSocketAddress kNewPeerAddress = QuicSocketAddress(QuicIpAddress::Loopback6(), /*port=*/23456); @@ -1722,8 +1705,7 @@ EXPECT_EQ(kNewPeerAddress, connection_.effective_peer_address()); // PORT_CHANGE shouldn't state change in sent packet manager. EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt()); - EXPECT_EQ(1u, manager_->GetConsecutiveRtoCount()); - EXPECT_EQ(2u, manager_->GetConsecutiveTlpCount()); + EXPECT_EQ(1u, manager_->GetConsecutivePtoCount()); EXPECT_EQ(manager_->GetSendAlgorithm(), send_algorithm_); if (connection_.validate_client_address()) { EXPECT_EQ(NO_CHANGE, connection_.active_effective_peer_migration_type()); @@ -3321,8 +3303,6 @@ } TEST_P(QuicConnectionTest, AckNeedsRetransmittableFramesAfterPto) { - // Disable TLP so the RTO fires immediately. - connection_.SetMaxTailLossProbes(0); EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); QuicConfig config; QuicTagVector connection_options; @@ -3349,8 +3329,7 @@ connection_.GetRetransmissionAlarm()->deadline(); clock_.AdvanceTime(retransmission_time - clock_.Now()); connection_.GetRetransmissionAlarm()->Fire(); - ASSERT_TRUE(manager_->GetConsecutiveRtoCount() > 0 || - manager_->GetConsecutivePtoCount() > 0); + ASSERT_LT(0u, manager_->GetConsecutivePtoCount()); // Process a packet, which requests a retransmittable frame be bundled // with the ACK. @@ -4007,9 +3986,7 @@ EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); } -TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnRTO) { - connection_.SetMaxTailLossProbes(0); - +TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnPTO) { QuicStreamId stream_id = 2; QuicPacketNumber last_packet; SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); @@ -4019,17 +3996,11 @@ // Fire the RTO and verify that the RST_STREAM is resent, the stream data // is sent. - const size_t num_retransmissions = connection_.PtoEnabled() ? 1 : 2; - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) - .Times(AtLeast(num_retransmissions)); + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); clock_.AdvanceTime(DefaultRetransmissionTime()); connection_.GetRetransmissionAlarm()->Fire(); size_t padding_frame_count = writer_->padding_frames().size(); EXPECT_EQ(padding_frame_count + 1u, writer_->frame_count()); - if (num_retransmissions == 2) { - ASSERT_EQ(1u, writer_->rst_stream_frames().size()); - EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); - } } TEST_P(QuicConnectionTest, DoNotSendPendingRetransmissionForResetStream) { @@ -4167,33 +4138,6 @@ ProcessAckPacket(&frame); } -TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(0); - - for (int i = 0; i < 10; ++i) { - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); - connection_.SendStreamDataWithString(3, "foo", i * 3, NO_FIN); - } - - // Block the writer and ensure they're queued. - BlockOnNextWrite(); - clock_.AdvanceTime(DefaultRetransmissionTime()); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_TRUE(connection_.HasQueuedData()); - - // Unblock the writer. - writer_->SetWritable(); - clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds( - 2 * DefaultRetransmissionTime().ToMicroseconds())); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); - connection_.GetRetransmissionAlarm()->Fire(); - connection_.OnCanWrite(); -} - TEST_P(QuicConnectionTest, WriteBlockedBufferedThenSent) { BlockOnNextWrite(); writer_->set_is_write_blocked_data_buffered(true); @@ -4248,9 +4192,7 @@ writer_->SetWritable(); connection_.OnCanWrite(); EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); - uint64_t retransmission = connection_.PtoEnabled() ? 3 : 2; - EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, - retransmission)); + EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, 3)); } TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { @@ -4477,85 +4419,6 @@ EXPECT_EQ(QuicPacketNumber(6u), stop_waiting()->least_unacked); } -TEST_P(QuicConnectionTest, TLP) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(1); - - SendStreamDataToPeer(3, "foo", 0, NO_FIN, nullptr); - EXPECT_EQ(QuicPacketNumber(1u), stop_waiting()->least_unacked); - QuicTime retransmission_time = - connection_.GetRetransmissionAlarm()->deadline(); - EXPECT_NE(QuicTime::Zero(), retransmission_time); - - EXPECT_EQ(QuicPacketNumber(1u), writer_->header().packet_number); - // Simulate the retransmission alarm firing and sending a tlp, - // so send algorithm's OnRetransmissionTimeout is not called. - clock_.AdvanceTime(retransmission_time - clock_.Now()); - const QuicPacketNumber retransmission( - connection_.SupportsMultiplePacketNumberSpaces() ? 3 : 2); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, retransmission, _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_EQ(retransmission, writer_->header().packet_number); - // We do not raise the high water mark yet. - EXPECT_EQ(QuicPacketNumber(1u), stop_waiting()->least_unacked); -} - -TEST_P(QuicConnectionTest, RTO) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(0); - - QuicTime default_retransmission_time = - clock_.ApproximateNow() + DefaultRetransmissionTime(); - SendStreamDataToPeer(3, "foo", 0, NO_FIN, nullptr); - EXPECT_EQ(QuicPacketNumber(1u), stop_waiting()->least_unacked); - - EXPECT_EQ(QuicPacketNumber(1u), writer_->header().packet_number); - EXPECT_EQ(default_retransmission_time, - connection_.GetRetransmissionAlarm()->deadline()); - // Simulate the retransmission alarm firing. - clock_.AdvanceTime(DefaultRetransmissionTime()); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(2), _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_EQ(QuicPacketNumber(2u), writer_->header().packet_number); - // We do not raise the high water mark yet. - EXPECT_EQ(QuicPacketNumber(1u), stop_waiting()->least_unacked); -} - -// Regression test of b/133771183. -TEST_P(QuicConnectionTest, RtoWithNoDataToRetransmit) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - connection_.SetMaxTailLossProbes(0); - - SendStreamDataToPeer(3, "foo", 0, NO_FIN, nullptr); - // Connection is cwnd limited. - CongestionBlockWrites(); - // Stream gets reset. - SendRstStream(3, QUIC_ERROR_PROCESSING_STREAM, 3); - // Simulate the retransmission alarm firing. - clock_.AdvanceTime(DefaultRetransmissionTime()); - // RTO fires, but there is no packet to be RTOed. - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_EQ(1u, writer_->rst_stream_frames().size()); - - EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(40); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(20); - EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillRepeatedly(Return(false)); - EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(1); - // Receives packets 1 - 40. - for (size_t i = 1; i <= 40; ++i) { - ProcessDataPacket(i); - } -} - TEST_P(QuicConnectionTest, SendHandshakeMessages) { use_tagging_decrypter(); // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at @@ -4667,41 +4530,6 @@ ProcessDataPacketAtLevel(3, !kHasStopWaiting, ENCRYPTION_ZERO_RTT); } -TEST_P(QuicConnectionTest, TestRetransmitOrder) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(0); - - QuicByteCount first_packet_size; - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) - .WillOnce(SaveArg<3>(&first_packet_size)); - - connection_.SendStreamDataWithString(3, "first_packet", 0, NO_FIN); - QuicByteCount second_packet_size; - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) - .WillOnce(SaveArg<3>(&second_packet_size)); - connection_.SendStreamDataWithString(3, "second_packet", 12, NO_FIN); - EXPECT_NE(first_packet_size, second_packet_size); - // Advance the clock by huge time to make sure packets will be retransmitted. - clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); - { - InSequence s; - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); - } - connection_.GetRetransmissionAlarm()->Fire(); - - // Advance again and expect the packets to be sent again in the same order. - clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20)); - { - InSequence s; - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); - } - connection_.GetRetransmissionAlarm()->Fire(); -} - TEST_P(QuicConnectionTest, Buffer100NonDecryptablePacketsThenKeyChange) { if (connection_.SupportsMultiplePacketNumberSpaces()) { return; @@ -4756,55 +4584,7 @@ EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); } -TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(0); - - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); - connection_.SendStreamDataWithString(2, "foo", 0, NO_FIN); - connection_.SendStreamDataWithString(3, "bar", 0, NO_FIN); - QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm(); - EXPECT_TRUE(retransmission_alarm->IsSet()); - EXPECT_EQ(DefaultRetransmissionTime(), - retransmission_alarm->deadline() - clock_.Now()); - - // Advance the time right before the RTO, then receive an ack for the first - // packet to delay the RTO. - clock_.AdvanceTime(DefaultRetransmissionTime()); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); - QuicAckFrame ack = InitAckFrame(1); - ProcessAckPacket(&ack); - // Now we have an RTT sample of DefaultRetransmissionTime(500ms), - // so the RTO has increased to 2 * SRTT. - EXPECT_TRUE(retransmission_alarm->IsSet()); - EXPECT_EQ(retransmission_alarm->deadline() - clock_.Now(), - 2 * DefaultRetransmissionTime()); - - // Move forward past the original RTO and ensure the RTO is still pending. - clock_.AdvanceTime(2 * DefaultRetransmissionTime()); - - // Ensure the second packet gets retransmitted when it finally fires. - EXPECT_TRUE(retransmission_alarm->IsSet()); - EXPECT_EQ(retransmission_alarm->deadline(), clock_.ApproximateNow()); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); - // Manually cancel the alarm to simulate a real test. - connection_.GetRetransmissionAlarm()->Fire(); - - // The new retransmitted packet number should set the RTO to a larger value - // than previously. - EXPECT_TRUE(retransmission_alarm->IsSet()); - QuicTime next_rto_time = retransmission_alarm->deadline(); - QuicTime expected_rto_time = - connection_.sent_packet_manager().GetRetransmissionTime(); - EXPECT_EQ(next_rto_time, expected_rto_time); -} - TEST_P(QuicConnectionTest, TestQueued) { - connection_.SetMaxTailLossProbes(0); - EXPECT_EQ(0u, connection_.NumQueuedPackets()); BlockOnNextWrite(); connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN); @@ -5757,84 +5537,6 @@ TestConnectionCloseQuicErrorCode(QUIC_NETWORK_IDLE_TIMEOUT); } -TEST_P(QuicConnectionTest, TimeoutAfterRetransmission) { - if (connection_.PtoEnabled()) { - return; - } - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - EXPECT_TRUE(connection_.connected()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - QuicConfig config; - connection_.SetFromConfig(config); - - const QuicTime start_time = clock_.Now(); - const QuicTime::Delta initial_idle_timeout = - QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); - QuicTime default_timeout = clock_.Now() + initial_idle_timeout; - - connection_.SetMaxTailLossProbes(0); - const QuicTime default_retransmission_time = - start_time + DefaultRetransmissionTime(); - - ASSERT_LT(default_retransmission_time, default_timeout); - - // When we send a packet, the timeout will change to 5 ms + - // kInitialIdleTimeoutSecs (but it will not reschedule the alarm). - const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); - const QuicTime send_time = start_time + five_ms; - clock_.AdvanceTime(five_ms); - ASSERT_EQ(send_time, clock_.Now()); - SendStreamDataToPeer( - GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo", - 0, FIN, nullptr); - EXPECT_EQ(default_timeout + five_ms, - connection_.GetTimeoutAlarm()->deadline()); - - // Move forward 5 ms and receive a packet, which will move the timeout - // forward 5 ms more (but will not reschedule the alarm). - const QuicTime receive_time = send_time + five_ms; - clock_.AdvanceTime(receive_time - clock_.Now()); - ASSERT_EQ(receive_time, clock_.Now()); - ProcessPacket(1); - - // Now move forward to the retransmission time and retransmit the - // packet, which should move the timeout forward again (but will not - // reschedule the alarm). - EXPECT_EQ(default_retransmission_time + five_ms, - connection_.GetRetransmissionAlarm()->deadline()); - // Simulate the retransmission alarm firing. - const QuicTime rto_time = send_time + DefaultRetransmissionTime(); - const QuicTime final_timeout = rto_time + initial_idle_timeout; - clock_.AdvanceTime(rto_time - clock_.Now()); - ASSERT_EQ(rto_time, clock_.Now()); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(2u), _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - - // Advance to the original timeout and fire the alarm. The connection should - // timeout, and the alarm should be registered based on the time of the - // retransmission. - clock_.AdvanceTime(default_timeout - clock_.Now()); - ASSERT_EQ(default_timeout.ToDebuggingValue(), - clock_.Now().ToDebuggingValue()); - EXPECT_EQ(default_timeout, clock_.Now()); - EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); - EXPECT_TRUE(connection_.connected()); - ASSERT_EQ(final_timeout.ToDebuggingValue(), - connection_.GetTimeoutAlarm()->deadline().ToDebuggingValue()); - - // This time, we should time out. - EXPECT_CALL(visitor_, - OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); - clock_.AdvanceTime(final_timeout - clock_.Now()); - EXPECT_EQ(connection_.GetTimeoutAlarm()->deadline(), clock_.Now()); - EXPECT_EQ(final_timeout, clock_.Now()); - connection_.GetTimeoutAlarm()->Fire(); - EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); - EXPECT_FALSE(connection_.connected()); - TestConnectionCloseQuicErrorCode(QUIC_NETWORK_IDLE_TIMEOUT); -} - TEST_P(QuicConnectionTest, TimeoutAfterSendAfterHandshake) { // When the idle timeout fires, verify that by default we do not send any // connection close packets. @@ -5915,65 +5617,6 @@ IsError(QUIC_NETWORK_IDLE_TIMEOUT)); } -TEST_P(QuicConnectionTest, TimeoutAfterSendSilentCloseAndTLP) { - if (connection_.PtoEnabled()) { - return; - } - // Same test as above, but sending TLPs causes a connection close to be sent. - EXPECT_TRUE(connection_.connected()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - QuicConfig config; - - // Create a handshake message that also enables silent close. - CryptoHandshakeMessage msg; - std::string error_details; - QuicConfig client_config; - client_config.SetInitialStreamFlowControlWindowToSend( - kInitialStreamFlowControlWindowForTest); - client_config.SetInitialSessionFlowControlWindowToSend( - kInitialSessionFlowControlWindowForTest); - client_config.SetIdleNetworkTimeout( - QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs)); - client_config.ToHandshakeMessage(&msg, connection_.transport_version()); - const QuicErrorCode error = - config.ProcessPeerHello(msg, CLIENT, &error_details); - EXPECT_THAT(error, IsQuicNoError()); - - connection_.SetFromConfig(config); - QuicConnectionPeer::DisableBandwidthUpdate(&connection_); - - const QuicTime::Delta default_idle_timeout = - QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs - 1); - const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); - QuicTime default_timeout = clock_.ApproximateNow() + default_idle_timeout; - - // When we send a packet, the timeout will change to 5ms + - // kInitialIdleTimeoutSecs. - clock_.AdvanceTime(five_ms); - SendStreamDataToPeer( - GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo", - 0, FIN, nullptr); - EXPECT_EQ(default_timeout + five_ms, - connection_.GetTimeoutAlarm()->deadline()); - - // Retransmit the packet via tail loss probe. - clock_.AdvanceTime(connection_.GetRetransmissionAlarm()->deadline() - - clock_.Now()); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(2u), _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - - // This time, we should time out and send a connection close due to the TLP. - EXPECT_CALL(visitor_, - OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); - clock_.AdvanceTime(connection_.GetTimeoutAlarm()->deadline() - - clock_.ApproximateNow() + five_ms); - connection_.GetTimeoutAlarm()->Fire(); - EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); - EXPECT_FALSE(connection_.connected()); - TestConnectionCloseQuicErrorCode(QUIC_NETWORK_IDLE_TIMEOUT); -} - TEST_P(QuicConnectionTest, TimeoutAfterSendSilentCloseWithOpenStreams) { // Same test as above, but having open streams causes a connection close // to be sent. @@ -6149,58 +5792,6 @@ TestConnectionCloseQuicErrorCode(QUIC_NETWORK_IDLE_TIMEOUT); } -TEST_P(QuicConnectionTest, TimeoutAfter5ClientRTOs) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(2); - EXPECT_TRUE(connection_.connected()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - QuicConfig config; - QuicTagVector connection_options; - connection_options.push_back(k5RTO); - config.SetConnectionOptionsToSend(connection_options); - QuicConfigPeer::SetNegotiated(&config, true); - if (GetQuicReloadableFlag(quic_default_enable_5rto_blackhole_detection2)) { - EXPECT_CALL(visitor_, GetHandshakeState()) - .WillRepeatedly(Return(HANDSHAKE_COMPLETE)); - } - if (connection_.version().UsesTls()) { - QuicConfigPeer::SetReceivedOriginalConnectionId( - &config, connection_.connection_id()); - QuicConfigPeer::SetReceivedInitialSourceConnectionId( - &config, connection_.connection_id()); - } - connection_.SetFromConfig(config); - - // Send stream data. - SendStreamDataToPeer( - GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo", - 0, FIN, nullptr); - - // Fire the retransmission alarm 6 times, twice for TLP and 4 times for RTO. - for (int i = 0; i < 6; ++i) { - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); - EXPECT_TRUE(connection_.connected()); - } - EXPECT_CALL(visitor_, OnPathDegrading()); - connection_.PathDegradingTimeout(); - - EXPECT_EQ(2u, connection_.sent_packet_manager().GetConsecutiveTlpCount()); - EXPECT_EQ(4u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); - // This time, we should time out. - EXPECT_CALL(visitor_, - OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); - ASSERT_TRUE(connection_.BlackholeDetectionInProgress()); - connection_.GetBlackholeDetectorAlarm()->Fire(); - EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); - EXPECT_FALSE(connection_.connected()); - TestConnectionCloseQuicErrorCode(QUIC_TOO_MANY_RTOS); -} - TEST_P(QuicConnectionTest, SendScheduler) { // Test that if we send a packet without delay, it is not queued. QuicFramerPeer::SetPerspective(&peer_framer_, Perspective::IS_CLIENT); @@ -7102,63 +6693,6 @@ IsError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET)); } -TEST_P(QuicConnectionTest, CheckSendStats) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(0); - - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); - connection_.SendStreamDataWithString(3, "first", 0, NO_FIN); - size_t first_packet_size = writer_->last_packet_size(); - - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); - connection_.SendStreamDataWithString(5, "second", 0, NO_FIN); - size_t second_packet_size = writer_->last_packet_size(); - - // 2 retransmissions due to rto, 1 due to explicit nack. - EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); - - // Retransmit due to RTO. - clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); - connection_.GetRetransmissionAlarm()->Fire(); - - // Retransmit due to explicit nacks. - QuicAckFrame nack_three = - InitAckFrame({{QuicPacketNumber(2), QuicPacketNumber(3)}, - {QuicPacketNumber(4), QuicPacketNumber(5)}}); - - LostPacketVector lost_packets; - lost_packets.push_back( - LostPacket(QuicPacketNumber(1), kMaxOutgoingPacketSize)); - lost_packets.push_back( - LostPacket(QuicPacketNumber(3), kMaxOutgoingPacketSize)); - EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _, _)) - .WillOnce(DoAll(SetArgPointee<5>(lost_packets), - Return(LossDetectionInterface::DetectionStats()))); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - ProcessAckPacket(&nack_three); - - EXPECT_CALL(*send_algorithm_, BandwidthEstimate()) - .WillOnce(Return(QuicBandwidth::Zero())); - - const QuicConnectionStats& stats = connection_.GetStats(); - // For IETF QUIC, version is not included as the encryption level switches to - // FORWARD_SECURE in SendStreamDataWithString. - size_t save_on_version = - GetParam().version.HasIetfInvariantHeader() ? 0 : kQuicVersionSize; - EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - save_on_version, - stats.bytes_sent); - EXPECT_EQ(5u, stats.packets_sent); - EXPECT_EQ(2 * first_packet_size + second_packet_size - save_on_version, - stats.bytes_retransmitted); - EXPECT_EQ(3u, stats.packets_retransmitted); - EXPECT_EQ(1u, stats.rto_count); - EXPECT_EQ(kDefaultMaxPacketSize, stats.egress_mtu); -} - TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) { // Construct a packet with stream frame and connection close frame. QuicPacketHeader header; @@ -9201,10 +8735,8 @@ rtt_stats->set_initial_rtt(default_init_rtt * 2); EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt()); - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(manager_, 1); - EXPECT_EQ(1u, manager_->GetConsecutiveRtoCount()); - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(manager_, 2); - EXPECT_EQ(2u, manager_->GetConsecutiveTlpCount()); + QuicSentPacketManagerPeer::SetConsecutivePtoCount(manager_, 1); + EXPECT_EQ(1u, manager_->GetConsecutivePtoCount()); const SendAlgorithmInterface* send_algorithm = manager_->GetSendAlgorithm(); // Migrate to a new address with different IP. @@ -9214,8 +8746,7 @@ connection_.MigratePath(kNewSelfAddress, connection_.peer_address(), &new_writer, false); EXPECT_EQ(default_init_rtt, manager_->GetRttStats()->initial_rtt()); - EXPECT_EQ(0u, manager_->GetConsecutiveRtoCount()); - EXPECT_EQ(0u, manager_->GetConsecutiveTlpCount()); + EXPECT_EQ(0u, manager_->GetConsecutivePtoCount()); EXPECT_NE(send_algorithm, manager_->GetSendAlgorithm()); } @@ -9818,9 +9349,8 @@ } // Regresstion test for b/138962304. -TEST_P(QuicConnectionTest, TlpAndWriteBlocked) { +TEST_P(QuicConnectionTest, PtoAndWriteBlocked) { EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); - connection_.SetMaxTailLossProbes(1); QuicStreamId stream_id = 2; QuicPacketNumber last_data_packet; @@ -9843,44 +9373,6 @@ EXPECT_EQ(1u, connection_.NumQueuedPackets()); } -// Regresstion test for b/139375344. -TEST_P(QuicConnectionTest, RtoForcesSendingPing) { - if (connection_.PtoEnabled()) { - return; - } - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - connection_.SetMaxTailLossProbes(2); - EXPECT_EQ(0u, connection_.GetStats().tlp_count); - EXPECT_EQ(0u, connection_.GetStats().rto_count); - - SendStreamDataToPeer(2, "foo", 0, NO_FIN, nullptr); - QuicTime retransmission_time = - connection_.GetRetransmissionAlarm()->deadline(); - EXPECT_NE(QuicTime::Zero(), retransmission_time); - // TLP fires. - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(2), _, _)); - clock_.AdvanceTime(retransmission_time - clock_.Now()); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_EQ(1u, connection_.GetStats().tlp_count); - EXPECT_EQ(0u, connection_.GetStats().rto_count); - EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); - - // Packet 1 gets acked. - QuicAckFrame frame = InitAckFrame(1); - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _, _)); - ProcessAckPacket(1, &frame); - EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); - retransmission_time = connection_.GetRetransmissionAlarm()->deadline(); - - // RTO fires, verify a PING packet gets sent because there is no data to send. - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(3), _, _)); - clock_.AdvanceTime(retransmission_time - clock_.Now()); - connection_.GetRetransmissionAlarm()->Fire(); - EXPECT_EQ(1u, connection_.GetStats().tlp_count); - EXPECT_EQ(1u, connection_.GetStats().rto_count); - EXPECT_EQ(1u, writer_->ping_frames().size()); -} - TEST_P(QuicConnectionTest, ProbeTimeout) { QuicConfig config; QuicTagVector connection_options; @@ -9945,8 +9437,6 @@ EXPECT_CALL(visitor_, OnPathDegrading()); connection_.PathDegradingTimeout(); - EXPECT_EQ(0u, connection_.sent_packet_manager().GetConsecutiveTlpCount()); - EXPECT_EQ(0u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); EXPECT_EQ(5u, connection_.sent_packet_manager().GetConsecutivePtoCount()); // Closes connection on 6th PTO. // May send multiple connecction close packets with multiple PN spaces. @@ -9997,8 +9487,6 @@ EXPECT_CALL(visitor_, OnPathDegrading()); connection_.PathDegradingTimeout(); - EXPECT_EQ(0u, connection_.sent_packet_manager().GetConsecutiveTlpCount()); - EXPECT_EQ(0u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); EXPECT_EQ(6u, connection_.sent_packet_manager().GetConsecutivePtoCount()); // Closes connection on 7th PTO. EXPECT_CALL(visitor_, @@ -10048,8 +9536,6 @@ EXPECT_CALL(visitor_, OnPathDegrading()); connection_.PathDegradingTimeout(); - EXPECT_EQ(0u, connection_.sent_packet_manager().GetConsecutiveTlpCount()); - EXPECT_EQ(0u, connection_.sent_packet_manager().GetConsecutiveRtoCount()); EXPECT_EQ(7u, connection_.sent_packet_manager().GetConsecutivePtoCount()); // Closes connection on 8th PTO. EXPECT_CALL(visitor_, @@ -10353,49 +9839,6 @@ connection_close_frames[0].transport_close_frame_type); } -// Regression test for b/137401387 and b/138962304. -TEST_P(QuicConnectionTest, RtoPacketAsTwo) { - if (connection_.PtoEnabled()) { - return; - } - connection_.SetMaxTailLossProbes(1); - connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); - std::string stream_data(3000, 's'); - // Send packets 1 - 66 and exhaust cwnd. - for (size_t i = 0; i < 22; ++i) { - // 3 packets for each stream, the first 2 are guaranteed to be full packets. - SendStreamDataToPeer(i + 2, stream_data, 0, FIN, nullptr); - } - CongestionBlockWrites(); - - // Fires TLP. Please note, this tail loss probe has 1 byte less stream data - // compared to packet 1 because packet number length increases. - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(67), _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - // Fires RTO. Please note, although packets 2 and 3 *should* be RTOed, but - // packet 2 gets RTOed to two packets because packet number length increases. - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(68), _, _)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(69), _, _)); - connection_.GetRetransmissionAlarm()->Fire(); - - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - // Resets all streams except 2 and ack packets 1 and 2. Now, packet 3 is the - // only one containing retransmittable frames. - for (size_t i = 1; i < 22; ++i) { - notifier_.OnStreamReset(i + 2, QUIC_STREAM_CANCELLED); - } - EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _, _)); - QuicAckFrame frame = - InitAckFrame({{QuicPacketNumber(1), QuicPacketNumber(3)}}); - ProcessAckPacket(1, &frame); - CongestionUnblockWrites(); - - // Fires TLP, verify a PING gets sent because packet 3 is marked - // RTO_RETRANSMITTED. - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(70), _, _)); - connection_.GetRetransmissionAlarm()->Fire(); -} - TEST_P(QuicConnectionTest, PtoSkipsPacketNumber) { QuicConfig config; QuicTagVector connection_options;
diff --git a/quiche/quic/core/quic_constants.h b/quiche/quic/core/quic_constants.h index 189179f..3fc4c8b 100644 --- a/quiche/quic/core/quic_constants.h +++ b/quiche/quic/core/quic_constants.h
@@ -181,6 +181,13 @@ // create available streams entries. const int kMaxPromisedStreamsMultiplier = kMaxAvailableStreamsMultiplier - 1; +// The 1st PTO is armed with max of earliest in flight sent time + PTO +// delay and kFirstPtoSrttMultiplier * srtt from last in flight packet. +const float kFirstPtoSrttMultiplier = 1.5; + +// The multiplier of RTT variation when calculating PTO timeout. +const int kPtoRttvarMultiplier = 2; + // TCP RFC calls for 1 second RTO however Linux differs from this default and // define the minimum RTO to 200ms, we will use the same until we have data to // support a higher or lower value.
diff --git a/quiche/quic/core/quic_control_frame_manager.cc b/quiche/quic/core/quic_control_frame_manager.cc index 64e5eec..df7b263 100644 --- a/quiche/quic/core/quic_control_frame_manager.cc +++ b/quiche/quic/core/quic_control_frame_manager.cc
@@ -266,8 +266,7 @@ bool QuicControlFrameManager::RetransmitControlFrame(const QuicFrame& frame, TransmissionType type) { - QUICHE_DCHECK(type == PTO_RETRANSMISSION || type == RTO_RETRANSMISSION || - type == TLP_RETRANSMISSION || type == PROBING_RETRANSMISSION); + QUICHE_DCHECK(type == PTO_RETRANSMISSION || type == PROBING_RETRANSMISSION); QuicControlFrameId id = GetControlFrameId(frame); if (id == kInvalidControlFrameId) { // Frame does not have a valid control frame ID, ignore it. Returns true
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h index 083ec08..b7a888b 100644 --- a/quiche/quic/core/quic_flags_list.h +++ b/quiche/quic/core/quic_flags_list.h
@@ -37,8 +37,6 @@ QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_fix_on_stream_reset, true) // If true, consolidate more logic into SetRetransmissionAlarm to ensure the logic is applied consistently. QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_simplify_set_retransmission_alarm, true) -// If true, default on PTO which unifies TLP + RTO loss recovery. -QUIC_FLAG(FLAGS_quic_restart_flag_quic_default_on_pto2, true) // If true, default-enable 5RTO blachole detection. QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_default_enable_5rto_blackhole_detection2, true) // If true, deliver INITIAL packets before other types of packets in QuicBufferedPacketStore.
diff --git a/quiche/quic/core/quic_packet_creator_test.cc b/quiche/quic/core/quic_packet_creator_test.cc index b223326..02757bd 100644 --- a/quiche/quic/core/quic_packet_creator_test.cc +++ b/quiche/quic/core/quic_packet_creator_test.cc
@@ -1932,16 +1932,16 @@ EXPECT_TRUE(creator_.AddFrame(ack_frame, LOSS_RETRANSMISSION)); ASSERT_EQ(serialized_packet_, nullptr); - EXPECT_TRUE(creator_.AddFrame(stream_frame, RTO_RETRANSMISSION)); + EXPECT_TRUE(creator_.AddFrame(stream_frame, PTO_RETRANSMISSION)); ASSERT_EQ(serialized_packet_, nullptr); - EXPECT_TRUE(creator_.AddFrame(padding_frame, TLP_RETRANSMISSION)); + EXPECT_TRUE(creator_.AddFrame(padding_frame, PROBING_RETRANSMISSION)); creator_.FlushCurrentPacket(); ASSERT_TRUE(serialized_packet_->encrypted_buffer); // The last retransmittable frame on packet is a stream frame, the packet's // transmission type should be the same as the stream frame's. - EXPECT_EQ(serialized_packet_->transmission_type, RTO_RETRANSMISSION); + EXPECT_EQ(serialized_packet_->transmission_type, PTO_RETRANSMISSION); DeleteSerializedPacket(); }
diff --git a/quiche/quic/core/quic_sent_packet_manager.cc b/quiche/quic/core/quic_sent_packet_manager.cc index 47e7863..41e6ea7 100644 --- a/quiche/quic/core/quic_sent_packet_manager.cc +++ b/quiche/quic/core/quic_sent_packet_manager.cc
@@ -30,13 +30,6 @@ namespace { static const int64_t kDefaultRetransmissionTimeMs = 500; -static const int64_t kMaxRetransmissionTimeMs = 60000; -// Maximum number of exponential backoffs used for RTO timeouts. -static const size_t kMaxRetransmissions = 10; -// Maximum number of packets retransmitted upon an RTO. -static const size_t kMaxRetransmissionsOnTimeout = 2; -// The path degrading delay is the sum of this number of consecutive RTO delays. -const size_t kNumRetransmissionDelaysForPathDegradingDelay = 2; // Ensure the handshake timer isnt't faster than 10ms. // This limits the tenth retransmitted packet to 10s after the initial CHLO. @@ -46,13 +39,15 @@ // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. static const size_t kDefaultMaxTailLossProbes = 2; +// The multiplier for calculating PTO timeout before any RTT sample is +// available. +static const float kPtoMultiplierWithoutRttSamples = 3; + // Returns true of retransmissions of the specified type should retransmit // the frames directly (as opposed to resulting in a loss notification). inline bool ShouldForceRetransmission(TransmissionType transmission_type) { return transmission_type == HANDSHAKE_RETRANSMISSION || - transmission_type == TLP_RETRANSMISSION || transmission_type == PROBING_RETRANSMISSION || - transmission_type == RTO_RETRANSMISSION || transmission_type == PTO_RETRANSMISSION; } @@ -81,56 +76,25 @@ network_change_visitor_(nullptr), initial_congestion_window_(kInitialCongestionWindow), loss_algorithm_(&uber_loss_algorithm_), - consecutive_rto_count_(0), - consecutive_tlp_count_(0), consecutive_crypto_retransmission_count_(0), pending_timer_transmission_count_(0), - max_tail_loss_probes_(kDefaultMaxTailLossProbes), - max_rto_packets_(kMaxRetransmissionsOnTimeout), using_pacing_(false), - use_new_rto_(false), conservative_handshake_retransmits_(false), - min_tlp_timeout_( - QuicTime::Delta::FromMilliseconds(kMinTailLossProbeTimeoutMs)), - min_rto_timeout_( - QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs)), largest_mtu_acked_(0), handshake_finished_(false), peer_max_ack_delay_( QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs)), rtt_updated_(false), acked_packets_iter_(last_ack_frame_.packets.rbegin()), - pto_enabled_(GetQuicRestartFlag(quic_default_on_pto2)), - max_probe_packets_per_pto_(2), consecutive_pto_count_(0), handshake_mode_disabled_(false), - skip_packet_number_for_pto_(false), - always_include_max_ack_delay_for_pto_timeout_(true), - pto_exponential_backoff_start_point_(0), - pto_rttvar_multiplier_(4), - num_tlp_timeout_ptos_(0), handshake_packet_acked_(false), zero_rtt_packet_acked_(false), one_rtt_packet_acked_(false), - first_pto_srtt_multiplier_(0), - use_standard_deviation_for_pto_(false), - pto_multiplier_without_rtt_samples_(3), num_ptos_for_path_degrading_(kNumProbeTimeoutsForPathDegradingDelay), ignore_pings_(false), ignore_ack_delay_(false) { SetSendAlgorithm(congestion_control_type); - if (pto_enabled_) { - QUIC_RESTART_FLAG_COUNT_N(quic_default_on_pto2, 1, 2); - // TODO(fayang): change the default values when deprecating - // quic_default_on_pto2. - // Default to 1 packet per PTO and skip a packet number. Arm the 1st PTO - // with max of earliest in flight sent time + PTO delay and 1.5 * srtt from - // last in flight packet. - max_probe_packets_per_pto_ = 1; - skip_packet_number_for_pto_ = true; - first_pto_srtt_multiplier_ = 1.5; - pto_rttvar_multiplier_ = 2; - } } QuicSentPacketManager::~QuicSentPacketManager() {} @@ -167,82 +131,18 @@ if (config.HasClientSentConnectionOption(kMAD0, perspective)) { ignore_ack_delay_ = true; } - if (config.HasClientSentConnectionOption(kMAD2, perspective)) { - // Set the minimum to the alarm granularity. - min_tlp_timeout_ = kAlarmGranularity; - } - if (config.HasClientSentConnectionOption(kMAD3, perspective)) { - // Set the minimum to the alarm granularity. - min_rto_timeout_ = kAlarmGranularity; - } - if (!GetQuicRestartFlag(quic_default_on_pto2)) { - if (config.HasClientSentConnectionOption(k2PTO, perspective)) { - pto_enabled_ = true; - } - if (config.HasClientSentConnectionOption(k1PTO, perspective)) { - pto_enabled_ = true; - max_probe_packets_per_pto_ = 1; - } - - if (config.HasClientSentConnectionOption(kPTOS, perspective)) { - if (!pto_enabled_) { - QUIC_PEER_BUG(quic_peer_bug_12552_1) - << "PTO is not enabled when receiving PTOS connection option."; - pto_enabled_ = true; - max_probe_packets_per_pto_ = 1; - } - skip_packet_number_for_pto_ = true; - } - if (pto_enabled_) { - if (config.HasClientSentConnectionOption(kPTOA, perspective)) { - always_include_max_ack_delay_for_pto_timeout_ = false; - } - if (config.HasClientSentConnectionOption(kPEB1, perspective)) { - StartExponentialBackoffAfterNthPto(1); - } - if (config.HasClientSentConnectionOption(kPEB2, perspective)) { - StartExponentialBackoffAfterNthPto(2); - } - if (config.HasClientSentConnectionOption(kPVS1, perspective)) { - pto_rttvar_multiplier_ = 2; - } - if (config.HasClientSentConnectionOption(kPAG1, perspective)) { - QUIC_CODE_COUNT(one_aggressive_pto); - num_tlp_timeout_ptos_ = 1; - } - if (config.HasClientSentConnectionOption(kPAG2, perspective)) { - QUIC_CODE_COUNT(two_aggressive_ptos); - num_tlp_timeout_ptos_ = 2; - } - if (config.HasClientSentConnectionOption(kPLE1, perspective)) { - first_pto_srtt_multiplier_ = 0.5; - } else if (config.HasClientSentConnectionOption(kPLE2, perspective)) { - first_pto_srtt_multiplier_ = 1.5; - } - if (config.HasClientSentConnectionOption(kAPTO, perspective)) { - pto_multiplier_without_rtt_samples_ = 1.5; - } - if (config.HasClientSentConnectionOption(kPSDA, perspective)) { - use_standard_deviation_for_pto_ = true; - rtt_stats_.EnableStandardDeviationCalculation(); - } - } + if (config.HasClientRequestedIndependentOption(kPDP1, perspective)) { + num_ptos_for_path_degrading_ = 1; } - - if (pto_enabled_) { - if (config.HasClientRequestedIndependentOption(kPDP1, perspective)) { - num_ptos_for_path_degrading_ = 1; - } - if (config.HasClientRequestedIndependentOption(kPDP2, perspective)) { - num_ptos_for_path_degrading_ = 2; - } - if (config.HasClientRequestedIndependentOption(kPDP3, perspective)) { - num_ptos_for_path_degrading_ = 3; - } - if (config.HasClientRequestedIndependentOption(kPDP5, perspective)) { - num_ptos_for_path_degrading_ = 5; - } + if (config.HasClientRequestedIndependentOption(kPDP2, perspective)) { + num_ptos_for_path_degrading_ = 2; + } + if (config.HasClientRequestedIndependentOption(kPDP3, perspective)) { + num_ptos_for_path_degrading_ = 3; + } + if (config.HasClientRequestedIndependentOption(kPDP5, perspective)) { + num_ptos_for_path_degrading_ = 5; } // Configure congestion control. @@ -296,19 +196,6 @@ } using_pacing_ = !GetQuicFlag(FLAGS_quic_disable_pacing_for_perf_tests); - - if (config.HasClientSentConnectionOption(kNTLP, perspective)) { - max_tail_loss_probes_ = 0; - } - if (config.HasClientSentConnectionOption(k1TLP, perspective)) { - max_tail_loss_probes_ = 1; - } - if (config.HasClientSentConnectionOption(k1RTO, perspective)) { - max_rto_packets_ = 1; - } - if (config.HasClientSentConnectionOption(kNRTO, perspective)) { - use_new_rto_ = true; - } // Configure loss detection. if (config.HasClientRequestedIndependentOption(kILD0, perspective)) { uber_loss_algorithm_.SetReorderingShift(kDefaultIetfLossDelayShift); @@ -458,10 +345,6 @@ unacked_packets_.NotifyAggregatedStreamFrameAcked( last_ack_frame_.ack_delay_time); InvokeLossDetection(ack_receive_time); - // Ignore losses in RTO mode. - if (consecutive_rto_count_ > 0 && !use_new_rto_) { - packets_lost_.clear(); - } MaybeInvokeCongestionEvent(rtt_updated, prior_bytes_in_flight, ack_receive_time); unacked_packets_.RemoveObsoletePackets(); @@ -474,33 +357,13 @@ // Anytime we are making forward progress and have a new RTT estimate, reset // the backoff counters. if (rtt_updated) { - if (consecutive_rto_count_ > 0) { - // If the ack acknowledges data sent prior to the RTO, - // the RTO was spurious. - if (LargestAcked(ack_frame) < first_rto_transmission_) { - // Replace SRTT with latest_rtt and increase the variance to prevent - // a spurious RTO from happening again. - rtt_stats_.ExpireSmoothedMetrics(); - } else { - if (!use_new_rto_) { - send_algorithm_->OnRetransmissionTimeout(true); - } - } - } - // Records the max consecutive RTO or PTO before forward progress has been - // made. - if (consecutive_rto_count_ > + // Records the max consecutive PTO before forward progress has been made. + if (consecutive_pto_count_ > stats_->max_consecutive_rto_with_forward_progress) { stats_->max_consecutive_rto_with_forward_progress = - consecutive_rto_count_; - } else if (consecutive_pto_count_ > - stats_->max_consecutive_rto_with_forward_progress) { - stats_->max_consecutive_rto_with_forward_progress = consecutive_pto_count_; } // Reset all retransmit counters any time a new packet is acked. - consecutive_rto_count_ = 0; - consecutive_tlp_count_ = 0; consecutive_pto_count_ = 0; consecutive_crypto_retransmission_count_ = 0; } @@ -607,39 +470,9 @@ bool QuicSentPacketManager::ShouldAddMaxAckDelay( PacketNumberSpace space) const { - QUICHE_DCHECK(pto_enabled_); - if (supports_multiple_packet_number_spaces() && space != APPLICATION_DATA) { - // When the PTO is armed for Initial or Handshake packet number spaces, - // the max_ack_delay is 0. - return false; - } - if (always_include_max_ack_delay_for_pto_timeout_) { - return true; - } - if (!unacked_packets_ - .GetLargestSentRetransmittableOfPacketNumberSpace(APPLICATION_DATA) - .IsInitialized() || - unacked_packets_.GetLargestSentRetransmittableOfPacketNumberSpace( - APPLICATION_DATA) < - FirstSendingPacketNumber() + kMinReceivedBeforeAckDecimation - 1) { - // Peer is doing TCP style acking. Expect an immediate ACK if more than 1 - // packet are outstanding. - if (unacked_packets_.packets_in_flight() >= - kDefaultRetransmittablePacketsBeforeAck) { - return false; - } - } else if (unacked_packets_.packets_in_flight() >= - kMaxRetransmittablePacketsBeforeAck) { - // Peer is doing ack decimation. Expect an immediate ACK if >= 10 - // packets are outstanding. - return false; - } - if (skip_packet_number_for_pto_ && consecutive_pto_count_ > 0) { - // An immediate ACK is expected when doing PTOS. Please note, this will miss - // cases when PTO fires and turns out to be spurious. - return false; - } - return true; + // Do not include max_ack_delay when PTO is armed for Initial or Handshake + // packet number spaces. + return !supports_multiple_packet_number_spaces() || space == APPLICATION_DATA; } QuicTime QuicSentPacketManager::GetEarliestPacketSentTimeForPto( @@ -668,10 +501,9 @@ QuicPacketNumber packet_number, TransmissionType transmission_type) { QuicTransmissionInfo* transmission_info = unacked_packets_.GetMutableTransmissionInfo(packet_number); - // A previous RTO retransmission may cause connection close; packets without - // retransmittable frames can be marked for loss retransmissions. + // Packets without retransmittable frames can only be marked for loss + // retransmission. QUIC_BUG_IF(quic_bug_12552_2, transmission_type != LOSS_RETRANSMISSION && - transmission_type != RTO_RETRANSMISSION && !unacked_packets_.HasRetransmittableFrames( *transmission_info)) << "packet number " << packet_number @@ -898,17 +730,6 @@ MaybeInvokeCongestionEvent(false, prior_in_flight, now); return LOSS_MODE; } - case TLP_MODE: - ++stats_->tlp_count; - ++consecutive_tlp_count_; - pending_timer_transmission_count_ = 1; - // TLPs prefer sending new data instead of retransmitting data, so - // give the connection a chance to write before completing the TLP. - return TLP_MODE; - case RTO_MODE: - ++stats_->rto_count; - RetransmitRtoPackets(); - return RTO_MODE; case PTO_MODE: QUIC_DVLOG(1) << ENDPOINT << "PTO mode"; ++stats_->pto_count; @@ -916,7 +737,7 @@ ++stats_->crypto_retransmit_count; } ++consecutive_pto_count_; - pending_timer_transmission_count_ = max_probe_packets_per_pto_; + pending_timer_transmission_count_ = 1; return PTO_MODE; } QUIC_BUG(quic_bug_10750_3) @@ -956,17 +777,6 @@ } } -bool QuicSentPacketManager::MaybeRetransmitTailLossProbe() { - QUICHE_DCHECK(!pto_enabled_); - if (pending_timer_transmission_count_ == 0) { - return false; - } - if (!MaybeRetransmitOldestPacket(TLP_RETRANSMISSION)) { - return false; - } - return true; -} - bool QuicSentPacketManager::MaybeRetransmitOldestPacket(TransmissionType type) { if (!unacked_packets_.empty()) { QuicPacketNumber packet_number = unacked_packets_.GetLeastUnacked(); @@ -991,47 +801,7 @@ return false; } -void QuicSentPacketManager::RetransmitRtoPackets() { - QUICHE_DCHECK(!pto_enabled_); - QUIC_BUG_IF(quic_bug_12552_3, pending_timer_transmission_count_ > 0) - << "Retransmissions already queued:" << pending_timer_transmission_count_; - // Mark two packets for retransmission. - std::vector<QuicPacketNumber> retransmissions; - if (!unacked_packets_.empty()) { - QuicPacketNumber packet_number = unacked_packets_.GetLeastUnacked(); - QuicPacketNumber largest_sent_packet = - unacked_packets_.largest_sent_packet(); - for (; packet_number <= largest_sent_packet; ++packet_number) { - QuicTransmissionInfo* transmission_info = - unacked_packets_.GetMutableTransmissionInfo(packet_number); - if (transmission_info->state == OUTSTANDING && - unacked_packets_.HasRetransmittableFrames(*transmission_info) && - pending_timer_transmission_count_ < max_rto_packets_) { - QUICHE_DCHECK(transmission_info->in_flight); - retransmissions.push_back(packet_number); - ++pending_timer_transmission_count_; - } - } - } - if (pending_timer_transmission_count_ > 0) { - if (consecutive_rto_count_ == 0) { - first_rto_transmission_ = unacked_packets_.largest_sent_packet() + 1; - } - ++consecutive_rto_count_; - } - for (QuicPacketNumber retransmission : retransmissions) { - MarkForRetransmission(retransmission, RTO_RETRANSMISSION); - } - if (retransmissions.empty()) { - QUIC_BUG_IF(quic_bug_12552_4, pending_timer_transmission_count_ != 0); - // No packets to be RTO retransmitted, raise up a credit to allow - // connection to send. - QUIC_CODE_COUNT(no_packets_to_be_rto_retransmitted); - pending_timer_transmission_count_ = 1; - } -} - -void QuicSentPacketManager::MaybeSendProbePackets() { +void QuicSentPacketManager::MaybeSendProbePacket() { if (pending_timer_transmission_count_ == 0) { return; } @@ -1077,42 +847,9 @@ // It is possible that there is not enough outstanding data for probing. } -void QuicSentPacketManager::AdjustPendingTimerTransmissions() { - if (pending_timer_transmission_count_ < max_probe_packets_per_pto_) { - // There are packets sent already, clear credit. - pending_timer_transmission_count_ = 0; - return; - } - // No packet gets sent, leave 1 credit to allow data to be write eventually. - pending_timer_transmission_count_ = 1; -} - void QuicSentPacketManager::EnableIetfPtoAndLossDetection() { - if (pto_enabled_) { - QUIC_RESTART_FLAG_COUNT_N(quic_default_on_pto2, 2, 2); - // Disable handshake mode. - handshake_mode_disabled_ = true; - return; - } - if (GetQuicRestartFlag(quic_default_on_pto2)) { - QUIC_BUG(pto_not_enabled) - << "PTO is not enabled while quic_default_on_pto2 is true"; - return; - } - pto_enabled_ = true; + // Disable handshake mode. handshake_mode_disabled_ = true; - // Default to 1 packet per PTO and skip a packet number. Arm the 1st PTO - // with max of earliest in flight sent time + PTO delay and 1.5 * srtt from - // last in flight packet. - max_probe_packets_per_pto_ = 1; - skip_packet_number_for_pto_ = true; - first_pto_srtt_multiplier_ = 1.5; - pto_rttvar_multiplier_ = 2; -} - -void QuicSentPacketManager::StartExponentialBackoffAfterNthPto( - size_t exponential_backoff_start_point) { - pto_exponential_backoff_start_point_ = exponential_backoff_start_point; } void QuicSentPacketManager::RetransmitDataOfSpaceIfAny( @@ -1155,15 +892,7 @@ if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { return LOSS_MODE; } - if (pto_enabled_) { - return PTO_MODE; - } - if (consecutive_tlp_count_ < max_tail_loss_probes_) { - if (unacked_packets_.HasUnackedRetransmittableFrames()) { - return TLP_MODE; - } - } - return RTO_MODE; + return PTO_MODE; } void QuicSentPacketManager::InvokeLossDetection(QuicTime time) { @@ -1282,34 +1011,12 @@ GetCryptoRetransmissionDelay(); case LOSS_MODE: return loss_algorithm_->GetLossTimeout(); - case TLP_MODE: { - QUICHE_DCHECK(!pto_enabled_); - // TODO(ianswett): When CWND is available, it would be preferable to - // set the timer based on the earliest retransmittable packet. - // Base the updated timer on the send time of the last packet. - const QuicTime sent_time = - unacked_packets_.GetLastInFlightPacketSentTime(); - const QuicTime tlp_time = sent_time + GetTailLossProbeDelay(); - // Ensure the TLP timer never gets set to a time in the past. - return std::max(clock_->ApproximateNow(), tlp_time); - } - case RTO_MODE: { - QUICHE_DCHECK(!pto_enabled_); - // The RTO is based on the first outstanding packet. - const QuicTime sent_time = - unacked_packets_.GetLastInFlightPacketSentTime(); - QuicTime rto_time = sent_time + GetRetransmissionDelay(); - // Wait for TLP packets to be acked before an RTO fires. - QuicTime tlp_time = sent_time + GetTailLossProbeDelay(); - return std::max(tlp_time, rto_time); - } case PTO_MODE: { if (!supports_multiple_packet_number_spaces()) { - if (first_pto_srtt_multiplier_ > 0 && - unacked_packets_.HasInFlightPackets() && + if (unacked_packets_.HasInFlightPackets() && consecutive_pto_count_ == 0) { // Arm 1st PTO with earliest in flight sent time, and make sure at - // least first_pto_srtt_multiplier_ * RTT has been passed since last + // least kFirstPtoSrttMultiplier * RTT has been passed since last // in flight packet. return std::max( clock_->ApproximateNow(), @@ -1317,7 +1024,7 @@ ->sent_time + GetProbeTimeoutDelay(NUM_PACKET_NUMBER_SPACES), unacked_packets_.GetLastInFlightPacketSentTime() + - first_pto_srtt_multiplier_ * + kFirstPtoSrttMultiplier * rtt_stats_.SmoothedOrInitialRtt())); } // Ensure PTO never gets set to a time in the past. @@ -1335,22 +1042,21 @@ // Arm PTO from now if there is no in flight packets. earliest_right_edge = clock_->ApproximateNow(); } - if (first_pto_srtt_multiplier_ > 0 && - packet_number_space == APPLICATION_DATA && + if (packet_number_space == APPLICATION_DATA && consecutive_pto_count_ == 0) { const QuicTransmissionInfo* first_application_info = unacked_packets_.GetFirstInFlightTransmissionInfoOfSpace( APPLICATION_DATA); if (first_application_info != nullptr) { // Arm 1st PTO with earliest in flight sent time, and make sure at - // least first_pto_srtt_multiplier_ * RTT has been passed since last + // least kFirstPtoSrttMultiplier * RTT has been passed since last // in flight packet. Only do this for application data. return std::max( clock_->ApproximateNow(), std::max( first_application_info->sent_time + GetProbeTimeoutDelay(packet_number_space), - earliest_right_edge + first_pto_srtt_multiplier_ * + earliest_right_edge + kFirstPtoSrttMultiplier * rtt_stats_.SmoothedOrInitialRtt())); } } @@ -1364,18 +1070,14 @@ } const QuicTime::Delta QuicSentPacketManager::GetPathDegradingDelay() const { - if (pto_enabled_) { - QUICHE_DCHECK_GT(num_ptos_for_path_degrading_, 0); - return num_ptos_for_path_degrading_ * GetPtoDelay(); - } - return GetNConsecutiveRetransmissionTimeoutDelay( - max_tail_loss_probes_ + kNumRetransmissionDelaysForPathDegradingDelay); + QUICHE_DCHECK_GT(num_ptos_for_path_degrading_, 0); + return num_ptos_for_path_degrading_ * GetPtoDelay(); } const QuicTime::Delta QuicSentPacketManager::GetNetworkBlackholeDelay( int8_t num_rtos_for_blackhole_detection) const { return GetNConsecutiveRetransmissionTimeoutDelay( - max_tail_loss_probes_ + num_rtos_for_blackhole_detection); + kDefaultMaxTailLossProbes + num_rtos_for_blackhole_detection); } QuicTime::Delta QuicSentPacketManager::GetMtuReductionDelay( @@ -1402,75 +1104,22 @@ delay_ms << consecutive_crypto_retransmission_count_); } -const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { - QuicTime::Delta srtt = rtt_stats_.SmoothedOrInitialRtt(); - if (!unacked_packets_.HasMultipleInFlightPackets()) { - // This expression really should be using the delayed ack time, but in TCP - // MinRTO was traditionally set to 2x the delayed ack timer and this - // expression assumed QUIC did the same. - return std::max(2 * srtt, 1.5 * srtt + (min_rto_timeout_ * 0.5)); - } - return std::max(min_tlp_timeout_, 2 * srtt); -} - -const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { - QuicTime::Delta retransmission_delay = QuicTime::Delta::Zero(); - if (rtt_stats_.smoothed_rtt().IsZero()) { - // We are in the initial state, use default timeout values. - retransmission_delay = - QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); - } else { - retransmission_delay = - rtt_stats_.smoothed_rtt() + 4 * rtt_stats_.mean_deviation(); - if (retransmission_delay < min_rto_timeout_) { - retransmission_delay = min_rto_timeout_; - } - } - - // Calculate exponential back off. - retransmission_delay = - retransmission_delay * - (1 << std::min<size_t>(consecutive_rto_count_, kMaxRetransmissions)); - - if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) { - return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs); - } - return retransmission_delay; -} - const QuicTime::Delta QuicSentPacketManager::GetProbeTimeoutDelay( PacketNumberSpace space) const { - QUICHE_DCHECK(pto_enabled_); if (rtt_stats_.smoothed_rtt().IsZero()) { // Respect kMinHandshakeTimeoutMs to avoid a potential amplification attack. QUIC_BUG_IF(quic_bug_12552_6, rtt_stats_.initial_rtt().IsZero()); - return std::max( - pto_multiplier_without_rtt_samples_ * rtt_stats_.initial_rtt(), - QuicTime::Delta::FromMilliseconds(kMinHandshakeTimeoutMs)) * + return std::max(kPtoMultiplierWithoutRttSamples * rtt_stats_.initial_rtt(), + QuicTime::Delta::FromMilliseconds(kMinHandshakeTimeoutMs)) * (1 << consecutive_pto_count_); } - const QuicTime::Delta rtt_var = use_standard_deviation_for_pto_ - ? rtt_stats_.GetStandardOrMeanDeviation() - : rtt_stats_.mean_deviation(); QuicTime::Delta pto_delay = rtt_stats_.smoothed_rtt() + - std::max(pto_rttvar_multiplier_ * rtt_var, kAlarmGranularity) + + std::max(kPtoRttvarMultiplier * rtt_stats_.mean_deviation(), + kAlarmGranularity) + (ShouldAddMaxAckDelay(space) ? peer_max_ack_delay_ : QuicTime::Delta::Zero()); - pto_delay = - pto_delay * (1 << (consecutive_pto_count_ - - std::min(consecutive_pto_count_, - pto_exponential_backoff_start_point_))); - if (consecutive_pto_count_ < num_tlp_timeout_ptos_) { - // Make first n PTOs similar to TLPs. - if (pto_delay > 2 * rtt_stats_.smoothed_rtt()) { - QUIC_CODE_COUNT(quic_delayed_pto); - pto_delay = std::max(kAlarmGranularity, 2 * rtt_stats_.smoothed_rtt()); - } else { - QUIC_CODE_COUNT(quic_faster_pto); - } - } - return pto_delay; + return pto_delay * (1 << consecutive_pto_count_); } QuicTime::Delta QuicSentPacketManager::GetSlowStartDuration() const { @@ -1513,8 +1162,6 @@ std::unique_ptr<SendAlgorithmInterface> QuicSentPacketManager::OnConnectionMigration(bool reset_send_algorithm) { - consecutive_rto_count_ = 0; - consecutive_tlp_count_ = 0; consecutive_pto_count_ = 0; rtt_stats_.OnConnectionMigration(); if (!reset_send_algorithm) { @@ -1771,13 +1418,16 @@ QuicTime::Delta total_delay = QuicTime::Delta::Zero(); const QuicTime::Delta srtt = rtt_stats_.SmoothedOrInitialRtt(); int num_tlps = - std::min(num_timeouts, static_cast<int>(max_tail_loss_probes_)); + std::min(num_timeouts, static_cast<int>(kDefaultMaxTailLossProbes)); num_timeouts -= num_tlps; if (num_tlps > 0) { - const QuicTime::Delta tlp_delay = - std::max(2 * srtt, unacked_packets_.HasMultipleInFlightPackets() - ? min_tlp_timeout_ - : (1.5 * srtt + (min_rto_timeout_ * 0.5))); + const QuicTime::Delta tlp_delay = std::max( + 2 * srtt, + unacked_packets_.HasMultipleInFlightPackets() + ? QuicTime::Delta::FromMilliseconds(kMinTailLossProbeTimeoutMs) + : (1.5 * srtt + + (QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs) * + 0.5))); total_delay = total_delay + num_tlps * tlp_delay; } if (num_timeouts == 0) { @@ -1787,7 +1437,9 @@ const QuicTime::Delta retransmission_delay = rtt_stats_.smoothed_rtt().IsZero() ? QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs) - : std::max(srtt + 4 * rtt_stats_.mean_deviation(), min_rto_timeout_); + : std::max( + srtt + 4 * rtt_stats_.mean_deviation(), + QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs)); total_delay = total_delay + ((1 << num_timeouts) - 1) * retransmission_delay; return total_delay; } @@ -1808,8 +1460,7 @@ } QuicTime::Delta QuicSentPacketManager::GetPtoDelay() const { - return pto_enabled_ ? GetProbeTimeoutDelay(APPLICATION_DATA) - : GetRetransmissionDelay(); + return GetProbeTimeoutDelay(APPLICATION_DATA); } void QuicSentPacketManager::OnAckFrequencyFrameSent(
diff --git a/quiche/quic/core/quic_sent_packet_manager.h b/quiche/quic/core/quic_sent_packet_manager.h index d10eba0..04ba435 100644 --- a/quiche/quic/core/quic_sent_packet_manager.h +++ b/quiche/quic/core/quic_sent_packet_manager.h
@@ -109,10 +109,6 @@ // The retransmission timer is a single timer which switches modes depending // upon connection state. enum RetransmissionTimeoutMode { - // A conventional TCP style RTO. - RTO_MODE, - // A tail loss probe. By default, QUIC sends up to two before RTOing. - TLP_MODE, // Retransmission of handshake packets prior to handshake completion. HANDSHAKE_MODE, // Re-invoke the loss detection when a packet is not acked before the @@ -175,10 +171,6 @@ void OnConfigNegotiated(); void OnConnectionClosed(); - // Retransmits the oldest pending packet there is still a tail loss probe - // pending. Invoked after OnRetransmissionTimeout. - bool MaybeRetransmitTailLossProbe(); - // Retransmits the oldest pending packet. bool MaybeRetransmitOldestPacket(TransmissionType type); @@ -374,10 +366,6 @@ bool InSlowStart() const { return send_algorithm_->InSlowStart(); } - size_t GetConsecutiveRtoCount() const { return consecutive_rto_count_; } - - size_t GetConsecutiveTlpCount() const { return consecutive_tlp_count_; } - size_t GetConsecutivePtoCount() const { return consecutive_pto_count_; } void OnApplicationLimited(); @@ -409,7 +397,9 @@ void set_peer_max_ack_delay(QuicTime::Delta peer_max_ack_delay) { // The delayed ack time should never be more than one half the min RTO time. - QUICHE_DCHECK_LE(peer_max_ack_delay, (min_rto_timeout_ * 0.5)); + QUICHE_DCHECK_LE( + peer_max_ack_delay, + (QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs) * 0.5)); peer_max_ack_delay_ = peer_max_ack_delay; } @@ -431,21 +421,13 @@ // Setting the send algorithm once the connection is underway is dangerous. void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm); - // Sends up to max_probe_packets_per_pto_ probe packets. - void MaybeSendProbePackets(); - - // Called to adjust pending_timer_transmission_count_ accordingly. - void AdjustPendingTimerTransmissions(); + // Sends one probe packet. + void MaybeSendProbePacket(); // Called to disable HANDSHAKE_MODE, and only PTO and LOSS modes are used. // Also enable IETF loss detection. void EnableIetfPtoAndLossDetection(); - // Called to set the start point of doing exponential backoff when calculating - // PTO timeout. - void StartExponentialBackoffAfterNthPto( - size_t exponential_backoff_start_point); - // Called to retransmit in flight packet of |space| if any. void RetransmitDataOfSpaceIfAny(PacketNumberSpace space); @@ -459,14 +441,8 @@ return unacked_packets_.supports_multiple_packet_number_spaces(); } - bool pto_enabled() const { return pto_enabled_; } - bool handshake_mode_disabled() const { return handshake_mode_disabled_; } - bool skip_packet_number_for_pto() const { - return skip_packet_number_for_pto_; - } - bool zero_rtt_packet_acked() const { return zero_rtt_packet_acked_; } bool one_rtt_packet_acked() const { return one_rtt_packet_acked_; } @@ -504,21 +480,9 @@ // Retransmits all crypto stream packets. void RetransmitCryptoPackets(); - // Retransmits two packets for an RTO and removes any non-retransmittable - // packets from flight. - void RetransmitRtoPackets(); - // Returns the timeout for retransmitting crypto handshake packets. const QuicTime::Delta GetCryptoRetransmissionDelay() const; - // Calls GetTailLossProbeDelay() with values from the current state of this - // packet manager as its params. - const QuicTime::Delta GetTailLossProbeDelay() const; - - // Calls GetRetransmissionDelay() with values from the current state of this - // packet manager as its params. - const QuicTime::Delta GetRetransmissionDelay() const; - // Returns the probe timeout. const QuicTime::Delta GetProbeTimeoutDelay(PacketNumberSpace space) const; @@ -580,6 +544,7 @@ // A helper function to return total delay of |num_timeouts| retransmission // timeout with TLP and RTO mode. + // TODO(fayang): remove this method and calculate blackhole delay by PTO. QuicTime::Delta GetNConsecutiveRetransmissionTimeoutDelay( int num_timeouts) const; @@ -618,32 +583,14 @@ LossDetectionInterface* loss_algorithm_; UberLossAlgorithm uber_loss_algorithm_; - // Tracks the first RTO packet. If any packet before that packet gets acked, - // it indicates the RTO was spurious and should be reversed(F-RTO). - QuicPacketNumber first_rto_transmission_; - // Number of times the RTO timer has fired in a row without receiving an ack. - size_t consecutive_rto_count_; - // Number of times the tail loss probe has been sent. - size_t consecutive_tlp_count_; // Number of times the crypto handshake has been retransmitted. size_t consecutive_crypto_retransmission_count_; - // Number of pending transmissions of TLP, RTO, or crypto packets. + // Number of pending transmissions of PTO or crypto packets. size_t pending_timer_transmission_count_; - // Maximum number of tail loss probes to send before firing an RTO. - size_t max_tail_loss_probes_; - // Maximum number of packets to send upon RTO. - QuicPacketCount max_rto_packets_; - // If true, send the TLP at 0.5 RTT. + bool using_pacing_; - // If true, use the new RTO with loss based CWND reduction instead of the send - // algorithms's OnRetransmissionTimeout to reduce the congestion window. - bool use_new_rto_; // If true, use a more conservative handshake retransmission policy. bool conservative_handshake_retransmits_; - // The minimum TLP timeout. - QuicTime::Delta min_tlp_timeout_; - // The minimum RTO. - QuicTime::Delta min_rto_timeout_; // Vectors packets acked and lost as a result of the last congestion event. AckedPacketVector packets_acked_; @@ -702,36 +649,12 @@ // OnAckRangeStart, and gradually moves in OnAckRange.. PacketNumberQueue::const_reverse_iterator acked_packets_iter_; - // Indicates whether PTO mode has been enabled. PTO mode unifies TLP and RTO - // modes. - bool pto_enabled_; - - // Maximum number of probes to send when PTO fires. - size_t max_probe_packets_per_pto_; - // Number of times the PTO timer has fired in a row without receiving an ack. size_t consecutive_pto_count_; // True if HANDSHAKE mode has been disabled. bool handshake_mode_disabled_; - // If true, skip packet number before sending the last PTO retransmission. - bool skip_packet_number_for_pto_; - - // If true, always include peer_max_ack_delay_ when calculating PTO timeout. - bool always_include_max_ack_delay_for_pto_timeout_; - - // When calculating PTO timeout, the start point of doing exponential backoff. - // For example, 0 : always do exponential backoff. n : do exponential backoff - // since nth PTO. - size_t pto_exponential_backoff_start_point_; - - // The multiplier of rttvar when calculating PTO timeout. - int pto_rttvar_multiplier_; - - // Number of PTOs similar to TLPs. - size_t num_tlp_timeout_ptos_; - // True if any ENCRYPTION_HANDSHAKE packet gets acknowledged. bool handshake_packet_acked_; @@ -741,18 +664,6 @@ // True if any 1-RTT packet gets acknowledged. bool one_rtt_packet_acked_; - // If > 0, arm the 1st PTO with max of earliest in flight sent time + PTO - // delay and multiplier * srtt from last in flight packet. - float first_pto_srtt_multiplier_; - - // If true, use standard deviation (instead of mean deviation) when - // calculating PTO timeout. - bool use_standard_deviation_for_pto_; - - // The multiplier for caculating PTO timeout before any RTT sample is - // available. - float pto_multiplier_without_rtt_samples_; - // The number of PTOs needed for path degrading alarm. If equals to 0, the // traditional path degrading mechanism will be used. int num_ptos_for_path_degrading_;
diff --git a/quiche/quic/core/quic_sent_packet_manager_test.cc b/quiche/quic/core/quic_sent_packet_manager_test.cc index 24485e2..9c8db65 100644 --- a/quiche/quic/core/quic_sent_packet_manager_test.cc +++ b/quiche/quic/core/quic_sent_packet_manager_test.cc
@@ -98,8 +98,6 @@ send_algorithm_(new StrictMock<MockSendAlgorithm>), network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) { QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_); - // Disable tail loss probes for most tests. - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); // Advance the time 1s so the send times are never QuicTime::Zero. clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); manager_.SetNetworkChangeVisitor(network_change_visitor_.get()); @@ -202,7 +200,7 @@ void RetransmitAndSendPacket(uint64_t old_packet_number, uint64_t new_packet_number) { RetransmitAndSendPacket(old_packet_number, new_packet_number, - TLP_RETRANSMISSION); + PTO_RETRANSMISSION); } void RetransmitAndSendPacket(uint64_t old_packet_number, @@ -210,8 +208,7 @@ TransmissionType transmission_type) { bool is_lost = false; if (transmission_type == HANDSHAKE_RETRANSMISSION || - transmission_type == TLP_RETRANSMISSION || - transmission_type == RTO_RETRANSMISSION || + transmission_type == PTO_RETRANSMISSION || transmission_type == PROBING_RETRANSMISSION) { EXPECT_CALL(notifier_, RetransmitFrames(_, _)) .WillOnce(WithArgs<1>( @@ -316,25 +313,6 @@ NO_RETRANSMITTABLE_DATA, true); } - void EnablePto(QuicTag tag) { - QuicConfig config; - QuicTagVector options; - options.push_back(tag); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.pto_enabled()); - } - - int GetPtoRttvarMultiplier() { - if (GetQuicRestartFlag(quic_default_on_pto2) || - manager_.handshake_mode_disabled()) { - return 2; - } - return 4; - } - quiche::SimpleBufferAllocator allocator_; QuicSentPacketManager manager_; MockClock clock_; @@ -393,7 +371,7 @@ return RetransmitDataPacket(2, type); }))); QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1, - TLP_RETRANSMISSION); + PTO_RETRANSMISSION); // Ack 1. ExpectAck(1); manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(), @@ -415,7 +393,7 @@ SendDataPacket(1); EXPECT_CALL(notifier_, RetransmitFrames(_, _)).WillRepeatedly(Return(true)); QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1, - TLP_RETRANSMISSION); + PTO_RETRANSMISSION); EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false)); @@ -552,7 +530,7 @@ TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { StrictMock<MockDebugDelegate> debug_delegate; - EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION, + EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(PTO_RETRANSMISSION, kDefaultLength)) .Times(1); manager_.SetDebugDelegate(&debug_delegate); @@ -831,155 +809,6 @@ EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt()); } -TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); - - // Send 1 packet. - SendDataPacket(1); - - // The first tail loss probe retransmits 1 packet. - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(2, type); - }))); - manager_.MaybeRetransmitTailLossProbe(); - - // The second tail loss probe retransmits 1 packet. - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type); - }))); - manager_.MaybeRetransmitTailLossProbe(); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false)); - EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now())); - - // Ack the third and ensure the first two are still pending. - ExpectAck(3); - - manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); - - EXPECT_TRUE(manager_.HasInFlightPackets()); - - // Acking two more packets will lose both of them due to nacks. - SendDataPacket(4); - SendDataPacket(5); - uint64_t acked[] = {4, 5}; - uint64_t lost[] = {1, 2}; - ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), lost, - ABSL_ARRAYSIZE(lost)); - // Frames in all packets are acked. - EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false)); - // Notify session that stream frame in packets 1 and 2 get lost although - // they are not outstanding. - EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2); - manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2), - ENCRYPTION_INITIAL)); - - EXPECT_FALSE(manager_.HasInFlightPackets()); - EXPECT_EQ(2u, stats_.tlp_count); - EXPECT_EQ(0u, stats_.rto_count); -} - -TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); - - // Send 100 packets. - const size_t kNumSentPackets = 100; - for (size_t i = 1; i <= kNumSentPackets; ++i) { - SendDataPacket(i); - } - QuicTime rto_packet_time = clock_.Now(); - // Advance the time. - clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now()); - - // The first tail loss probe retransmits 1 packet. - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(101, type); - }))); - manager_.MaybeRetransmitTailLossProbe(); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false)); - EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now())); - clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now()); - - // The second tail loss probe retransmits 1 packet. - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(102, type); - }))); - EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false)); - EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now())); - - // Ensure the RTO is set based on the correct packet. - rto_packet_time = clock_.Now(); - EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500), - manager_.GetRetransmissionTime()); - - // Advance the time enough to ensure all packets are RTO'd. - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); - - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(103, type); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(104, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(2u, stats_.tlp_count); - EXPECT_EQ(1u, stats_.rto_count); - EXPECT_EQ(0u, stats_.max_consecutive_rto_with_forward_progress); - // There are 2 RTO retransmissions. - EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight()); - QuicPacketNumber largest_acked = QuicPacketNumber(103); - EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); - EXPECT_CALL(*send_algorithm_, - OnCongestionEvent( - true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - // Although frames in packet 3 gets acked, it would be kept for another - // RTT. - EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true)); - // Packets [1, 102] are lost, although stream frame in packet 3 is not - // outstanding. - EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102); - manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); - // All packets before 103 should be lost. - // Packet 104 is still in flight. - EXPECT_EQ(1000u, manager_.GetBytesInFlight()); - EXPECT_EQ(1u, stats_.max_consecutive_rto_with_forward_progress); -} - TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) { // Send 2 crypto packets and 3 data packets. const size_t kNumSentCryptoPackets = 2; @@ -1137,225 +966,6 @@ VerifyRetransmittablePackets(nullptr, 0); } -TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - StrictMock<MockDebugDelegate> debug_delegate; - manager_.SetDebugDelegate(&debug_delegate); - - // Send 100 packets. - const size_t kNumSentPackets = 100; - for (size_t i = 1; i <= kNumSentPackets; ++i) { - SendDataPacket(i); - } - - EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(101, type); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(102, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight()); - - // Ack a retransmission. - // Ensure no packets are lost. - QuicPacketNumber largest_acked = QuicPacketNumber(102); - EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(true, _, _, - Pointwise(PacketNumberEq(), {largest_acked}), - /*lost_packets=*/IsEmpty())); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); - // RTO's use loss detection instead of immediately declaring retransmitted - // packets lost. - for (int i = 1; i <= 99; ++i) { - EXPECT_CALL(debug_delegate, - OnPacketLoss(QuicPacketNumber(i), _, LOSS_RETRANSMISSION, _)); - } - EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true)); - // Packets [1, 99] are considered as lost, although stream frame in packet - // 2 is not outstanding. - EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99); - manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); -} - -TEST_F(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - // Set the 1RTO connection option. - QuicConfig client_config; - QuicTagVector options; - options.push_back(k1RTO); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - manager_.SetFromConfig(client_config); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); - - StrictMock<MockDebugDelegate> debug_delegate; - manager_.SetDebugDelegate(&debug_delegate); - - // Send 100 packets. - const size_t kNumSentPackets = 100; - for (size_t i = 1; i <= kNumSentPackets; ++i) { - SendDataPacket(i); - } - - EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(1) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(101, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight()); -} - -TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig client_config; - QuicTagVector options; - options.push_back(kNRTO); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - manager_.SetFromConfig(client_config); - EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); - - // Send 100 packets. - const size_t kNumSentPackets = 100; - for (size_t i = 1; i <= kNumSentPackets; ++i) { - SendDataPacket(i); - } - - EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(101, type); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(102, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight()); - - // Ack a retransmission and expect no call to OnRetransmissionTimeout. - // This will include packets in the lost packet map. - QuicPacketNumber largest_acked = QuicPacketNumber(102); - EXPECT_CALL(*send_algorithm_, - OnCongestionEvent(true, _, _, - Pointwise(PacketNumberEq(), {largest_acked}), - /*lost_packets=*/Not(IsEmpty()))); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true)); - // Packets [1, 99] are considered as lost, although stream frame in packet - // 2 is not outstanding. - EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99); - manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); -} - -TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - // Send 1 packet. - SendDataPacket(1); - - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(2, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight()); - - // Rto a second time. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight()); - - // Ack a retransmission and ensure OnRetransmissionTimeout is called. - EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); - ExpectAck(2); - manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); - - // The original packet and newest should be outstanding. - EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight()); -} - -TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - // Send 1 packet. - SendDataPacket(1); - - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(2, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight()); - - // Rto a second time. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight()); - - // Ack a retransmission and ensure OnRetransmissionTimeout is called. - EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); - ExpectAck(3); - manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); - - // The first two packets should still be outstanding. - EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight()); -} - TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) { EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); } @@ -1448,199 +1058,6 @@ EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); } -TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); - SendDataPacket(1); - SendDataPacket(2); - - // Check the min. - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1)); - EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10), - manager_.GetRetransmissionTime()); - - // Test with a standard smoothed RTT. - rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100)); - QuicTime::Delta srtt = rtt_stats->initial_rtt(); - QuicTime::Delta expected_tlp_delay = 2 * srtt; - QuicTime expected_time = clock_.Now() + expected_tlp_delay; - EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); - - // Retransmit the packet by invoking the retransmission timeout. - clock_.AdvanceTime(expected_tlp_delay); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type); - }))); - EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false)); - EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now())); - - expected_time = clock_.Now() + expected_tlp_delay; - EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); -} - -TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - - SendDataPacket(1); - SendDataPacket(2); - SendDataPacket(3); - SendDataPacket(4); - - QuicTime::Delta expected_rto_delay = - rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation(); - QuicTime expected_time = clock_.Now() + expected_rto_delay; - EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); - - // Retransmit the packet by invoking the retransmission timeout. - clock_.AdvanceTime(expected_rto_delay); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(5, type); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(6, type); - }))); - manager_.OnRetransmissionTimeout(); - // All previous packets are inflight, plus two rto retransmissions. - EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight()); - - // The delay should double the second time. - expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay; - // Once we always base the timer on the right edge, leaving the older packets - // in flight doesn't change the timeout. - EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); - - // Ack a packet before the first RTO and ensure the RTO timeout returns to the - // original value and OnRetransmissionTimeout is not called or reverted. - uint64_t acked[] = {1, 2}; - ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0); - manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); - EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight()); - - // Wait 2RTTs from now for the RTO, since it's the max of the RTO time - // and the TLP time. In production, there would always be two TLP's first. - // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced - // by the latest RTT sample of 500ms. - expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000); - // Once we always base the timer on the right edge, leaving the older packets - // in flight doesn't change the timeout. - EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); -} - -TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - SendDataPacket(1); - // Provide a 1ms RTT sample. - const_cast<RttStats*>(manager_.GetRttStats()) - ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(), - QuicTime::Zero()); - QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); - - // If the delay is smaller than the min, ensure it exponentially backs off - // from the min. - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(delay, - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); - delay = delay + delay; - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) { - return RetransmitDataPacket(i + 2, type); - }))); - manager_.OnRetransmissionTimeout(); - } -} - -TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - SendDataPacket(1); - // Provide a 60s RTT sample. - const_cast<RttStats*>(manager_.GetRttStats()) - ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(), - QuicTime::Zero()); - - EXPECT_EQ(QuicTime::Delta::FromSeconds(60), - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - SendDataPacket(1); - QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); - - // Delay should back off exponentially. - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(delay, - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); - delay = delay + delay; - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) { - return RetransmitDataPacket(i + 2, type); - }))); - manager_.OnRetransmissionTimeout(); - } -} - -TEST_F(QuicSentPacketManagerTest, RetransmissionDelay) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - const int64_t kRttMs = 250; - const int64_t kDeviationMs = 5; - - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs), - QuicTime::Delta::Zero(), clock_.Now()); - - // Initial value is to set the median deviation to half of the initial rtt, - // the median in then multiplied by a factor of 4 and finally the smoothed rtt - // is added which is the initial rtt. - QuicTime::Delta expected_delay = - QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4); - EXPECT_EQ(expected_delay, - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); - - for (int i = 0; i < 100; ++i) { - // Run to make sure that we converge. - rtt_stats->UpdateRtt( - QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs), - QuicTime::Delta::Zero(), clock_.Now()); - rtt_stats->UpdateRtt( - QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs), - QuicTime::Delta::Zero(), clock_.Now()); - } - expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4); - - EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1); - EXPECT_NEAR(expected_delay.ToMilliseconds(), - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_) - .ToMilliseconds(), - 1); -} - TEST_F(QuicSentPacketManagerTest, GetLossDelay) { auto loss_algorithm = std::make_unique<MockLossAlgorithm>(); QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get()); @@ -1868,214 +1285,6 @@ ->GetCongestionControlType()); } -TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig config; - QuicTagVector options; - - options.push_back(kMAD2); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillOnce(Return(10 * kDefaultTCPMSS)); - manager_.SetFromConfig(config); - // Set the initial RTT to 1us. - QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt( - QuicTime::Delta::FromMicroseconds(1)); - // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms). - EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002), - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); - - // Send two packets, and the TLP should be 1ms. - QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1); - SendDataPacket(1); - SendDataPacket(2); - EXPECT_EQ(expected_tlp_delay, - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig client_config; - QuicTagVector options; - - options.push_back(kMAD2); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillOnce(Return(10 * kDefaultTCPMSS)); - manager_.SetFromConfig(client_config); - // Set the initial RTT to 1us. - QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt( - QuicTime::Delta::FromMicroseconds(1)); - // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms). - EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002), - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); - // Send two packets, and the TLP should be 1ms. - QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1); - SendDataPacket(1); - SendDataPacket(2); - EXPECT_EQ(expected_tlp_delay, - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig config; - QuicTagVector options; - - options.push_back(kMAD3); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(config); - // Provide one RTT measurement, because otherwise we use the default of 500ms. - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1); - EXPECT_EQ(expected_rto_delay, - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); - // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms). - QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502); - EXPECT_EQ(expected_tlp_delay, - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig client_config; - QuicTagVector options; - - options.push_back(kMAD3); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(client_config); - // Provide one RTT measurement, because otherwise we use the default of 500ms. - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1); - EXPECT_EQ(expected_rto_delay, - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); - // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms). - QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502); - EXPECT_EQ(expected_tlp_delay, - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig config; - QuicTagVector options; - - options.push_back(kNTLP); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(config); - EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig client_config; - QuicTagVector options; - - options.push_back(kNTLP); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(client_config); - EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig config; - QuicTagVector options; - - options.push_back(k1TLP); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(config); - EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicConfig client_config; - QuicTagVector options; - - options.push_back(k1TLP); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(client_config); - EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); - QuicConfig config; - QuicTagVector options; - - options.push_back(kNRTO); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(config); - EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); -} - -TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); - QuicConfig client_config; - QuicTagVector options; - - options.push_back(kNRTO); - QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - manager_.SetFromConfig(client_config); - EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); -} - TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325); EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt()); @@ -2116,18 +1325,15 @@ rtt_stats->set_initial_rtt(default_init_rtt * 2); EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt()); - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); - EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); - EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); + QuicSentPacketManagerPeer::SetConsecutivePtoCount(&manager_, 1); + EXPECT_EQ(1u, manager_.GetConsecutivePtoCount()); EXPECT_CALL(*send_algorithm_, OnConnectionMigration()); EXPECT_EQ(nullptr, manager_.OnConnectionMigration(/*reset_send_algorithm=*/false)); EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt()); - EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); - EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); + EXPECT_EQ(0u, manager_.GetConsecutivePtoCount()); } // Tests that ResetCongestionControlUponPeerAddressChange() resets send @@ -2142,10 +1348,8 @@ rtt_stats->set_initial_rtt(default_init_rtt * 2); EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt()); - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); - EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); - EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); + QuicSentPacketManagerPeer::SetConsecutivePtoCount(&manager_, 1); + EXPECT_EQ(1u, manager_.GetConsecutivePtoCount()); SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); @@ -2161,8 +1365,7 @@ EXPECT_EQ(old_send_algorithm->GetCongestionControlType(), manager_.GetSendAlgorithm()->GetCongestionControlType()); EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt()); - EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); - EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); + EXPECT_EQ(0u, manager_.GetConsecutivePtoCount()); // Packets sent earlier shouldn't be regarded as in flight. EXPECT_EQ(0u, BytesInFlight()); @@ -2245,8 +1448,7 @@ EXPECT_EQ(old_send_algorithm->GetCongestionControlType(), manager_.GetSendAlgorithm()->GetCongestionControlType()); EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt()); - EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); - EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); + EXPECT_EQ(0u, manager_.GetConsecutivePtoCount()); EXPECT_EQ(0u, BytesInFlight()); EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero()); @@ -2317,8 +1519,7 @@ old_send_algorithm = manager_.OnConnectionMigration(/*reset_send_algorithm=*/true); EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt()); - EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); - EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); + EXPECT_EQ(0u, manager_.GetConsecutivePtoCount()); EXPECT_EQ(0u, BytesInFlight()); EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero()); @@ -2622,94 +1823,7 @@ ENCRYPTION_HANDSHAKE)); } -// Regression test for b/133771183. -TEST_F(QuicSentPacketManagerTest, PacketInLimbo) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); - // Send SHLO. - SendCryptoPacket(1); - // Send data packet. - SendDataPacket(2, ENCRYPTION_FORWARD_SECURE); - // Send Ack Packet. - SendAckPacket(3, 1, ENCRYPTION_FORWARD_SECURE); - // Retransmit SHLO. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce( - InvokeWithoutArgs([this]() { return RetransmitCryptoPacket(4); })); - manager_.OnRetransmissionTimeout(); - - // Successfully decrypt a forward secure packet. - manager_.SetHandshakeConfirmed(); - EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false)); - // Send Ack packet. - SendAckPacket(5, 2, ENCRYPTION_FORWARD_SECURE); - - // Retransmission alarm fires. - manager_.OnRetransmissionTimeout(); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeRetransmitTailLossProbe(); - - // Received Ack of packets 1, 3 and 4. - uint64_t acked[] = {1, 3, 4}; - ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0); - manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5)); - manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_INITIAL)); - - uint64_t acked2[] = {5, 6}; - uint64_t loss[] = {2}; - // Verify packet 2 is detected lost. - EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1); - ExpectAcksAndLosses(true, acked2, ABSL_ARRAYSIZE(acked2), loss, - ABSL_ARRAYSIZE(loss)); - manager_.OnAckFrameStart(QuicPacketNumber(6), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(7)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2), - ENCRYPTION_INITIAL)); -} - -TEST_F(QuicSentPacketManagerTest, RtoFiresNoPacketToRetransmit) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - // Send 10 packets. - for (size_t i = 1; i <= 10; ++i) { - SendDataPacket(i); - } - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(11, type); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(12, type); - }))); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(1u, stats_.rto_count); - EXPECT_EQ(0u, manager_.pending_timer_transmission_count()); - - // RTO fires again, but there is no packet to be RTO retransmitted. - EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false)); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(2u, stats_.rto_count); - // Verify a credit is raised up. - EXPECT_EQ(1u, manager_.pending_timer_transmission_count()); -} - TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeout) { - EnablePto(k2PTO); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) @@ -2722,7 +1836,7 @@ SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); QuicTime packet1_sent_time = clock_.Now(); EXPECT_EQ(clock_.Now() + expected_pto_delay, @@ -2730,12 +1844,8 @@ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); SendDataPacket(2, ENCRYPTION_FORWARD_SECURE); - // Verify PTO is correctly set based on sent time of packet 2. - QuicTime deadline = clock_.Now() + expected_pto_delay; - if (GetQuicRestartFlag(quic_default_on_pto2)) { - // Verify PTO is set based on left edge. - deadline = packet1_sent_time + expected_pto_delay; - } + // Verify PTO is set based on left edge. + QuicTime deadline = packet1_sent_time + expected_pto_delay; EXPECT_EQ(deadline, manager_.GetRetransmissionTime()); EXPECT_EQ(0u, stats_.pto_count); @@ -2746,23 +1856,11 @@ EXPECT_EQ(1u, stats_.pto_count); EXPECT_EQ(0u, stats_.max_consecutive_rto_with_forward_progress); - if (GetQuicRestartFlag(quic_default_on_pto2)) { - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); - }))); - } else { - // Verify two probe packets get sent. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE); - }))); - } - manager_.MaybeSendProbePackets(); + EXPECT_CALL(notifier_, RetransmitFrames(_, _)) + .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { + return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); + }))); + manager_.MaybeSendProbePacket(); // Verify PTO period gets set to twice the current value. QuicTime sent_time = clock_.Now(); EXPECT_EQ(sent_time + expected_pto_delay * 2, @@ -2779,7 +1877,7 @@ ENCRYPTION_FORWARD_SECURE)); expected_pto_delay = rtt_stats->SmoothedOrInitialRtt() + - std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(), + std::max(kPtoRttvarMultiplier * rtt_stats->mean_deviation(), QuicTime::Delta::FromMilliseconds(1)) + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); @@ -2789,7 +1887,6 @@ } TEST_F(QuicSentPacketManagerTest, SendOneProbePacket) { - EnablePto(k1PTO); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) @@ -2806,13 +1903,10 @@ QuicTime::Delta srtt = rtt_stats->smoothed_rtt(); // Verify PTO period is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - QuicTime deadline = clock_.Now() + expected_pto_delay; - if (GetQuicRestartFlag(quic_default_on_pto2)) { - // Verify PTO is set based on left edge. - deadline = packet1_sent_time + expected_pto_delay; - } + // Verify PTO is set based on left edge. + QuicTime deadline = packet1_sent_time + expected_pto_delay; EXPECT_EQ(deadline, manager_.GetRetransmissionTime()); // Invoke PTO. @@ -2825,7 +1919,7 @@ .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); }))); - manager_.MaybeSendProbePackets(); + manager_.MaybeSendProbePacket(); } TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeClient) { @@ -2883,269 +1977,7 @@ EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); } -TEST_F(QuicSentPacketManagerTest, PtoTimeoutIncludesMaxAckDelay) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EnablePto(k1PTO); - // Use PTOS and PTOA. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPTOA); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.skip_packet_number_for_pto()); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); - - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta srtt = rtt_stats->smoothed_rtt(); - - SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); - QuicTime packet1_sent_time = clock_.Now(); - // Verify PTO is correctly set and ack delay is included. - QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); - SendDataPacket(2, ENCRYPTION_FORWARD_SECURE); - // Verify PTO is correctly set based on sent time of packet 2 but ack delay is - // not included as an immediate ACK is expected. - expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds( - kDefaultDelayedAckTimeMs); - QuicTime deadline = clock_.Now() + expected_pto_delay; - if (GetQuicRestartFlag(quic_default_on_pto2)) { - deadline = packet1_sent_time + expected_pto_delay; - } - EXPECT_EQ(deadline, manager_.GetRetransmissionTime()); - EXPECT_EQ(0u, stats_.pto_count); - - // Invoke PTO. - clock_.AdvanceTime(deadline - clock_.Now()); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(1u, stats_.pto_count); - - // Verify 1 probe packets get sent and packet number gets skipped. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - // Verify PTO period gets set to twice the current value. Also, ack delay is - // not included. - QuicTime sent_time = clock_.Now(); - EXPECT_EQ(sent_time + expected_pto_delay * 2, - manager_.GetRetransmissionTime()); - - // Received ACK for packets 1 and 2. - uint64_t acked[] = {1, 2}; - ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0); - manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1), - ENCRYPTION_FORWARD_SECURE)); - expected_pto_delay = - rtt_stats->SmoothedOrInitialRtt() + - std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(), - QuicTime::Delta::FromMilliseconds(1)) + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - - // Verify PTO is correctly re-armed based on sent time of packet 4. Because of - // PTOS turns out to be spurious, ACK delay is included. - EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); - - // Received ACK for packets 4. - ExpectAck(4); - manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4), - ENCRYPTION_FORWARD_SECURE)); - EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); - // Send more packets, such that peer will do ack decimation. - std::vector<uint64_t> acked2; - for (size_t i = 5; i <= 100; ++i) { - SendDataPacket(i, ENCRYPTION_FORWARD_SECURE); - acked2.push_back(i); - } - // Received ACK for all sent packets. - ExpectAcksAndLosses(true, &acked2[0], acked2.size(), nullptr, 0); - manager_.OnAckFrameStart(QuicPacketNumber(100), QuicTime::Delta::Infinite(), - clock_.Now()); - manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(101)); - EXPECT_EQ(PACKETS_NEWLY_ACKED, - manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(100), - ENCRYPTION_FORWARD_SECURE)); - - expected_pto_delay = - rtt_stats->SmoothedOrInitialRtt() + - std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(), - QuicTime::Delta::FromMilliseconds(1)) + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - for (size_t i = 101; i < 110; i++) { - SendDataPacket(i, ENCRYPTION_FORWARD_SECURE); - // Verify PTO timeout includes ACK delay as there are less than 10 packets - // outstanding. - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - } - expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds( - kDefaultDelayedAckTimeMs); - SendDataPacket(110, ENCRYPTION_FORWARD_SECURE); - // Verify ACK delay is excluded. - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); -} - -TEST_F(QuicSentPacketManagerTest, StartExponentialBackoffSince2ndPto) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EnablePto(k2PTO); - QuicConfig config; - QuicTagVector options; - options.push_back(kPEB2); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta srtt = rtt_stats->smoothed_rtt(); - - SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); - QuicTime packet1_sent_time = clock_.Now(); - // Verify PTO is correctly set. - QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - EXPECT_EQ(packet1_sent_time + expected_pto_delay, - manager_.GetRetransmissionTime()); - - clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10)); - SendDataPacket(2, ENCRYPTION_FORWARD_SECURE); - // Verify PTO is correctly set based on sent time of packet 2. - QuicTime deadline = clock_.Now() + expected_pto_delay; - if (GetQuicRestartFlag(quic_default_on_pto2)) { - // Verify PTO is set based on left edge. - deadline = packet1_sent_time + expected_pto_delay; - } - EXPECT_EQ(deadline, manager_.GetRetransmissionTime()); - EXPECT_EQ(0u, stats_.pto_count); - - // Invoke PTO. - clock_.AdvanceTime(deadline - clock_.Now()); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(1u, stats_.pto_count); - - // Verify two probe packets get sent. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - // Verify no exponential backoff. - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - - // Invoke 2nd PTO. - clock_.AdvanceTime(expected_pto_delay); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(2u, stats_.pto_count); - - // Verify two probe packets get sent. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - // Verify still no exponential backoff. - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - - // Invoke 3rd PTO. - clock_.AdvanceTime(expected_pto_delay); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(3u, stats_.pto_count); - - // Verify two probe packets get sent. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(7, type, ENCRYPTION_FORWARD_SECURE); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(8, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - // Verify exponential backoff starts. - EXPECT_EQ(clock_.Now() + expected_pto_delay * 2, - manager_.GetRetransmissionTime()); - - // Invoke 4th PTO. - clock_.AdvanceTime(expected_pto_delay * 2); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(4u, stats_.pto_count); - - // Verify two probe packets get sent. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .Times(2) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(9, type, ENCRYPTION_FORWARD_SECURE); - }))) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(10, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - // Verify exponential backoff continues. - EXPECT_EQ(clock_.Now() + expected_pto_delay * 4, - manager_.GetRetransmissionTime()); -} - TEST_F(QuicSentPacketManagerTest, PtoTimeoutRttVarMultiple) { - EnablePto(k1PTO); - // Use 2 * rttvar - QuicConfig config; - QuicTagVector options; - options.push_back(kPVS1); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) @@ -3158,172 +1990,12 @@ SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); // Verify PTO is correctly set based on 2 times rtt var. QuicTime::Delta expected_pto_delay = - srtt + 2 * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); EXPECT_EQ(clock_.Now() + expected_pto_delay, manager_.GetRetransmissionTime()); } -// Regression test for b/143962153 -TEST_F(QuicSentPacketManagerTest, RtoNotInFlightPacket) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); - // Send SHLO. - QuicStreamFrame crypto_frame(1, false, 0, absl::string_view()); - SendCryptoPacket(1); - // Send data packet. - SendDataPacket(2, ENCRYPTION_FORWARD_SECURE); - - // Successfully decrypt a forward secure packet. - EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).Times(1); - manager_.SetHandshakeConfirmed(); - - // 1st TLP. - manager_.OnRetransmissionTimeout(); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeRetransmitTailLossProbe(); - - // 2nd TLP. - manager_.OnRetransmissionTimeout(); - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeRetransmitTailLossProbe(); - - // RTO retransmits SHLO although it is not in flight. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<0>(Invoke([&crypto_frame](const QuicFrames& frames) { - EXPECT_EQ(1u, frames.size()); - EXPECT_NE(crypto_frame, frames[0].stream_frame); - return true; - }))); - manager_.OnRetransmissionTimeout(); -} - -TEST_F(QuicSentPacketManagerTest, Aggressive1Pto) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EnablePto(k1PTO); - // Let the first PTO be aggressive. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPAG1); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta srtt = rtt_stats->smoothed_rtt(); - SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); - // Verify PTO is correctly set. - QuicTime::Delta expected_pto_delay = 2 * srtt; - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - - // Invoke PTO. - clock_.AdvanceTime(expected_pto_delay); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(1u, stats_.pto_count); - - // Verify 1 probe packets get sent and packet number gets skipped. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - - // Verify PTO period gets set correctly. - QuicTime sent_time = clock_.Now(); - expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - EXPECT_EQ(sent_time + expected_pto_delay * 2, - manager_.GetRetransmissionTime()); -} - -TEST_F(QuicSentPacketManagerTest, Aggressive2Ptos) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EnablePto(k1PTO); - // Let the first PTO be aggressive. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPAG2); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta srtt = rtt_stats->smoothed_rtt(); - SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); - // Verify PTO is correctly set. - QuicTime::Delta expected_pto_delay = 2 * srtt; - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - - // Invoke PTO. - clock_.AdvanceTime(expected_pto_delay); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(1u, stats_.pto_count); - - // Verify 1 probe packets get sent and packet number gets skipped. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - - // Verify PTO period gets set correctly. - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); - - // Invoke 2nd PTO. - clock_.AdvanceTime(expected_pto_delay); - manager_.OnRetransmissionTimeout(); - EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now())); - EXPECT_EQ(2u, stats_.pto_count); - - // Verify 1 probe packets get sent and packet number gets skipped. - EXPECT_CALL(notifier_, RetransmitFrames(_, _)) - .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { - return RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE); - }))); - manager_.MaybeSendProbePackets(); - expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - - // Verify PTO period gets set correctly. - EXPECT_EQ(clock_.Now() + expected_pto_delay * 4, - manager_.GetRetransmissionTime()); -} - TEST_F(QuicSentPacketManagerTest, IW10ForUpAndDown) { QuicConfig config; QuicTagVector options; @@ -3339,7 +2011,6 @@ TEST_F(QuicSentPacketManagerTest, ClientMultiplePacketNumberSpacePtoTimeout) { manager_.EnableMultiplePacketNumberSpacesSupport(); - EnablePto(k1PTO); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) @@ -3354,7 +2025,7 @@ SendDataPacket(1, ENCRYPTION_INITIAL); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::Zero(); EXPECT_EQ(clock_.Now() + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3381,7 +2052,7 @@ .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { return RetransmitDataPacket(3, type, ENCRYPTION_HANDSHAKE); }))); - manager_.MaybeSendProbePackets(); + manager_.MaybeSendProbePacket(); // Verify PTO period gets set to twice the current value. const QuicTime packet3_sent_time = clock_.Now(); EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2, @@ -3417,7 +2088,7 @@ SendDataPacket(7, ENCRYPTION_HANDSHAKE); expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(); + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation(); // Verify PTO timeout is now based on packet 7. EXPECT_EQ(packet7_sent_time + expected_pto_delay * 2, manager_.GetRetransmissionTime()); @@ -3427,7 +2098,7 @@ // Forward progress has been made, verify PTO counter gets reset. PTO timeout // is armed by left edge. expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); EXPECT_EQ(packet4_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3435,7 +2106,6 @@ TEST_F(QuicSentPacketManagerTest, ServerMultiplePacketNumberSpacePtoTimeout) { manager_.EnableMultiplePacketNumberSpacesSupport(); - EnablePto(k1PTO); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) @@ -3450,7 +2120,7 @@ const QuicTime packet1_sent_time = clock_.Now(); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::Zero(); EXPECT_EQ(packet1_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3485,7 +2155,7 @@ // Discard handshake keys. manager_.SetHandshakeConfirmed(); expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); // Verify PTO timeout is now based on packet 3 as handshake is // complete/confirmed. @@ -3494,17 +2164,6 @@ } TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge) { - EnablePto(k1PTO); - // Use PTOS and PLE1. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPLE1); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.skip_packet_number_for_pto()); EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); @@ -3518,7 +2177,7 @@ SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); const QuicTime packet1_sent_time = clock_.Now(); EXPECT_EQ(packet1_sent_time + expected_pto_delay, @@ -3541,7 +2200,7 @@ .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); }))); - manager_.MaybeSendProbePackets(); + manager_.MaybeSendProbePacket(); // Verify PTO period gets set to twice the current value and based on packet3. QuicTime packet3_sent_time = clock_.Now(); EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2, @@ -3558,7 +2217,7 @@ ENCRYPTION_FORWARD_SECURE)); expected_pto_delay = rtt_stats->SmoothedOrInitialRtt() + - std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(), + std::max(kPtoRttvarMultiplier * rtt_stats->mean_deviation(), QuicTime::Delta::FromMilliseconds(1)) + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); @@ -3568,17 +2227,6 @@ } TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge2) { - EnablePto(k1PTO); - // Use PTOS and PLE2. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPLE2); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.skip_packet_number_for_pto()); EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); @@ -3592,7 +2240,7 @@ SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); const QuicTime packet1_sent_time = clock_.Now(); EXPECT_EQ(packet1_sent_time + expected_pto_delay, @@ -3603,7 +2251,7 @@ expected_pto_delay.ToMilliseconds() - 10)); SendDataPacket(2, ENCRYPTION_FORWARD_SECURE); // Verify PTO expands to packet 2 sent time + 1.5 * srtt. - expected_pto_delay = 1.5 * rtt_stats->smoothed_rtt(); + expected_pto_delay = kFirstPtoSrttMultiplier * rtt_stats->smoothed_rtt(); EXPECT_EQ(clock_.Now() + expected_pto_delay, manager_.GetRetransmissionTime()); EXPECT_EQ(0u, stats_.pto_count); @@ -3618,11 +2266,11 @@ .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) { return RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE); }))); - manager_.MaybeSendProbePackets(); + manager_.MaybeSendProbePacket(); // Verify PTO period gets set to twice the expected value and based on // packet3 (right edge). expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); QuicTime packet3_sent_time = clock_.Now(); EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2, @@ -3639,7 +2287,7 @@ ENCRYPTION_FORWARD_SECURE)); expected_pto_delay = rtt_stats->SmoothedOrInitialRtt() + - std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(), + std::max(kPtoRttvarMultiplier * rtt_stats->mean_deviation(), QuicTime::Delta::FromMilliseconds(1)) + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); @@ -3649,61 +2297,9 @@ manager_.GetRetransmissionTime()); } -TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutUsingStandardDeviation) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - EnablePto(k1PTO); - // Use PTOS and PSDA. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPSDA); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.skip_packet_number_for_pto()); - EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(50), - QuicTime::Delta::Zero(), QuicTime::Zero()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(50), - QuicTime::Delta::Zero(), QuicTime::Zero()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(75), - QuicTime::Delta::Zero(), QuicTime::Zero()); - QuicTime::Delta srtt = rtt_stats->smoothed_rtt(); - - SendDataPacket(1, ENCRYPTION_FORWARD_SECURE); - // Verify PTO is correctly set using standard deviation. - QuicTime::Delta expected_pto_delay = - srtt + - GetPtoRttvarMultiplier() * rtt_stats->GetStandardOrMeanDeviation() + - QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); - EXPECT_EQ(clock_.Now() + expected_pto_delay, - manager_.GetRetransmissionTime()); -} - TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdgeMultiplePacketNumberSpaces) { manager_.EnableMultiplePacketNumberSpacesSupport(); - EnablePto(k1PTO); - // Use PTOS and PLE1. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPLE1); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.skip_packet_number_for_pto()); EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); @@ -3719,7 +2315,7 @@ const QuicTime packet1_sent_time = clock_.Now(); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::Zero(); EXPECT_EQ(packet1_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3756,7 +2352,7 @@ // Verify PTO timeout is now based on packet 3 as handshake is // complete/confirmed. expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); EXPECT_EQ(packet3_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3771,17 +2367,6 @@ TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge2MultiplePacketNumberSpaces) { manager_.EnableMultiplePacketNumberSpacesSupport(); - EnablePto(k1PTO); - // Use PTOS and PLE2. - QuicConfig config; - QuicTagVector options; - options.push_back(kPTOS); - options.push_back(kPLE2); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - EXPECT_TRUE(manager_.skip_packet_number_for_pto()); EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*send_algorithm_, PacingRate(_)) .WillRepeatedly(Return(QuicBandwidth::Zero())); @@ -3797,7 +2382,7 @@ const QuicTime packet1_sent_time = clock_.Now(); // Verify PTO is correctly set. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::Zero(); EXPECT_EQ(packet1_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3834,7 +2419,7 @@ // Verify PTO timeout is now based on packet 3 as handshake is // complete/confirmed. expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs); EXPECT_EQ(packet3_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -3844,7 +2429,7 @@ expected_pto_delay.ToMilliseconds() - 10)); SendDataPacket(5, ENCRYPTION_FORWARD_SECURE); // Verify PTO timeout expands to packet 5 sent time + 1.5 * srtt. - EXPECT_EQ(clock_.Now() + 1.5 * rtt_stats->smoothed_rtt(), + EXPECT_EQ(clock_.Now() + kFirstPtoSrttMultiplier * rtt_stats->smoothed_rtt(), manager_.GetRetransmissionTime()); } @@ -3908,56 +2493,7 @@ QuicSentPacketManagerPeer::UsePacketThresholdForRuntPackets(&manager_)); } -TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayNonPto) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); - // Before RTT sample is available. - // 2 TLPs + 2 RTOs. - QuicTime::Delta expected_delay = QuicTime::Delta::Zero(); - for (size_t i = 0; i < 2; ++i) { - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, i); - expected_delay = - expected_delay + - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_); - } - for (size_t i = 0; i < 2; ++i) { - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, i); - expected_delay = - expected_delay + - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_); - } - EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay()); - - expected_delay = QuicTime::Delta::Zero(); - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 0); - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 0); - - // After RTT sample is available. - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), - QuicTime::Delta::Zero(), QuicTime::Zero()); - // 2 TLPs + 2 RTOs. - for (size_t i = 0; i < 2; ++i) { - QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, i); - expected_delay = - expected_delay + - QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_); - } - for (size_t i = 0; i < 2; ++i) { - QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, i); - expected_delay = - expected_delay + - QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_); - } - EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay()); -} - TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayDefaultPTO) { - if (!GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); QuicTime::Delta expected_delay = 4 * manager_.GetPtoDelay(); EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay()); @@ -3965,34 +2501,26 @@ TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsing2PTO) { QuicConfig client_config; - QuicTagVector options; - options.push_back(k1PTO); QuicTagVector client_options; client_options.push_back(kPDP2); QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); client_config.SetClientConnectionOptions(client_options); EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); manager_.SetFromConfig(client_config); - EXPECT_TRUE(manager_.pto_enabled()); QuicTime::Delta expected_delay = 2 * manager_.GetPtoDelay(); EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay()); } TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsing1PTO) { QuicConfig client_config; - QuicTagVector options; - options.push_back(k1PTO); QuicTagVector client_options; client_options.push_back(kPDP1); QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); - client_config.SetConnectionOptionsToSend(options); client_config.SetClientConnectionOptions(client_options); EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); manager_.SetFromConfig(client_config); - EXPECT_TRUE(manager_.pto_enabled()); QuicTime::Delta expected_delay = 1 * manager_.GetPtoDelay(); EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay()); } @@ -4068,10 +2596,7 @@ EXPECT_CALL(notifier_, RetransmitFrames(_, _)) .WillOnce( WithArgs<1>(Invoke([this]() { return RetransmitCryptoPacket(3); }))); - manager_.MaybeSendProbePackets(); - if (GetQuicRestartFlag(quic_default_on_pto2)) { - manager_.AdjustPendingTimerTransmissions(); - } + manager_.MaybeSendProbePacket(); // Verify exponential backoff of the PTO timeout. EXPECT_EQ(clock_.Now() + 2 * expected_pto_delay, manager_.GetRetransmissionTime()); @@ -4098,10 +2623,7 @@ EXPECT_CALL(notifier_, RetransmitFrames(_, _)) .WillOnce( WithArgs<1>(Invoke([this]() { return RetransmitCryptoPacket(3); }))); - manager_.MaybeSendProbePackets(); - if (GetQuicRestartFlag(quic_default_on_pto2)) { - manager_.AdjustPendingTimerTransmissions(); - } + manager_.MaybeSendProbePacket(); // Verify exponential backoff of the PTO timeout. EXPECT_EQ(clock_.Now() + 2 * expected_pto_delay, manager_.GetRetransmissionTime()); @@ -4135,7 +2657,7 @@ // Verify nothing to probe (and connection will send PING for current // encryption level). EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0); - manager_.MaybeSendProbePackets(); + manager_.MaybeSendProbePacket(); } // Regression test for b/156487311 @@ -4171,7 +2693,7 @@ RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); const QuicTime::Delta pto_delay = rtt_stats->smoothed_rtt() + - GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::Zero(); // Verify PTO is armed based on handshake data. EXPECT_EQ(packet2_sent_time + pto_delay, manager_.GetRetransmissionTime()); @@ -4246,7 +2768,7 @@ SendDataPacket(3, ENCRYPTION_HANDSHAKE); // Verify PTO is correctly set based on packet 1. QuicTime::Delta expected_pto_delay = - srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() + + srtt + kPtoRttvarMultiplier * rtt_stats->mean_deviation() + QuicTime::Delta::Zero(); EXPECT_EQ(packet1_sent_time + expected_pto_delay, manager_.GetRetransmissionTime()); @@ -4274,33 +2796,6 @@ manager_.GetRetransmissionTime()); } -TEST_F(QuicSentPacketManagerTest, - AggressivePtoBeforeAnyRttSamplesAreAvailable) { - if (GetQuicRestartFlag(quic_default_on_pto2)) { - return; - } - manager_.EnableMultiplePacketNumberSpacesSupport(); - EXPECT_CALL(*send_algorithm_, PacingRate(_)) - .WillRepeatedly(Return(QuicBandwidth::Zero())); - EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) - .WillRepeatedly(Return(10 * kDefaultTCPMSS)); - RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); - - QuicConfig config; - QuicTagVector options; - options.push_back(kAPTO); - QuicConfigPeer::SetReceivedConnectionOptions(&config, options); - EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); - EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); - manager_.SetFromConfig(config); - - // Send INITIAL 1. - SendDataPacket(1, ENCRYPTION_INITIAL); - // Verify retransmission timeout is expected. - EXPECT_EQ(clock_.Now() + 1.5 * rtt_stats->initial_rtt(), - manager_.GetRetransmissionTime()); -} - TEST_F(QuicSentPacketManagerTest, SendPathChallengeAndGetAck) { QuicPacketNumber packet_number(1); EXPECT_CALL(*send_algorithm_,
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc index ccaa29d..bb198e4 100644 --- a/quiche/quic/core/quic_session_test.cc +++ b/quiche/quic/core/quic_session_test.cc
@@ -2488,7 +2488,7 @@ EXPECT_CALL(*stream6, RetransmitStreamData(_, _, _, _)) .WillOnce(Return(true)); EXPECT_CALL(*send_algorithm, OnApplicationLimited(_)); - session_.RetransmitFrames(frames, TLP_RETRANSMISSION); + session_.RetransmitFrames(frames, PTO_RETRANSMISSION); } // Regression test of b/110082001.
diff --git a/quiche/quic/core/quic_stream.cc b/quiche/quic/core/quic_stream.cc index 7d1a9dd..90b1e29 100644 --- a/quiche/quic/core/quic_stream.cc +++ b/quiche/quic/core/quic_stream.cc
@@ -1139,8 +1139,7 @@ bool QuicStream::RetransmitStreamData(QuicStreamOffset offset, QuicByteCount data_length, bool fin, TransmissionType type) { - QUICHE_DCHECK(type == PTO_RETRANSMISSION || type == RTO_RETRANSMISSION || - type == TLP_RETRANSMISSION || type == PROBING_RETRANSMISSION); + QUICHE_DCHECK(type == PTO_RETRANSMISSION || type == PROBING_RETRANSMISSION); if (HasDeadlinePassed()) { OnDeadlinePassed(); return true;
diff --git a/quiche/quic/core/quic_types.cc b/quiche/quic/core/quic_types.cc index 389477b..3d52661 100644 --- a/quiche/quic/core/quic_types.cc +++ b/quiche/quic/core/quic_types.cc
@@ -214,8 +214,6 @@ RETURN_STRING_LITERAL(HANDSHAKE_RETRANSMISSION); RETURN_STRING_LITERAL(ALL_ZERO_RTT_RETRANSMISSION); RETURN_STRING_LITERAL(LOSS_RETRANSMISSION); - RETURN_STRING_LITERAL(RTO_RETRANSMISSION); - RETURN_STRING_LITERAL(TLP_RETRANSMISSION); RETURN_STRING_LITERAL(PTO_RETRANSMISSION); RETURN_STRING_LITERAL(PROBING_RETRANSMISSION); RETURN_STRING_LITERAL(PATH_RETRANSMISSION);
diff --git a/quiche/quic/core/quic_types.h b/quiche/quic/core/quic_types.h index b136708..c21030b 100644 --- a/quiche/quic/core/quic_types.h +++ b/quiche/quic/core/quic_types.h
@@ -187,8 +187,6 @@ ALL_ZERO_RTT_RETRANSMISSION, // Retransmits all packets encrypted with 0-RTT // key. LOSS_RETRANSMISSION, // Retransmits due to loss detection. - RTO_RETRANSMISSION, // Retransmits due to retransmit time out. - TLP_RETRANSMISSION, // Tail loss probes. PTO_RETRANSMISSION, // Retransmission due to probe timeout. PROBING_RETRANSMISSION, // Retransmission in order to probe bandwidth. PATH_RETRANSMISSION, // Retransmission proactively due to underlying @@ -552,10 +550,6 @@ HANDSHAKE_RETRANSMITTED, // This packet is considered as lost, this is used for LOST_RETRANSMISSION. LOST, - // This packet has been retransmitted when TLP fires. - TLP_RETRANSMITTED, - // This packet has been retransmitted when RTO fires. - RTO_RETRANSMITTED, // This packet has been retransmitted when PTO fires. PTO_RETRANSMITTED, // This packet has been retransmitted for probing purpose.
diff --git a/quiche/quic/core/quic_unacked_packet_map_test.cc b/quiche/quic/core/quic_unacked_packet_map_test.cc index 3acb13a..0540164 100644 --- a/quiche/quic/core/quic_unacked_packet_map_test.cc +++ b/quiche/quic/core/quic_unacked_packet_map_test.cc
@@ -402,8 +402,8 @@ std::vector<uint64_t> retransmittable2 = {1, 3}; VerifyRetransmittablePackets(&retransmittable2[0], retransmittable2.size()); - // TLP 3 (formerly 1) as 4, and don't remove 1 from unacked. - RetransmitAndSendPacket(3, 4, TLP_RETRANSMISSION); + // PTO 3 (formerly 1) as 4, and don't remove 1 from unacked. + RetransmitAndSendPacket(3, 4, PTO_RETRANSMISSION); SerializedPacket packet5(CreateRetransmittablePacket(5)); unacked_packets_.AddSentPacket(&packet5, NOT_RETRANSMISSION, now_, true, true);
diff --git a/quiche/quic/core/quic_utils.cc b/quiche/quic/core/quic_utils.cc index fcda2e6..6113c91 100644 --- a/quiche/quic/core/quic_utils.cc +++ b/quiche/quic/core/quic_utils.cc
@@ -170,8 +170,6 @@ RETURN_STRING_LITERAL(NEUTERED); RETURN_STRING_LITERAL(HANDSHAKE_RETRANSMITTED); RETURN_STRING_LITERAL(LOST); - RETURN_STRING_LITERAL(TLP_RETRANSMITTED); - RETURN_STRING_LITERAL(RTO_RETRANSMITTED); RETURN_STRING_LITERAL(PTO_RETRANSMITTED); RETURN_STRING_LITERAL(PROBE_RETRANSMITTED); RETURN_STRING_LITERAL(NOT_CONTRIBUTING_RTT); @@ -289,10 +287,6 @@ return HANDSHAKE_RETRANSMITTED; case LOSS_RETRANSMISSION: return LOST; - case TLP_RETRANSMISSION: - return TLP_RETRANSMITTED; - case RTO_RETRANSMISSION: - return RTO_RETRANSMITTED; case PTO_RETRANSMISSION: return PTO_RETRANSMITTED; case PROBING_RETRANSMISSION:
diff --git a/quiche/quic/core/quic_utils_test.cc b/quiche/quic/core/quic_utils_test.cc index 19ce446..a985b37 100644 --- a/quiche/quic/core/quic_utils_test.cc +++ b/quiche/quic/core/quic_utils_test.cc
@@ -129,10 +129,6 @@ EXPECT_EQ(LOST, state); } else if (i == ALL_ZERO_RTT_RETRANSMISSION) { EXPECT_EQ(UNACKABLE, state); - } else if (i == TLP_RETRANSMISSION) { - EXPECT_EQ(TLP_RETRANSMITTED, state); - } else if (i == RTO_RETRANSMISSION) { - EXPECT_EQ(RTO_RETRANSMITTED, state); } else if (i == PTO_RETRANSMISSION) { EXPECT_EQ(PTO_RETRANSMITTED, state); } else if (i == PROBING_RETRANSMISSION) {
diff --git a/quiche/quic/test_tools/quic_sent_packet_manager_peer.cc b/quiche/quic/test_tools/quic_sent_packet_manager_peer.cc index dc41041..2f3cb63 100644 --- a/quiche/quic/test_tools/quic_sent_packet_manager_peer.cc +++ b/quiche/quic/test_tools/quic_sent_packet_manager_peer.cc
@@ -13,23 +13,6 @@ namespace quic { namespace test { -// static -size_t QuicSentPacketManagerPeer::GetMaxTailLossProbes( - QuicSentPacketManager* sent_packet_manager) { - return sent_packet_manager->max_tail_loss_probes_; -} - -// static -void QuicSentPacketManagerPeer::SetMaxTailLossProbes( - QuicSentPacketManager* sent_packet_manager, size_t max_tail_loss_probes) { - sent_packet_manager->max_tail_loss_probes_ = max_tail_loss_probes; -} - -// static -bool QuicSentPacketManagerPeer::GetUseNewRto( - QuicSentPacketManager* sent_packet_manager) { - return sent_packet_manager->use_new_rto_; -} // static void QuicSentPacketManagerPeer::SetPerspective( @@ -91,18 +74,6 @@ } // static -QuicTime::Delta QuicSentPacketManagerPeer::GetRetransmissionDelay( - const QuicSentPacketManager* sent_packet_manager) { - return sent_packet_manager->GetRetransmissionDelay(); -} - -// static -QuicTime::Delta QuicSentPacketManagerPeer::GetTailLossProbeDelay( - const QuicSentPacketManager* sent_packet_manager) { - return sent_packet_manager->GetTailLossProbeDelay(); -} - -// static size_t QuicSentPacketManagerPeer::GetNumRetransmittablePackets( const QuicSentPacketManager* sent_packet_manager) { size_t num_unacked_packets = 0; @@ -116,15 +87,9 @@ } // static -void QuicSentPacketManagerPeer::SetConsecutiveRtoCount( +void QuicSentPacketManagerPeer::SetConsecutivePtoCount( QuicSentPacketManager* sent_packet_manager, size_t count) { - sent_packet_manager->consecutive_rto_count_ = count; -} - -// static -void QuicSentPacketManagerPeer::SetConsecutiveTlpCount( - QuicSentPacketManager* sent_packet_manager, size_t count) { - sent_packet_manager->consecutive_tlp_count_ = count; + sent_packet_manager->consecutive_pto_count_ = count; } // static
diff --git a/quiche/quic/test_tools/quic_sent_packet_manager_peer.h b/quiche/quic/test_tools/quic_sent_packet_manager_peer.h index be2a7bd..aef38d3 100644 --- a/quiche/quic/test_tools/quic_sent_packet_manager_peer.h +++ b/quiche/quic/test_tools/quic_sent_packet_manager_peer.h
@@ -18,13 +18,6 @@ public: QuicSentPacketManagerPeer() = delete; - static size_t GetMaxTailLossProbes( - QuicSentPacketManager* sent_packet_manager); - - static void SetMaxTailLossProbes(QuicSentPacketManager* sent_packet_manager, - size_t max_tail_loss_probes); - - static bool GetUseNewRto(QuicSentPacketManager* sent_packet_manager); static void SetPerspective(QuicSentPacketManager* sent_packet_manager, Perspective perspective); @@ -51,18 +44,10 @@ uint64_t packet_number, TransmissionType transmission_type); - static QuicTime::Delta GetRetransmissionDelay( - const QuicSentPacketManager* sent_packet_manager); - static QuicTime::Delta GetTailLossProbeDelay( - const QuicSentPacketManager* sent_packet_manager); - static size_t GetNumRetransmittablePackets( const QuicSentPacketManager* sent_packet_manager); - static void SetConsecutiveRtoCount(QuicSentPacketManager* sent_packet_manager, - size_t count); - - static void SetConsecutiveTlpCount(QuicSentPacketManager* sent_packet_manager, + static void SetConsecutivePtoCount(QuicSentPacketManager* sent_packet_manager, size_t count); static QuicSustainedBandwidthRecorder& GetBandwidthRecorder(
diff --git a/quiche/quic/test_tools/simple_session_notifier_test.cc b/quiche/quic/test_tools/simple_session_notifier_test.cc index 2aa35e5..513394c 100644 --- a/quiche/quic/test_tools/simple_session_notifier_test.cc +++ b/quiche/quic/test_tools/simple_session_notifier_test.cc
@@ -358,7 +358,7 @@ // stream 3 data [0, 3) is retransmitted and connection is blocked. EXPECT_CALL(connection_, SendStreamData(3, 3, 0, NO_FIN)) .WillOnce(Return(QuicConsumedData(2, false))); - notifier_.RetransmitFrames(frames, RTO_RETRANSMISSION); + notifier_.RetransmitFrames(frames, PTO_RETRANSMISSION); EXPECT_FALSE(notifier_.WillingToWrite()); }