Remove use of std::function from CreateContextForMultiPortPath() https://quiche.googlesource.com/quiche/+/107316f10996668916ae6166b6cb0725632df2a0 introduced the use of std::function to CreateContextForMultiPortPath(). However, std::function is banned in Chromium code. Hence, this CL removes the use of it to be able to roll into Chromium. PiperOrigin-RevId: 531511575
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index 867caf6..80de256 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -4101,20 +4101,8 @@ return; } - visitor_->CreateContextForMultiPortPath( - [this](std::unique_ptr<QuicPathValidationContext> path_context) { - if (!path_context) { - return; - } - auto multi_port_validation_result_delegate = - std::make_unique<MultiPortPathValidationResultDelegate>(this); - multi_port_probing_alarm_->Cancel(); - multi_port_path_context_ = nullptr; - multi_port_stats_->num_multi_port_paths_created++; - ValidatePath(std::move(path_context), - std::move(multi_port_validation_result_delegate), - PathValidationReason::kMultiPort); - }); + auto context_observer = std::make_unique<ContextObserver>(this); + visitor_->CreateContextForMultiPortPath(std::move(context_observer)); } void QuicConnection::SendOrQueuePacket(SerializedPacket packet) { @@ -7274,6 +7262,21 @@ PathValidationReason::kMultiPort); } +void QuicConnection::ContextObserver::OnMultiPortPathContextAvailable( + std::unique_ptr<QuicPathValidationContext> path_context) { + if (!path_context) { + return; + } + auto multi_port_validation_result_delegate = + std::make_unique<MultiPortPathValidationResultDelegate>(connection_); + connection_->multi_port_probing_alarm_->Cancel(); + connection_->multi_port_path_context_ = nullptr; + connection_->multi_port_stats_->num_multi_port_paths_created++; + connection_->ValidatePath(std::move(path_context), + std::move(multi_port_validation_result_delegate), + PathValidationReason::kMultiPort); +} + QuicConnection::MultiPortPathValidationResultDelegate:: MultiPortPathValidationResultDelegate(QuicConnection* connection) : connection_(connection) { @@ -7304,8 +7307,7 @@ peer_address_alternative_path_( connection_->alternative_path_.peer_address), active_effective_peer_migration_type_( - connection_->active_effective_peer_migration_type_) { -} + connection_->active_effective_peer_migration_type_) {} void QuicConnection::ReversePathValidationResultDelegate:: OnPathValidationSuccess(std::unique_ptr<QuicPathValidationContext> context,
diff --git a/quiche/quic/core/quic_connection.h b/quiche/quic/core/quic_connection.h index 94d60eb..a5dfe53 100644 --- a/quiche/quic/core/quic_connection.h +++ b/quiche/quic/core/quic_connection.h
@@ -73,6 +73,16 @@ class QuicConnectionPeer; } // namespace test +// Class that receives callbacks from the connection when the path context is +// available. +class QUIC_EXPORT_PRIVATE MultiPortPathContextObserver { + public: + virtual void OnMultiPortPathContextAvailable( + std::unique_ptr<QuicPathValidationContext>) = 0; + + virtual ~MultiPortPathContextObserver() = default; +}; + // Class that receives callbacks from the connection when frames are received // and when other interesting events happen. class QUIC_EXPORT_PRIVATE QuicConnectionVisitorInterface { @@ -237,14 +247,14 @@ // When bandwidth update alarms. virtual void OnBandwidthUpdateTimeout() = 0; - // Runs |create_context| with context needed for the connection to probe on - // the alternative path. The callback must be called exactly once. May run - // |create_context| synchronously or asynchronously. If |create_context| is + // Runs OnMultiPortPathContextAvailable() from |context_observer| with context + // needed for the connection to probe on the alternative path. The callback + // must be called exactly once. May run OnMultiPortPathContextAvailable() + // synchronously or asynchronously. If OnMultiPortPathContextAvailable() is // run asynchronously, it must be called on the same thread as QuicConnection // is not thread safe. virtual void CreateContextForMultiPortPath( - std::function<void(std::unique_ptr<QuicPathValidationContext>)> - create_context) = 0; + std::unique_ptr<MultiPortPathContextObserver> context_observer) = 0; // Migrate to the multi-port path which is identified by |context|. virtual void MigrateToMultiPortPath( @@ -646,9 +656,7 @@ // Mark version negotiated for this connection. Once called, the connection // will ignore received version negotiation packets. - void SetVersionNegotiated() { - version_negotiated_ = true; - } + void SetVersionNegotiated() { version_negotiated_ = true; } // From QuicFramerVisitorInterface void OnError(QuicFramer* framer) override; @@ -1575,6 +1583,18 @@ AddressChangeType active_effective_peer_migration_type_; }; + class ContextObserver final : public MultiPortPathContextObserver { + public: + explicit ContextObserver(QuicConnection* connection) + : connection_(connection) {} + + void OnMultiPortPathContextAvailable( + std::unique_ptr<QuicPathValidationContext> path_context) override; + + private: + QuicConnection* connection_; + }; + // Keeps an ongoing alternative path. The connection will not migrate upon // validation success. class MultiPortPathValidationResultDelegate
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc index 6a0e9d0..88a9fd4 100644 --- a/quiche/quic/core/quic_connection_test.cc +++ b/quiche/quic/core/quic_connection_test.cc
@@ -13383,9 +13383,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = 1u; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillRepeatedly(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress, connection_.peer_address(), &new_writer))); + .WillRepeatedly(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer))); })); connection_.OnNewConnectionIdFrame(frame); EXPECT_TRUE(connection_.HasPendingPathValidation()); @@ -13519,9 +13520,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = 1u; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillRepeatedly(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress, connection_.peer_address(), &new_writer))); + .WillRepeatedly(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer))); })); EXPECT_TRUE(connection_.OnNewConnectionIdFrame(frame)); EXPECT_TRUE(connection_.HasPendingPathValidation()); @@ -13558,9 +13560,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = i + 2; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillRepeatedly(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress, connection_.peer_address(), &new_writer))); + .WillRepeatedly(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer))); })); EXPECT_TRUE(connection_.OnNewConnectionIdFrame(frame)); EXPECT_TRUE(connection_.HasPendingPathValidation()); @@ -13630,9 +13633,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = 1u; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillRepeatedly(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress, connection_.peer_address(), &new_writer))); + .WillRepeatedly(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer))); })); EXPECT_TRUE(connection_.OnNewConnectionIdFrame(frame)); EXPECT_TRUE(connection_.HasPendingPathValidation()); @@ -13700,9 +13704,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = 1u; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillRepeatedly(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress, connection_.peer_address(), &new_writer))); + .WillRepeatedly(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer))); })); EXPECT_TRUE(connection_.OnNewConnectionIdFrame(frame)); EXPECT_TRUE(connection_.HasPendingPathValidation()); @@ -13778,9 +13783,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = 1u; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillRepeatedly(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress, connection_.peer_address(), &new_writer))); + .WillRepeatedly(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress, connection_.peer_address(), &new_writer))); })); EXPECT_TRUE(connection_.OnNewConnectionIdFrame(frame)); EXPECT_TRUE(connection_.HasPendingPathValidation()); @@ -16849,9 +16855,10 @@ frame.retire_prior_to = 0u; frame.sequence_number = 2u; EXPECT_CALL(visitor_, CreateContextForMultiPortPath) - .WillOnce(testing::WithArgs<0>([&](auto&& fn) { - fn(std::move(std::make_unique<TestQuicPathValidationContext>( - kNewSelfAddress2, connection_.peer_address(), &new_writer2))); + .WillOnce(testing::WithArgs<0>([&](auto&& observer) { + observer->OnMultiPortPathContextAvailable( + std::move(std::make_unique<TestQuicPathValidationContext>( + kNewSelfAddress2, connection_.peer_address(), &new_writer2))); })); connection_.OnNewConnectionIdFrame(frame); EXPECT_TRUE(connection_.HasPendingPathValidation());
diff --git a/quiche/quic/core/quic_session.h b/quiche/quic/core/quic_session.h index 1034a3c..05e8ab3 100644 --- a/quiche/quic/core/quic_session.h +++ b/quiche/quic/core/quic_session.h
@@ -182,10 +182,8 @@ bool MaybeSendAddressToken() override; void OnBandwidthUpdateTimeout() override {} void CreateContextForMultiPortPath( - std::function<void(std::unique_ptr<QuicPathValidationContext>)> - create_context) override { - create_context(nullptr); - } + std::unique_ptr<MultiPortPathContextObserver> /*context_observer*/) + override {} void MigrateToMultiPortPath( std::unique_ptr<QuicPathValidationContext> /*context*/) override {} void OnServerPreferredAddressAvailable(
diff --git a/quiche/quic/test_tools/quic_test_utils.h b/quiche/quic/test_tools/quic_test_utils.h index c21107c..25cc2d4 100644 --- a/quiche/quic/test_tools/quic_test_utils.h +++ b/quiche/quic/test_tools/quic_test_utils.h
@@ -505,8 +505,7 @@ MOCK_METHOD(bool, ValidateToken, (absl::string_view), (override)); MOCK_METHOD(bool, MaybeSendAddressToken, (), (override)); MOCK_METHOD(void, CreateContextForMultiPortPath, - (std::function<void(std::unique_ptr<QuicPathValidationContext>)>), - (override)); + (std::unique_ptr<MultiPortPathContextObserver>), (override)); MOCK_METHOD(void, MigrateToMultiPortPath, (std::unique_ptr<QuicPathValidationContext>), (override)); MOCK_METHOD(void, OnServerPreferredAddressAvailable,
diff --git a/quiche/quic/test_tools/simulator/quic_endpoint.h b/quiche/quic/test_tools/simulator/quic_endpoint.h index 29b72c5..84f5ad9 100644 --- a/quiche/quic/test_tools/simulator/quic_endpoint.h +++ b/quiche/quic/test_tools/simulator/quic_endpoint.h
@@ -106,10 +106,8 @@ bool MaybeSendAddressToken() override { return false; } void OnBandwidthUpdateTimeout() override {} void CreateContextForMultiPortPath( - std::function<void(std::unique_ptr<QuicPathValidationContext>)> - create_context) override { - create_context(nullptr); - } + std::unique_ptr<MultiPortPathContextObserver> /*context_observer*/) + override {} void MigrateToMultiPortPath( std::unique_ptr<QuicPathValidationContext> /*context*/) override {} void OnServerPreferredAddressAvailable(
diff --git a/quiche/quic/tools/quic_simple_client_session.cc b/quiche/quic/tools/quic_simple_client_session.cc index 0bb1515..c2c266f 100644 --- a/quiche/quic/tools/quic_simple_client_session.cc +++ b/quiche/quic/tools/quic_simple_client_session.cc
@@ -53,27 +53,24 @@ } void QuicSimpleClientSession::CreateContextForMultiPortPath( - std::function<void(std::unique_ptr<QuicPathValidationContext>)> - create_context) { + std::unique_ptr<MultiPortPathContextObserver> context_observer) { if (!network_helper_ || connection()->multi_port_stats() == nullptr) { - create_context(nullptr); return; } auto self_address = connection()->self_address(); auto server_address = connection()->peer_address(); if (!network_helper_->CreateUDPSocketAndBind( server_address, self_address.host(), self_address.port() + 1)) { - create_context(nullptr); return; } QuicPacketWriter* writer = network_helper_->CreateQuicPacketWriter(); if (writer == nullptr) { - create_context(nullptr); return; } - create_context(std::make_unique<PathMigrationContext>( - std::unique_ptr<QuicPacketWriter>(writer), - network_helper_->GetLatestClientAddress(), peer_address())); + context_observer->OnMultiPortPathContextAvailable( + std::make_unique<PathMigrationContext>( + std::unique_ptr<QuicPacketWriter>(writer), + network_helper_->GetLatestClientAddress(), peer_address())); } void QuicSimpleClientSession::MigrateToMultiPortPath(
diff --git a/quiche/quic/tools/quic_simple_client_session.h b/quiche/quic/tools/quic_simple_client_session.h index 2a0db5d..1017341 100644 --- a/quiche/quic/tools/quic_simple_client_session.h +++ b/quiche/quic/tools/quic_simple_client_session.h
@@ -40,8 +40,7 @@ bool ShouldNegotiateWebTransport() override; HttpDatagramSupport LocalHttpDatagramSupport() override; void CreateContextForMultiPortPath( - std::function<void(std::unique_ptr<QuicPathValidationContext>)> - create_context) override; + std::unique_ptr<MultiPortPathContextObserver> context_observer) override; void MigrateToMultiPortPath( std::unique_ptr<QuicPathValidationContext> context) override; bool drop_response_body() const { return drop_response_body_; }