From: Matt Caswell Date: Fri, 5 May 2023 13:46:01 +0000 (+0100) Subject: Extend tracing of frames to transmitted frames X-Git-Tag: openssl-3.2.0-alpha1~765 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45454cccf8172b5a2d7c1342067a1d8dc8396fc9;p=thirdparty%2Fopenssl.git Extend tracing of frames to transmitted frames Previously we were only doing tracing of frames received from the peer. Now we do that for transmitted frames as well. Reviewed-by: Tomas Mraz Reviewed-by: Hugo Landau (Merged from https://github.com/openssl/openssl/pull/20914) --- diff --git a/include/internal/quic_txp.h b/include/internal/quic_txp.h index 0e4fd5cc49d..54c25754eb8 100644 --- a/include/internal/quic_txp.h +++ b/include/internal/quic_txp.h @@ -49,6 +49,11 @@ typedef struct ossl_quic_tx_packetiser_args_st { OSSL_TIME (*now)(void *arg); /* Callback to get current time. */ void *now_arg; + /* Message callback related arguments */ + ossl_msg_cb msg_callback; + void *msg_callback_arg; + SSL *msg_callback_s; + /* * Injected dependencies - crypto streams. * diff --git a/ssl/quic/quic_channel.c b/ssl/quic/quic_channel.c index 2f655f61cdd..cb24bd0c1ae 100644 --- a/ssl/quic/quic_channel.c +++ b/ssl/quic/quic_channel.c @@ -208,6 +208,11 @@ static int ch_init(QUIC_CHANNEL *ch) txp_args.cc_data = ch->cc_data; txp_args.now = get_time; txp_args.now_arg = ch; + /* Callback related arguments */ + txp_args.msg_callback = ch->msg_callback; + txp_args.msg_callback_arg = ch->msg_callback_arg; + txp_args.msg_callback_s = ch->msg_callback_s; + for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) { ch->crypto_send[pn_space] = ossl_quic_sstream_new(INIT_CRYPTO_BUF_LEN); if (ch->crypto_send[pn_space] == NULL) diff --git a/ssl/quic/quic_txp.c b/ssl/quic/quic_txp.c index a1341d8b13e..b8bfb3592ea 100644 --- a/ssl/quic/quic_txp.c +++ b/ssl/quic/quic_txp.c @@ -301,6 +301,28 @@ static int tx_helper_commit(struct tx_helper *h) return 0; } + if (h->txp->args.msg_callback != NULL && l > 0) { + uint64_t ftype; + int ctype = SSL3_RT_QUIC_FRAME_FULL; + PACKET pkt; + + if (!PACKET_buf_init(&pkt, h->txn.data, l) + || !ossl_quic_wire_peek_frame_header(&pkt, &ftype)) { + tx_helper_end(h, 0); + return 0; + } + + if (ftype == OSSL_QUIC_FRAME_TYPE_PADDING) + ctype = SSL3_RT_QUIC_FRAME_PADDING; + else if (OSSL_QUIC_FRAME_TYPE_IS_STREAM(ftype) + || ftype == OSSL_QUIC_FRAME_TYPE_CRYPTO) + ctype = SSL3_RT_QUIC_FRAME_HEADER; + + h->txp->args.msg_callback(1, OSSL_QUIC1_VERSION, ctype, h->txn.data, l, + h->txp->args.msg_callback_s, + h->txp->args.msg_callback_arg); + } + h->scratch_bytes += l; tx_helper_end(h, 1); return 1;