Refactor out sending address token logic into a stand alone method in QuicSession, and make it an interface in QuicConnectionVisitorInterface. PiperOrigin-RevId: 348531227 Change-Id: I213c82ee797269b42ba46691eaa03c254f035fcd
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index f272a6a..dd453cb 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -219,6 +219,10 @@ // Consider the client address gets validated (and therefore remove // amplification factor) once the |token| gets successfully validated. virtual bool ValidateToken(absl::string_view token) const = 0; + + // Called by the server to send another token. + // Return false if the crypto stream fail to generate one. + virtual void MaybeSendAddressToken() = 0; }; // Interface which gets callbacks from the QuicConnection at interesting
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index b2d59c5..e0a5e09 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -1681,21 +1681,28 @@ connection()->version().HasIetfQuicFrames()) { QUIC_RELOADABLE_FLAG_COUNT_N(quic_enable_token_based_address_validation, 1, 2); - std::string address_token = GetCryptoStream()->GetAddressToken(); - if (!address_token.empty()) { - const size_t buf_len = address_token.length() + 1; - auto buffer = std::make_unique<char[]>(buf_len); - QuicDataWriter writer(buf_len, buffer.get()); - // Add prefix 0 for token sent in NEW_TOKEN frame. - writer.WriteUInt8(0); - writer.WriteBytes(address_token.data(), address_token.length()); - control_frame_manager_.WriteOrBufferNewToken( - absl::string_view(buffer.get(), buf_len)); - } + MaybeSendAddressToken(); } } } +void QuicSession::MaybeSendAddressToken() { + DCHECK(perspective_ == Perspective::IS_SERVER && + connection()->version().HasIetfQuicFrames()); + std::string address_token = GetCryptoStream()->GetAddressToken(); + if (address_token.empty()) { + return; + } + const size_t buf_len = address_token.length() + 1; + auto buffer = std::make_unique<char[]>(buf_len); + QuicDataWriter writer(buf_len, buffer.get()); + // Add prefix 0 for token sent in NEW_TOKEN frame. + writer.WriteUInt8(0); + writer.WriteBytes(address_token.data(), address_token.length()); + control_frame_manager_.WriteOrBufferNewToken( + absl::string_view(buffer.get(), buf_len)); +} + void QuicSession::DiscardOldDecryptionKey(EncryptionLevel level) { if (!connection()->version().KnowsWhichDecrypterToUse()) { return;
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index d849743..6067c8d 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -153,6 +153,7 @@ std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override; void BeforeConnectionCloseSent() override {} bool ValidateToken(absl::string_view token) const override; + void MaybeSendAddressToken() override; // QuicStreamFrameDataProducer WriteStreamDataResult WriteStreamData(QuicStreamId id,
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h index 50afd2d..428d695 100644 --- a/quic/test_tools/quic_test_utils.h +++ b/quic/test_tools/quic_test_utils.h
@@ -599,6 +599,7 @@ (override)); MOCK_METHOD(void, BeforeConnectionCloseSent, (), (override)); MOCK_METHOD(bool, ValidateToken, (absl::string_view), (const, override)); + MOCK_METHOD(void, MaybeSendAddressToken, (), (override)); }; class MockQuicConnectionHelper : public QuicConnectionHelperInterface {
diff --git a/quic/test_tools/simulator/quic_endpoint.h b/quic/test_tools/simulator/quic_endpoint.h index fd2fa06..de755f0 100644 --- a/quic/test_tools/simulator/quic_endpoint.h +++ b/quic/test_tools/simulator/quic_endpoint.h
@@ -106,6 +106,7 @@ bool ValidateToken(absl::string_view /*token*/) const override { return true; } + void MaybeSendAddressToken() override {} // End QuicConnectionVisitorInterface implementation.