From: Hugo Landau Date: Tue, 22 Nov 2022 13:28:24 +0000 (+0000) Subject: QUIC QRX: (Server support) Add support for manual URXE injection X-Git-Tag: openssl-3.2.0-alpha1~1440 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e392f601db9a5a131d0db8fa3fa2e3808d2770a;p=thirdparty%2Fopenssl.git QUIC QRX: (Server support) Add support for manual URXE injection Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/19734) --- diff --git a/include/internal/quic_record_rx.h b/include/internal/quic_record_rx.h index a72fb249728..95c0fa56351 100644 --- a/include/internal/quic_record_rx.h +++ b/include/internal/quic_record_rx.h @@ -321,6 +321,15 @@ int ossl_qrx_set_early_validation_cb(OSSL_QRX *qrx, ossl_qrx_early_validation_cb *cb, void *cb_arg); +/* + * Forcibly injects a URXE which has been issued by the DEMUX into the QRX for + * processing. This can be used to pass a received datagram to the QRX if it + * would not be correctly routed to the QRX via standard DCID-based routing; for + * example, when handling an incoming Initial packet which is attempting to + * establish a new connection. + */ +void ossl_qrx_inject_urxe(OSSL_QRX *qrx, QUIC_URXE *e); + /* * Key Update (RX) * =============== diff --git a/ssl/quic/quic_record_rx.c b/ssl/quic/quic_record_rx.c index 18a2428b6b6..cf9f960c3db 100644 --- a/ssl/quic/quic_record_rx.c +++ b/ssl/quic/quic_record_rx.c @@ -217,10 +217,8 @@ void ossl_qrx_free(OSSL_QRX *qrx) OPENSSL_free(qrx); } -static void qrx_on_rx(QUIC_URXE *urxe, void *arg) +void ossl_qrx_inject_urxe(OSSL_QRX *qrx, QUIC_URXE *urxe) { - OSSL_QRX *qrx = arg; - /* Initialize our own fields inside the URXE and add to the pending list. */ urxe->processed = 0; urxe->hpr_removed = 0; @@ -228,6 +226,12 @@ static void qrx_on_rx(QUIC_URXE *urxe, void *arg) ossl_list_urxe_insert_tail(&qrx->urx_pending, urxe); } +static void qrx_on_rx(QUIC_URXE *urxe, void *arg) +{ + OSSL_QRX *qrx = arg; + ossl_qrx_inject_urxe(qrx, urxe); +} + int ossl_qrx_add_dst_conn_id(OSSL_QRX *qrx, const QUIC_CONN_ID *dst_conn_id) {