Clear queued undecryptable packets on handshake complete rather than check encryption_level. Protected by FLAGS_quic_reloadable_flag_quic_clear_undecryptable_packets_on_handshake_complete. PiperOrigin-RevId: 395252247
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 170a206..9e0c95e 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -4467,10 +4467,17 @@ iter = undecryptable_packets_.erase(iter); } - // Once forward secure encryption is in use, there will be no - // new keys installed and hence any undecryptable packets will - // never be able to be decrypted. - if (encryption_level_ == ENCRYPTION_FORWARD_SECURE) { + // Once handshake is complete, there will be no new keys installed and hence + // any undecryptable packets will never be able to be decrypted. + bool clear_undecryptable_packets = + encryption_level_ == ENCRYPTION_FORWARD_SECURE; + if (GetQuicReloadableFlag( + quic_clear_undecryptable_packets_on_handshake_complete)) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_clear_undecryptable_packets_on_handshake_complete); + clear_undecryptable_packets = IsHandshakeComplete(); + } + if (clear_undecryptable_packets) { if (debug_visitor_ != nullptr) { for (const auto& undecryptable_packet : undecryptable_packets_) { debug_visitor_->OnUndecryptablePacket(
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h index 7e85017..423401a 100644 --- a/quic/core/quic_flags_list.h +++ b/quic/core/quic_flags_list.h
@@ -39,6 +39,8 @@ QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_allow_client_enabled_bbr_v2, false) // If true, avoid calling reloadable flags in QuicVersionManager constructor by lazily initializing internal state. QUIC_FLAG(FLAGS_quic_restart_flag_quic_lazy_quic_version_manager, false) +// If true, clear undecryptable packets on handshake complete. +QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_clear_undecryptable_packets_on_handshake_complete, true) // If true, close read side but not write side in QuicSpdyStream::OnStreamReset(). QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_fix_on_stream_reset, true) // If true, default on PTO which unifies TLP + RTO loss recovery.