In quic, include undecryptable packets information in error details when client closes connection with quic_handshake_timeout for debugging purpose. client only, not protected. PiperOrigin-RevId: 317174812 Change-Id: If3b608b81585c188a571ff60c63af01e4e69d0a7
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 38e117b..03f6922 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -2026,6 +2026,18 @@ return true; } +std::string QuicConnection::UndecryptablePacketsInfo() const { + std::string info = quiche::QuicheStrCat( + "num_undecryptable_packets: ", undecryptable_packets_.size(), " {"); + for (const auto& packet : undecryptable_packets_) { + info = quiche::QuicheStrCat( + info, "[", EncryptionLevelToString(packet.encryption_level), ", ", + packet.packet->length(), ", ", packet.processed, "]"); + } + info = quiche::QuicheStrCat(info, "}"); + return info; +} + void QuicConnection::ProcessUdpPacket(const QuicSocketAddress& self_address, const QuicSocketAddress& peer_address, const QuicReceivedPacket& packet) { @@ -4567,10 +4579,14 @@ DCHECK(use_idle_network_detector_); const QuicTime::Delta duration = clock_->ApproximateNow() - stats_.connection_creation_time; - const std::string error_details = quiche::QuicheStrCat( + std::string error_details = quiche::QuicheStrCat( "Handshake timeout expired after ", duration.ToDebuggingValue(), ". Timeout:", idle_network_detector_.handshake_timeout().ToDebuggingValue()); + if (perspective() == Perspective::IS_CLIENT && version().UsesTls()) { + error_details = + quiche::QuicheStrCat(error_details, UndecryptablePacketsInfo()); + } QUIC_DVLOG(1) << ENDPOINT << error_details; CloseConnection(QUIC_HANDSHAKE_TIMEOUT, error_details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index 8f4b113..48d16a2 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -1323,6 +1323,9 @@ bool ShouldEnqueueUnDecryptablePacket(EncryptionLevel decryption_level, bool has_decryption_key) const; + // Returns string which contains undecryptable packets information. + std::string UndecryptablePacketsInfo() const; + QuicFramer framer_; // Contents received in the current packet, especially used to identify