gfe-relnote: In TLS client handshaker, call OnHandshakeComplete when handshake is finished. Protected by existing FLAGS_quic_supports_tls_handshake.
PiperOrigin-RevId: 265538864
Change-Id: I8443c4969b06a343183daaf5afdb804336718710
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 4e3b40b..3e8f834 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -778,9 +778,7 @@
// confirmed.
if (level == ENCRYPTION_FORWARD_SECURE &&
perspective_ == Perspective::IS_SERVER) {
- sent_packet_manager_.SetHandshakeConfirmed();
- // This may have changed the retransmission timer, so re-arm it.
- SetRetransmissionAlarm();
+ OnHandshakeComplete();
}
}
@@ -3716,6 +3714,7 @@
void QuicConnection::SendAllPendingAcks() {
DCHECK(SupportsMultiplePacketNumberSpaces());
QUIC_DVLOG(1) << ENDPOINT << "Trying to send all pending ACKs";
+ ack_alarm_->Cancel();
// Latches current encryption level.
const EncryptionLevel current_encryption_level = encryption_level_;
for (int8_t i = INITIAL_DATA; i <= APPLICATION_DATA; ++i) {
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index c20a3ef..6a5062a 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -533,9 +533,10 @@
// ack_frame().
const QuicFrame GetUpdatedAckFrame();
- // Called by the crypto stream when the handshake completes. In the server's
- // case this is when the SHLO has been ACKed. Clients call this on receipt of
- // the SHLO.
+ // Called when the handshake completes. On the client side, handshake
+ // completes on receipt of SHLO. On the server side, handshake completes when
+ // SHLO gets ACKed (or a forward secure packet gets decrypted successfully).
+ // TODO(fayang): Add a guard that this only gets called once.
void OnHandshakeComplete();
// Accessors
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc
index 3623901..f362f1a 100644
--- a/quic/core/tls_client_handshaker.cc
+++ b/quic/core/tls_client_handshaker.cc
@@ -303,6 +303,7 @@
handshake_confirmed_ = true;
session()->OnCryptoHandshakeEvent(QuicSession::ENCRYPTION_ESTABLISHED);
session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED);
+ session()->connection()->OnHandshakeComplete();
}
enum ssl_verify_result_t TlsClientHandshaker::VerifyCert(uint8_t* out_alert) {
diff --git a/quic/core/tls_handshaker_test.cc b/quic/core/tls_handshaker_test.cc
index 35efa9f..00c62d6 100644
--- a/quic/core/tls_handshaker_test.cc
+++ b/quic/core/tls_handshaker_test.cc
@@ -317,6 +317,9 @@
};
TEST_F(TlsHandshakerTest, CryptoHandshake) {
+ EXPECT_FALSE(client_conn_->IsHandshakeConfirmed());
+ EXPECT_FALSE(server_conn_->IsHandshakeConfirmed());
+
EXPECT_CALL(*client_conn_, CloseConnection(_, _, _)).Times(0);
EXPECT_CALL(*server_conn_, CloseConnection(_, _, _)).Times(0);
EXPECT_CALL(client_session_,
@@ -332,6 +335,8 @@
EXPECT_TRUE(client_stream_->encryption_established());
EXPECT_TRUE(server_stream_->handshake_confirmed());
EXPECT_TRUE(server_stream_->encryption_established());
+ EXPECT_TRUE(client_conn_->IsHandshakeConfirmed());
+ EXPECT_FALSE(server_conn_->IsHandshakeConfirmed());
}
TEST_F(TlsHandshakerTest, HandshakeWithAsyncProofSource) {