Add a new callback for probing retransmissions. Whenever the connection needs to send probing retransmissions it calls the session to decide what data to send. gfe-relnote: n/a (probing retransmissions only used by Quartc) PiperOrigin-RevId: 245817562 Change-Id: I2239c32ea4e2f6aa7dd6f733045ccc8fa0da4dc5
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 6cb6c85..1fc69e1 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -2281,10 +2281,7 @@ void QuicConnection::SendProbingRetransmissions() { while (sent_packet_manager_.GetSendAlgorithm()->ShouldSendProbingPacket() && CanWrite(HAS_RETRANSMITTABLE_DATA)) { - const bool can_retransmit = - sent_packet_manager_.MaybeRetransmitOldestPacket( - PROBING_RETRANSMISSION); - if (!can_retransmit) { + if (!visitor_->SendProbingData()) { QUIC_DVLOG(1) << "Cannot send probing retransmissions: nothing to retransmit."; break;
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index b37b60c..3173ee3 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -143,6 +143,10 @@ // Called when a blocked socket becomes writable. virtual void OnCanWrite() = 0; + // Called when the connection needs more data to probe for additional + // bandwidth. Returns true if data was sent, false otherwise. + virtual bool SendProbingData() = 0; + // Called when the connection experiences a change in congestion window. virtual void OnCongestionWindowChange(QuicTime now) = 0;
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc index 5d35353..fe74768 100644 --- a/quic/core/quic_connection_test.cc +++ b/quic/core/quic_connection_test.cc
@@ -8063,6 +8063,10 @@ EXPECT_CALL(visitor_, WillingAndAbleToWrite()) .WillRepeatedly(Return(false)); } + EXPECT_CALL(visitor_, SendProbingData()).WillRepeatedly([this] { + return connection_.sent_packet_manager().MaybeRetransmitOldestPacket( + PROBING_RETRANSMISSION); + }); // Fix congestion window to be 20,000 bytes. EXPECT_CALL(*send_algorithm_, CanSend(Ge(20000u))) .WillRepeatedly(Return(false)); @@ -8209,6 +8213,10 @@ })); EXPECT_CALL(*send_algorithm_, ShouldSendProbingPacket()) .WillRepeatedly(Return(true)); + EXPECT_CALL(visitor_, SendProbingData()).WillRepeatedly([this] { + return connection_.sent_packet_manager().MaybeRetransmitOldestPacket( + PROBING_RETRANSMISSION); + }); connection_.SendProbingRetransmissions(); @@ -8232,6 +8240,10 @@ EXPECT_CALL(debug_visitor, OnPacketSent(_, _, _, _)).Times(0); EXPECT_CALL(*send_algorithm_, ShouldSendProbingPacket()) .WillRepeatedly(Return(true)); + EXPECT_CALL(visitor_, SendProbingData()).WillRepeatedly([this] { + return connection_.sent_packet_manager().MaybeRetransmitOldestPacket( + PROBING_RETRANSMISSION); + }); connection_.SendProbingRetransmissions(); }
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index 86ee78f..2b9ffa5 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -587,6 +587,14 @@ } } +bool QuicSession::SendProbingData() { + if (connection()->sent_packet_manager().MaybeRetransmitOldestPacket( + PROBING_RETRANSMISSION)) { + return true; + } + return false; +} + bool QuicSession::WillingAndAbleToWrite() const { // Schedule a write when: // 1) control frame manager has pending or new control frames, or
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index 54637d4..b24e5b6 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -115,6 +115,7 @@ const QuicSocketAddress& self_address, const QuicSocketAddress& peer_address) override; void OnCanWrite() override; + bool SendProbingData() override; void OnCongestionWindowChange(QuicTime /*now*/) override {} void OnConnectionMigration(AddressChangeType type) override {} // Adds a connection level WINDOW_UPDATE frame.
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h index c9db3e5..08337da 100644 --- a/quic/test_tools/quic_test_utils.h +++ b/quic/test_tools/quic_test_utils.h
@@ -363,6 +363,7 @@ ConnectionCloseSource source)); MOCK_METHOD0(OnWriteBlocked, void()); MOCK_METHOD0(OnCanWrite, void()); + MOCK_METHOD0(SendProbingData, bool()); MOCK_METHOD1(OnCongestionWindowChange, void(QuicTime now)); MOCK_METHOD1(OnConnectionMigration, void(AddressChangeType type)); MOCK_METHOD0(OnPathDegrading, void());
diff --git a/quic/test_tools/simulator/quic_endpoint.cc b/quic/test_tools/simulator/quic_endpoint.cc index 9e5c3fa..61d253f 100644 --- a/quic/test_tools/simulator/quic_endpoint.cc +++ b/quic/test_tools/simulator/quic_endpoint.cc
@@ -238,6 +238,15 @@ } WriteStreamData(); } + +bool QuicEndpoint::SendProbingData() { + if (connection()->sent_packet_manager().MaybeRetransmitOldestPacket( + PROBING_RETRANSMISSION)) { + return true; + } + return false; +} + bool QuicEndpoint::WillingAndAbleToWrite() const { if (notifier_ != nullptr) { return notifier_->WillingToWrite();
diff --git a/quic/test_tools/simulator/quic_endpoint.h b/quic/test_tools/simulator/quic_endpoint.h index 7693b7b..8bbdbd7 100644 --- a/quic/test_tools/simulator/quic_endpoint.h +++ b/quic/test_tools/simulator/quic_endpoint.h
@@ -82,6 +82,7 @@ void OnStreamFrame(const QuicStreamFrame& frame) override; void OnCryptoFrame(const QuicCryptoFrame& frame) override; void OnCanWrite() override; + bool SendProbingData() override; bool WillingAndAbleToWrite() const override; bool HasPendingHandshake() const override; bool ShouldKeepConnectionAlive() const override;