summaryrefslogtreecommitdiffstats
path: root/ssl
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2023-09-08 13:07:04 +0100
committerHugo Landau <hlandau@openssl.org>2024-02-02 11:49:34 +0000
commita0a3a94912dc0eed52fe9dce403065760c380030 (patch)
treee4b6eb14f415815647ce6ddc7f50d911463abe66 /ssl
parentda6a9a2e336e217dd4bf239078868c8e00ecdcd3 (diff)
QLOG: Events: Implement connectivity:connection_closed
Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Neil Horman <nhorman@openssl.org> (Merged from https://github.com/openssl/openssl/pull/22037)
Diffstat (limited to 'ssl')
-rw-r--r--ssl/quic/qlog_event_helpers.c74
-rw-r--r--ssl/quic/quic_channel.c2
2 files changed, 76 insertions, 0 deletions
diff --git a/ssl/quic/qlog_event_helpers.c b/ssl/quic/qlog_event_helpers.c
index 66157fe444..d8deac6e02 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 0cd9df1b2c..9e8f30bf1e 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