Add QuicConnection::HaveSentPacketsInCurrentKeyPhaseButNoneAcked method.
PiperOrigin-RevId: 338581332
Change-Id: Id473128041ea65d776fc63a4c25dc3077503856a
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 91e3ea0..71bb8be 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -3715,6 +3715,12 @@
GetLargestAckedPacket() >= lowest_packet_sent_in_current_key_phase_;
}
+bool QuicConnection::HaveSentPacketsInCurrentKeyPhaseButNoneAcked() const {
+ return lowest_packet_sent_in_current_key_phase_.IsInitialized() &&
+ (!GetLargestAckedPacket().IsInitialized() ||
+ GetLargestAckedPacket() < lowest_packet_sent_in_current_key_phase_);
+}
+
bool QuicConnection::InitiateKeyUpdate(KeyUpdateReason reason) {
QUIC_DLOG(INFO) << ENDPOINT << "InitiateKeyUpdate";
if (!IsKeyUpdateAllowed()) {
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 376c623..a3da511 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -824,6 +824,10 @@
// Returns true if it is currently allowed to initiate a key update.
bool IsKeyUpdateAllowed() const;
+ // Returns true if packets have been sent in the current 1-RTT key phase but
+ // none of these packets have been acked.
+ bool HaveSentPacketsInCurrentKeyPhaseButNoneAcked() const;
+
// Increment the key phase. It is a bug to call this when IsKeyUpdateAllowed()
// is false. Returns false on error.
bool InitiateKeyUpdate(KeyUpdateReason reason);
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 0b94236..02c716f 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -12151,6 +12151,7 @@
// Key update should still not be allowed, since no packet has been acked
// from the current key phase.
EXPECT_FALSE(connection_.IsKeyUpdateAllowed());
+ EXPECT_FALSE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Send packet 1.
QuicPacketNumber last_packet;
@@ -12160,6 +12161,7 @@
// Key update should still not be allowed, even though a packet was sent in
// the current key phase it hasn't been acked yet.
EXPECT_FALSE(connection_.IsKeyUpdateAllowed());
+ EXPECT_TRUE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
EXPECT_FALSE(connection_.GetDiscardPreviousOneRttKeysAlarm()->IsSet());
// Receive ack for packet 1.
@@ -12170,6 +12172,7 @@
// OnDecryptedFirstPacketInKeyPhase is called even on the first key phase,
// so discard_previous_keys_alarm_ should be set now.
EXPECT_TRUE(connection_.GetDiscardPreviousOneRttKeysAlarm()->IsSet());
+ EXPECT_FALSE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Key update should now be allowed.
EXPECT_CALL(visitor_, AdvanceKeysAndCreateCurrentOneRttDecrypter())
@@ -12184,6 +12187,7 @@
// key phase has been received. (The alarm that was set above should be
// cleared if it hasn't fired before the next key update happened.)
EXPECT_FALSE(connection_.GetDiscardPreviousOneRttKeysAlarm()->IsSet());
+ EXPECT_FALSE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Pretend that peer accepts the key update.
EXPECT_CALL(peer_framer_visitor_,
@@ -12201,11 +12205,13 @@
// Send packet 2.
SendStreamDataToPeer(2, "bar", 0, NO_FIN, &last_packet);
EXPECT_EQ(QuicPacketNumber(2u), last_packet);
+ EXPECT_TRUE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Receive ack for packet 2.
EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
QuicAckFrame frame2 = InitAckFrame(2);
ProcessAckPacket(&frame2);
EXPECT_TRUE(connection_.GetDiscardPreviousOneRttKeysAlarm()->IsSet());
+ EXPECT_FALSE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Key update should be allowed again now that a packet has been acked from
// the current key phase.
@@ -12236,12 +12242,14 @@
// Another key update should not be allowed yet.
EXPECT_FALSE(connection_.IsKeyUpdateAllowed());
+ EXPECT_TRUE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Receive ack for packet 3.
EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _));
QuicAckFrame frame3 = InitAckFrame(3);
ProcessAckPacket(&frame3);
EXPECT_TRUE(connection_.GetDiscardPreviousOneRttKeysAlarm()->IsSet());
+ EXPECT_FALSE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
// Key update should be allowed now.
EXPECT_CALL(visitor_, AdvanceKeysAndCreateCurrentOneRttDecrypter())
@@ -12253,6 +12261,7 @@
EXPECT_CALL(visitor_, OnKeyUpdate(KeyUpdateReason::kLocalForTests));
EXPECT_TRUE(connection_.InitiateKeyUpdate(KeyUpdateReason::kLocalForTests));
EXPECT_FALSE(connection_.GetDiscardPreviousOneRttKeysAlarm()->IsSet());
+ EXPECT_FALSE(connection_.HaveSentPacketsInCurrentKeyPhaseButNoneAcked());
}
TEST_P(QuicConnectionTest, InitiateKeyUpdateApproachingConfidentialityLimit) {