From a0a3a94912dc0eed52fe9dce403065760c380030 Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Fri, 8 Sep 2023 13:07:04 +0100 Subject: [PATCH] QLOG: Events: Implement connectivity:connection_closed Reviewed-by: Matt Caswell Reviewed-by: Neil Horman (Merged from https://github.com/openssl/openssl/pull/22037) --- include/internal/qlog_event_helpers.h | 5 ++ include/internal/qlog_events.h | 1 + ssl/quic/qlog_event_helpers.c | 74 +++++++++++++++++++++++++++ ssl/quic/quic_channel.c | 2 + 4 files changed, 82 insertions(+) diff --git a/include/internal/qlog_event_helpers.h b/include/internal/qlog_event_helpers.h index de9022659ee..4a19a79e252 100644 --- a/include/internal/qlog_event_helpers.h +++ b/include/internal/qlog_event_helpers.h @@ -13,6 +13,7 @@ # include # include "internal/qlog.h" # include "internal/quic_types.h" +# include "internal/quic_channel.h" /* connectivity:connection_started */ void ossl_qlog_event_connectivity_connection_started(QLOG *qlog, @@ -25,4 +26,8 @@ void ossl_qlog_event_connectivity_connection_state_updated(QLOG *qlog, int handshake_complete, int handshake_confirmed); +/* connectivity:connection_closed */ +void ossl_qlog_event_connectivity_connection_closed(QLOG *qlog, + const QUIC_TERMINATE_CAUSE *tcause); + #endif diff --git a/include/internal/qlog_events.h b/include/internal/qlog_events.h index 83c7c4276fb..ec365c00098 100644 --- a/include/internal/qlog_events.h +++ b/include/internal/qlog_events.h @@ -8,4 +8,5 @@ */ QLOG_EVENT(connectivity, connection_started) QLOG_EVENT(connectivity, connection_state_updated) +QLOG_EVENT(connectivity, connection_closed) QLOG_EVENT(transport, parameters_set) diff --git a/ssl/quic/qlog_event_helpers.c b/ssl/quic/qlog_event_helpers.c index 66157fe444e..d8deac6e02e 100644 --- a/ssl/quic/qlog_event_helpers.c +++ b/ssl/quic/qlog_event_helpers.c @@ -10,6 +10,7 @@ #include "internal/qlog_event_helpers.h" #include "internal/common.h" #include "internal/quic_channel.h" +#include "internal/quic_error.h" void ossl_qlog_event_connectivity_connection_started(QLOG *qlog, const QUIC_CONN_ID *init_dcid) @@ -71,3 +72,76 @@ void ossl_qlog_event_connectivity_connection_state_updated(QLOG *qlog, QLOG_EVENT_END() #endif } + +#ifndef OPENSSL_NO_QLOG +static const char *quic_err_to_qlog(uint64_t error_code) +{ + switch (error_code) { + case QUIC_ERR_INTERNAL_ERROR: + return "internal_error"; + case QUIC_ERR_CONNECTION_REFUSED: + return "connection_refused"; + case QUIC_ERR_FLOW_CONTROL_ERROR: + return "flow_control_error"; + case QUIC_ERR_STREAM_LIMIT_ERROR: + return "stream_limit_error"; + case QUIC_ERR_STREAM_STATE_ERROR: + return "stream_state_error"; + case QUIC_ERR_FINAL_SIZE_ERROR: + return "final_size_error"; + case QUIC_ERR_FRAME_ENCODING_ERROR: + return "frame_encoding_error"; + case QUIC_ERR_TRANSPORT_PARAMETER_ERROR: + return "transport_parameter_error"; + case QUIC_ERR_CONNECTION_ID_LIMIT_ERROR: + return "connection_id_limit_error"; + case QUIC_ERR_PROTOCOL_VIOLATION: + return "protocol_violation"; + case QUIC_ERR_INVALID_TOKEN: + return "invalid_token"; + case QUIC_ERR_APPLICATION_ERROR: + return "application_error"; + case QUIC_ERR_CRYPTO_BUFFER_EXCEEDED: + return "crypto_buffer_exceeded"; + case QUIC_ERR_KEY_UPDATE_ERROR: + return "key_update_error"; + case QUIC_ERR_AEAD_LIMIT_REACHED: + return "aead_limit_reached"; + case QUIC_ERR_NO_VIABLE_PATH: + return "no_viable_path"; + default: + return NULL; + } +} +#endif + +void ossl_qlog_event_connectivity_connection_closed(QLOG *qlog, + const QUIC_TERMINATE_CAUSE *tcause) +{ +#ifndef OPENSSL_NO_QLOG + QLOG_EVENT_BEGIN(qlog, connectivity, connection_closed) + QLOG_STR("owner", tcause->remote ? "remote" : "local"); + if (tcause->app) { + QLOG_U64("application_code", tcause->error_code); + } else { + const char *m = quic_err_to_qlog(tcause->error_code); + char ce[32]; + + if (tcause->error_code >= QUIC_ERR_CRYPTO_ERR_BEGIN + && tcause->error_code <= QUIC_ERR_CRYPTO_ERR_END) { + snprintf(ce, sizeof(ce), "crypto_error_0x%03llx", + (unsigned long long)tcause->error_code); + m = ce; + } + /* TODO(QLOG): Consider adding ERR information in the output. */ + + if (m != NULL) + QLOG_STR("connection_code", m); + else + QLOG_U64("connection_code", tcause->error_code); + } + + QLOG_STR_LEN("reason", tcause->reason, tcause->reason_len); + QLOG_EVENT_END() +#endif +} diff --git a/ssl/quic/quic_channel.c b/ssl/quic/quic_channel.c index 0cd9df1b2c6..9e8f30bf1eb 100644 --- a/ssl/quic/quic_channel.c +++ b/ssl/quic/quic_channel.c @@ -2822,6 +2822,8 @@ static void ch_start_terminating(QUIC_CHANNEL *ch, case QUIC_CHANNEL_STATE_ACTIVE: copy_tcause(&ch->terminate_cause, tcause); + ossl_qlog_event_connectivity_connection_closed(ch_get_qlog(ch), tcause); + if (!force_immediate) { ch_record_state_transition(ch, tcause->remote ? QUIC_CHANNEL_STATE_TERMINATING_DRAINING -- 2.47.2