summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/internal/quic_txp.h5
-rw-r--r--ssl/quic/quic_channel.c5
-rw-r--r--ssl/quic/quic_txp.c22
3 files changed, 32 insertions, 0 deletions
diff --git a/include/internal/quic_txp.h b/include/internal/quic_txp.h
index 0e4fd5cc49..54c25754eb 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 2f655f61cd..cb24bd0c1a 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 a1341d8b13..b8bfb3592e 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;