gfe-relnote: In QUIC, let connection determine handshake confirmed by asking session and stop marking HANDSHAKE_CONFIRMED in sent packet manager. Not affecting prod, not protected.
PiperOrigin-RevId: 291006942
Change-Id: I1caf90ff1dfe638126fdff1fd65abcab48246c46
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 7ba472a..754db3a 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -2480,8 +2480,7 @@
}
char* QuicConnection::GetPacketBuffer() {
- if (version().CanSendCoalescedPackets() &&
- sent_packet_manager_.handshake_state() < HANDSHAKE_CONFIRMED) {
+ if (version().CanSendCoalescedPackets() && !IsHandshakeConfirmed()) {
// Do not use writer's packet buffer for coalesced packets which may contain
// multiple QUIC packets.
return nullptr;
@@ -4025,8 +4024,7 @@
SerializedPacketFate QuicConnection::DeterminePacketFate(
bool is_mtu_discovery) {
- if (version().CanSendCoalescedPackets() &&
- sent_packet_manager_.handshake_state() < HANDSHAKE_CONFIRMED &&
+ if (version().CanSendCoalescedPackets() && !IsHandshakeConfirmed() &&
!is_mtu_discovery) {
// Before receiving ACK for any 1-RTT packets, always try to coalesce
// packet (except MTU discovery packet).
@@ -4042,6 +4040,11 @@
return SEND_TO_WRITER;
}
+bool QuicConnection::IsHandshakeConfirmed() const {
+ DCHECK_EQ(PROTOCOL_TLS1_3, version().handshake_protocol);
+ return visitor_->GetHandshakeState() == HANDSHAKE_CONFIRMED;
+}
+
size_t QuicConnection::min_received_before_ack_decimation() const {
return uber_received_packet_manager_.min_received_before_ack_decimation();
}
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 23910e5..ef09e01 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -875,6 +875,9 @@
return sent_packet_manager_.handshake_state() >= HANDSHAKE_COMPLETE;
}
+ // Whether peer completes handshake. Only used with TLS handshake.
+ bool IsHandshakeConfirmed() const;
+
// Returns the largest received packet number sent by peer.
QuicPacketNumber GetLargestReceivedPacket() const;
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 9441e86..fc51c79 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -1076,7 +1076,8 @@
.WillRepeatedly(Return(QuicTime::Zero()));
EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _, _))
.Times(AnyNumber());
-
+ EXPECT_CALL(visitor_, GetHandshakeState())
+ .WillRepeatedly(Return(HANDSHAKE_START));
if (connection_.version().KnowsWhichDecrypterToUse()) {
connection_.InstallDecrypter(
ENCRYPTION_FORWARD_SECURE,
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index 81bbbec..a6b3cab 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -1233,9 +1233,6 @@
return PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE;
}
last_ack_frame_.packets.Add(acked_packet.packet_number);
- if (info->encryption_level == ENCRYPTION_FORWARD_SECURE) {
- handshake_state_ = HANDSHAKE_CONFIRMED;
- }
largest_packet_peer_knows_is_acked_.UpdateMax(info->largest_acked);
if (supports_multiple_packet_number_spaces()) {
largest_packets_peer_knows_is_acked_[packet_number_space].UpdateMax(
diff --git a/quic/core/quic_sent_packet_manager.h b/quic/core/quic_sent_packet_manager.h
index 69a4d23..62c8b64 100644
--- a/quic/core/quic_sent_packet_manager.h
+++ b/quic/core/quic_sent_packet_manager.h
@@ -577,9 +577,7 @@
PacingSender pacing_sender_;
// Indicates current handshake state.
- // TODO(fayang): Stop inferring handshake state, instead, retrieve handshake
- // state from SessionNotifier::GetHandshakeState and use this variable purely
- // for performance purpose.
+ // TODO(fayang): Change this to a bool.
HandshakeState handshake_state_;
// Records bandwidth from server to client in normal operation, over periods
diff --git a/quic/core/quic_sent_packet_manager_test.cc b/quic/core/quic_sent_packet_manager_test.cc
index 25102a0..f007562 100644
--- a/quic/core/quic_sent_packet_manager_test.cc
+++ b/quic/core/quic_sent_packet_manager_test.cc
@@ -2851,42 +2851,6 @@
EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
}
-TEST_F(QuicSentPacketManagerTest, ForwardSecurePacketAcked) {
- EXPECT_LT(manager_.handshake_state(), HANDSHAKE_CONFIRMED);
- SendDataPacket(1, ENCRYPTION_INITIAL);
- // Ack packet 1.
- ExpectAck(1);
- manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
- clock_.Now());
- manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
- EXPECT_EQ(PACKETS_NEWLY_ACKED,
- manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
- ENCRYPTION_INITIAL));
- EXPECT_LT(manager_.handshake_state(), HANDSHAKE_CONFIRMED);
-
- SendDataPacket(2, ENCRYPTION_ZERO_RTT);
- // Ack packet 2.
- ExpectAck(2);
- manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
- clock_.Now());
- manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
- EXPECT_EQ(PACKETS_NEWLY_ACKED,
- manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
- ENCRYPTION_FORWARD_SECURE));
- EXPECT_LT(manager_.handshake_state(), HANDSHAKE_CONFIRMED);
-
- SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
- // Ack packet 3.
- ExpectAck(3);
- manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
- clock_.Now());
- manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
- EXPECT_EQ(PACKETS_NEWLY_ACKED,
- manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
- ENCRYPTION_FORWARD_SECURE));
- EXPECT_EQ(manager_.handshake_state(), HANDSHAKE_CONFIRMED);
-}
-
TEST_F(QuicSentPacketManagerTest, PtoTimeoutIncludesMaxAckDelay) {
EnablePto(k1PTO);
// Use PTOS and PTOA.