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_; }