Internal QUICHE change PiperOrigin-RevId: 243129330 Change-Id: If138c05a357c9db30160e31b0238a7d29992ff0f
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc index c9f5fbf..57924ca 100644 --- a/quic/core/quic_dispatcher.cc +++ b/quic/core/quic_dispatcher.cc
@@ -1066,10 +1066,6 @@ << " because of " << result; } -void QuicDispatcher::OnConnectionRejectedStatelessly() {} - -void QuicDispatcher::OnConnectionClosedStatelessly(QuicErrorCode error) {} - bool QuicDispatcher::ShouldAttemptCheapStatelessRejection() { return true; } @@ -1267,7 +1263,8 @@ time_wait_list_manager_.get()); terminator.CloseConnection(QUIC_HANDSHAKE_FAILED, validator.error_details(), form != GOOGLE_QUIC_PACKET); - OnConnectionClosedStatelessly(QUIC_HANDSHAKE_FAILED); + QuicSession::RecordConnectionCloseAtServer( + QUIC_HANDSHAKE_FAILED, ConnectionCloseSource::FROM_SELF); ProcessUnauthenticatedHeaderFate(kFateTimeWait, connection_id, form, version); return; @@ -1372,6 +1369,9 @@ terminator.RejectConnection( rejector->reply().GetSerialized().AsStringPiece(), form != GOOGLE_QUIC_PACKET); + QuicSession::RecordConnectionCloseAtServer( + QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, + ConnectionCloseSource::FROM_SELF); OnConnectionRejectedStatelessly(); fate = kFateTimeWait; break;
diff --git a/quic/core/quic_dispatcher.h b/quic/core/quic_dispatcher.h index 3329405..62b7ebb 100644 --- a/quic/core/quic_dispatcher.h +++ b/quic/core/quic_dispatcher.h
@@ -202,10 +202,7 @@ const ParsedQuicVersion& version) = 0; // Called when a connection is rejected statelessly. - virtual void OnConnectionRejectedStatelessly(); - - // Called when a connection is closed statelessly. - virtual void OnConnectionClosedStatelessly(QuicErrorCode error); + virtual void OnConnectionRejectedStatelessly() {} // Returns true if cheap stateless rejection should be attempted. virtual bool ShouldAttemptCheapStatelessRejection();
diff --git a/quic/core/quic_error_codes.h b/quic/core/quic_error_codes.h index 9954134..2004a08 100644 --- a/quic/core/quic_error_codes.h +++ b/quic/core/quic_error_codes.h
@@ -7,6 +7,7 @@ #include <cstdint> #include <limits> +#include <string> #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" @@ -349,6 +350,16 @@ // Returns the name of the QuicErrorCode as a char* QUIC_EXPORT const char* QuicErrorCodeToString(QuicErrorCode error); +QUIC_EXPORT_PRIVATE inline std::string HistogramEnumString( + QuicErrorCode enum_value) { + return QuicErrorCodeToString(enum_value); +} + +QUIC_EXPORT_PRIVATE inline std::string HistogramEnumDescription( + QuicErrorCode dummy) { + return "cause"; +} + } // namespace quic #endif // QUICHE_QUIC_CORE_QUIC_ERROR_CODES_H_
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index 01d6feb..d857572 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -16,6 +16,7 @@ #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" #include "net/third_party/quiche/src/quic/platform/api/quic_map_util.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_server_stats.h" #include "net/third_party/quiche/src/quic/platform/api/quic_stack_trace.h" #include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" @@ -288,10 +289,30 @@ << ", " << message; } +// static +void QuicSession::RecordConnectionCloseAtServer(QuicErrorCode error, + ConnectionCloseSource source) { + if (error != QUIC_NO_ERROR) { + if (source == ConnectionCloseSource::FROM_SELF) { + QUIC_SERVER_HISTOGRAM_ENUM( + "quic_server_connection_close_errors", error, QUIC_LAST_ERROR, + "QuicErrorCode for server-closed connections."); + } else { + QUIC_SERVER_HISTOGRAM_ENUM( + "quic_client_connection_close_errors", error, QUIC_LAST_ERROR, + "QuicErrorCode for client-closed connections."); + } + } +} + void QuicSession::OnConnectionClosed(QuicErrorCode error, const std::string& error_details, ConnectionCloseSource source) { DCHECK(!connection_->connected()); + if (perspective() == Perspective::IS_SERVER) { + RecordConnectionCloseAtServer(error, source); + } + if (error_ == QUIC_NO_ERROR) { error_ = error; }
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index b13f627..a9fb992 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -17,6 +17,7 @@ #include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/core/quic_control_frame_manager.h" #include "net/third_party/quiche/src/quic/core/quic_crypto_stream.h" +#include "net/third_party/quiche/src/quic/core/quic_error_codes.h" #include "net/third_party/quiche/src/quic/core/quic_packet_creator.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" #include "net/third_party/quiche/src/quic/core/quic_stream.h" @@ -401,6 +402,12 @@ QuicStreamOffset bytes_written, bool close_write_side_only); + // Record errors when a connection is closed at the server side, should only + // be called from server's perspective. + // Noop if |error| is QUIC_NO_ERROR. + static void RecordConnectionCloseAtServer(QuicErrorCode error, + ConnectionCloseSource source); + protected: using StaticStreamMap = QuicSmallMap<QuicStreamId, QuicStream*, 2>;