summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/internal/quic_record_rx.h32
-rw-r--r--include/internal/quic_record_rx_wrap.h43
-rw-r--r--include/internal/quic_sf_list.h6
-rw-r--r--include/internal/quic_stream.h5
-rw-r--r--ssl/quic/build.info5
-rw-r--r--ssl/quic/quic_record_rx.c49
-rw-r--r--ssl/quic/quic_record_rx_wrap.c65
-rw-r--r--ssl/quic/quic_rstream.c8
-rw-r--r--ssl/quic/quic_rx_depack.c30
-rw-r--r--ssl/quic/quic_sf_list.c20
-rw-r--r--test/quic_record_test.c16
-rw-r--r--test/quic_stream_test.c4
-rw-r--r--test/quic_txp_test.c22
13 files changed, 105 insertions, 200 deletions
diff --git a/include/internal/quic_record_rx.h b/include/internal/quic_record_rx.h
index 53b7b7f458..6df4013533 100644
--- a/include/internal/quic_record_rx.h
+++ b/include/internal/quic_record_rx.h
@@ -197,9 +197,6 @@ int ossl_qrx_discard_enc_level(OSSL_QRX *qrx, uint32_t enc_level);
/* Information about a received packet. */
typedef struct ossl_qrx_pkt_st {
- /* Opaque handle to be passed to ossl_qrx_release_pkt. */
- void *handle;
-
/*
* Points to a logical representation of the decoded QUIC packet header. The
* data and len fields point to the decrypted QUIC payload (i.e., to a
@@ -236,26 +233,35 @@ typedef struct ossl_qrx_pkt_st {
* using a now() function.
*/
OSSL_TIME time;
+
+ /* The QRX which was used to receive the packet. */
+ OSSL_QRX *qrx;
} OSSL_QRX_PKT;
/*
* Tries to read a new decrypted packet from the QRX.
*
- * On success, all fields of *pkt are filled and 1 is returned.
- * Else, returns 0.
+ * On success, *pkt points to a OSSL_QRX_PKT structure. The structure should be
+ * freed when no longer needed by calling ossl_qrx_pkt_release(). The structure
+ * is refcounted; to gain extra references, call ossl_qrx_pkt_ref(). This will
+ * cause a corresponding number of calls to ossl_qrx_pkt_release() to be
+ * ignored.
+ *
+ * The resources referenced by (*pkt)->hdr, (*pkt)->hdr->data and (*pkt)->peer
+ * have the same lifetime as *pkt.
*
- * The resources referenced by pkt->hdr, pkt->hdr->data and pkt->peer will
- * remain allocated at least until the user frees them by calling
- * ossl_qrx_release_pkt, which must be called once you are done with the packet.
+ * Returns 1 on success and 0 on failure.
*/
-int ossl_qrx_read_pkt(OSSL_QRX *qrx, OSSL_QRX_PKT *pkt);
+int ossl_qrx_read_pkt(OSSL_QRX *qrx, OSSL_QRX_PKT **pkt);
/*
- * Release the resources pointed to by an OSSL_QRX_PKT returned by
- * ossl_qrx_read_pkt. Pass the opaque value pkt->handle returned in the
- * structure.
+ * Decrement the reference count for the given packet and frees it if the
+ * reference count drops to zero. No-op if pkt is NULL.
*/
-void ossl_qrx_release_pkt(OSSL_QRX *qrx, void *handle);
+void ossl_qrx_pkt_release(OSSL_QRX_PKT *pkt);
+
+/* Increments the reference count for the given packet. */
+void ossl_qrx_pkt_up_ref(OSSL_QRX_PKT *pkt);
/*
* Returns 1 if there are any already processed (i.e. decrypted) packets waiting
diff --git a/include/internal/quic_record_rx_wrap.h b/include/internal/quic_record_rx_wrap.h
deleted file mode 100644
index c19f058db3..0000000000
--- a/include/internal/quic_record_rx_wrap.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
- *
- * Licensed under the Apache License 2.0 (the "License"). You may not use
- * this file except in compliance with the License. You can obtain a copy
- * in the file LICENSE in the source distribution or at
- * https://www.openssl.org/source/license.html
- */
-
-#ifndef OSSL_QUIC_RECORD_RX_WRAP_H
-# define OSSL_QUIC_RECORD_RX_WRAP_H
-
-# include <openssl/crypto.h>
-# include "internal/refcount.h"
-# include "internal/quic_record_rx.h"
-
-/*
- * OSSL_QRX_PKT handle wrapper for counted references
- * ==================================================
- *
- * When OSSL_QRX_PKT handles need to be put "in the wild", there may be
- * multiple references, which must be accounted for so that the OSSL_QRX_PKT
- * data isn't prematurely destroyed.
- * The OSSL_QRX_PKT itself is less important for reference counting, since
- * its handle contains references to all important data.
- *
- * The wrapper is created by ossl_quic_depacketize().
- * Consumers must call ossl_qrx_pkt_wrap_up_ref() as they grab a reference,
- * and must call ossl_qrx_pkt_wrap_release() when letting go of a reference.
- */
-
-typedef struct ossl_qrx_pkt_wrap_st {
- void *handle; /* This is a copy of |pkt->handle| */
- OSSL_QRX_PKT *pkt;
- CRYPTO_REF_COUNT references;
- CRYPTO_RWLOCK *lock; /* For reference counting without atomic */
-} OSSL_QRX_PKT_WRAP;
-
-OSSL_QRX_PKT_WRAP *ossl_qrx_pkt_wrap_new(OSSL_QRX_PKT *pkt);
-int ossl_qrx_pkt_wrap_up_ref(OSSL_QRX_PKT_WRAP *pkt_wrap);
-void ossl_qrx_pkt_wrap_free(OSSL_QRX *qrx, OSSL_QRX_PKT_WRAP *pkt_wrap);
-
-#endif
diff --git a/include/internal/quic_sf_list.h b/include/internal/quic_sf_list.h
index 5411cf6abf..483697a4e5 100644
--- a/include/internal/quic_sf_list.h
+++ b/include/internal/quic_sf_list.h
@@ -12,6 +12,7 @@
#include "internal/common.h"
#include "internal/uint_set.h"
+#include "internal/quic_record_rx.h"
/*
* Stream frame list
@@ -38,7 +39,6 @@
typedef struct stream_frame_st STREAM_FRAME;
typedef struct sframe_list_st {
- OSSL_QRX *qrx;
STREAM_FRAME *head, *tail;
/* Is the tail frame final. */
unsigned int fin;
@@ -48,10 +48,10 @@ typedef struct sframe_list_st {
uint64_t offset;
} SFRAME_LIST;
-void ossl_sframe_list_init(SFRAME_LIST *fl, OSSL_QRX *qrx);
+void ossl_sframe_list_init(SFRAME_LIST *fl);
void ossl_sframe_list_destroy(SFRAME_LIST *fl);
int ossl_sframe_list_insert(SFRAME_LIST *fl, UINT_RANGE *range,
- OSSL_QRX_PKT_WRAP *pkt,
+ OSSL_QRX_PKT *pkt,
const unsigned char *data, int fin);
int ossl_sframe_list_peek(const SFRAME_LIST *fl, void **iter,
UINT_RANGE *range, const unsigned char **data,
diff --git a/include/internal/quic_stream.h b/include/internal/quic_stream.h
index cef869b19d..7095cacb72 100644
--- a/include/internal/quic_stream.h
+++ b/include/internal/quic_stream.h
@@ -17,7 +17,6 @@
#include "internal/quic_wire.h"
#include "internal/quic_record_tx.h"
#include "internal/quic_record_rx.h"
-#include "internal/quic_record_rx_wrap.h"
#include "internal/quic_fc.h"
#include "internal/quic_statm.h"
@@ -296,7 +295,7 @@ typedef struct quic_rstream_st QUIC_RSTREAM;
* If they are non-NULL, the `rxfc` is called when receive stream data
* is read by application. `statm` is queried for current rtt.
*/
-QUIC_RSTREAM *ossl_quic_rstream_new(OSSL_QRX *qrx, QUIC_RXFC *rxfc,
+QUIC_RSTREAM *ossl_quic_rstream_new(QUIC_RXFC *rxfc,
OSSL_STATM *statm);
/*
@@ -314,7 +313,7 @@ void ossl_quic_rstream_free(QUIC_RSTREAM *qrs);
* Or to indicate `fin` without any further data added to the stream.
*/
-int ossl_quic_rstream_queue_data(QUIC_RSTREAM *qrs, OSSL_QRX_PKT_WRAP *pkt_wrap,
+int ossl_quic_rstream_queue_data(QUIC_RSTREAM *qrs, OSSL_QRX_PKT *pkt,
uint64_t offset,
const unsigned char *data, uint64_t data_len,
int fin);
diff --git a/ssl/quic/build.info b/ssl/quic/build.info
index 1380112197..0d84df4be3 100644
--- a/ssl/quic/build.info
+++ b/ssl/quic/build.info
@@ -3,10 +3,9 @@ $LIBSSL=../../libssl
SOURCE[$LIBSSL]=quic_method.c quic_impl.c quic_wire.c quic_ackm.c quic_statm.c
SOURCE[$LIBSSL]=cc_dummy.c quic_demux.c quic_record_rx.c
SOURCE[$LIBSSL]=quic_record_tx.c quic_record_util.c quic_record_shared.c quic_wire_pkt.c
-SOURCE[$LIBSSL]=quic_record_rx_wrap.c quic_rx_depack.c
-SOURCE[$LIBSSL]=quic_fc.c uint_set.c quic_sf_list.c quic_rstream.c quic_sstream.c
+SOURCE[$LIBSSL]=quic_rx_depack.c
+SOURCE[$LIBSSL]=quic_fc.c uint_set.c
SOURCE[$LIBSSL]=quic_cfq.c quic_txpim.c quic_fifd.c quic_txp.c
SOURCE[$LIBSSL]=quic_stream_map.c
SOURCE[$LIBSSL]=quic_sf_list.c quic_rstream.c quic_sstream.c
-SOURCE[$LIBSSL]=quic_sf_list.c quic_rstream.c quic_sstream.c
SOURCE[$LIBSSL]=quic_dummy_handshake.c
diff --git a/ssl/quic/quic_record_rx.c b/ssl/quic/quic_record_rx.c
index 5203e818a6..eb975901ed 100644
--- a/ssl/quic/quic_record_rx.c
+++ b/ssl/quic/quic_record_rx.c
@@ -42,7 +42,8 @@ typedef struct rxe_st RXE;
struct rxe_st {
OSSL_LIST_MEMBER(rxe, RXE);
- size_t data_len, alloc_len;
+ OSSL_QRX_PKT pkt;
+ size_t data_len, alloc_len, refcount;
/* Extra fields for per-packet information. */
QUIC_PKT_HDR hdr; /* data/len are decrypted payload */
@@ -329,6 +330,7 @@ static RXE *qrx_alloc_rxe(size_t alloc_len)
ossl_list_rxe_init_elem(rxe);
rxe->alloc_len = alloc_len;
rxe->data_len = 0;
+ rxe->refcount = 0;
return rxe;
}
@@ -414,6 +416,9 @@ static void qrx_recycle_rxe(OSSL_QRX *qrx, RXE *rxe)
{
/* RXE should not be in any list */
assert(ossl_list_rxe_prev(rxe) == NULL && ossl_list_rxe_next(rxe) == NULL);
+ rxe->pkt.hdr = NULL;
+ rxe->pkt.peer = NULL;
+ rxe->pkt.local = NULL;
ossl_list_rxe_insert_tail(&qrx->rx_free, rxe);
}
@@ -1054,7 +1059,7 @@ static int qrx_process_pending_urxl(OSSL_QRX *qrx)
return 1;
}
-int ossl_qrx_read_pkt(OSSL_QRX *qrx, OSSL_QRX_PKT *pkt)
+int ossl_qrx_read_pkt(OSSL_QRX *qrx, OSSL_QRX_PKT **ppkt)
{
RXE *rxe;
@@ -1070,25 +1075,41 @@ int ossl_qrx_read_pkt(OSSL_QRX *qrx, OSSL_QRX_PKT *pkt)
if (!ossl_assert(rxe != NULL))
return 0;
- pkt->handle = rxe;
- pkt->hdr = &rxe->hdr;
- pkt->pn = rxe->pn;
- pkt->time = rxe->time;
- pkt->datagram_len = rxe->datagram_len;
- pkt->peer
+ assert(rxe->refcount == 0);
+ rxe->refcount = 1;
+
+ rxe->pkt.hdr = &rxe->hdr;
+ rxe->pkt.pn = rxe->pn;
+ rxe->pkt.time = rxe->time;
+ rxe->pkt.datagram_len = rxe->datagram_len;
+ rxe->pkt.peer
= BIO_ADDR_family(&rxe->peer) != AF_UNSPEC ? &rxe->peer : NULL;
- pkt->local
+ rxe->pkt.local
= BIO_ADDR_family(&rxe->local) != AF_UNSPEC ? &rxe->local : NULL;
+ rxe->pkt.qrx = qrx;
+ *ppkt = &rxe->pkt;
return 1;
}
-void ossl_qrx_release_pkt(OSSL_QRX *qrx, void *handle)
+void ossl_qrx_pkt_release(OSSL_QRX_PKT *pkt)
{
- if (handle != NULL) {
- RXE *rxe = handle;
+ RXE *rxe;
- qrx_recycle_rxe(qrx, rxe);
- }
+ if (pkt == NULL)
+ return;
+
+ rxe = (RXE *)pkt;
+ assert(rxe->refcount > 0);
+ if (--rxe->refcount == 0)
+ qrx_recycle_rxe(pkt->qrx, rxe);
+}
+
+void ossl_qrx_pkt_up_ref(OSSL_QRX_PKT *pkt)
+{
+ RXE *rxe = (RXE *)pkt;
+
+ assert(rxe->refcount > 0);
+ ++rxe->refcount;
}
uint64_t ossl_qrx_get_bytes_received(OSSL_QRX *qrx, int clear)
diff --git a/ssl/quic/quic_record_rx_wrap.c b/ssl/quic/quic_record_rx_wrap.c
deleted file mode 100644
index 1c98682377..0000000000
--- a/ssl/quic/quic_record_rx_wrap.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
- *
- * Licensed under the Apache License 2.0 (the "License"). You may not use
- * this file except in compliance with the License. You can obtain a copy
- * in the file LICENSE in the source distribution or at
- * https://www.openssl.org/source/license.html
- */
-
-#include "internal/cryptlib.h"
-#include "internal/refcount.h"
-#include "internal/quic_record_rx_wrap.h"
-
-OSSL_QRX_PKT_WRAP *ossl_qrx_pkt_wrap_new(OSSL_QRX_PKT *pkt)
-{
- CRYPTO_RWLOCK *refcount_lock = NULL;
- OSSL_QRX_PKT_WRAP *res = NULL;
-
- if (pkt == NULL)
- return NULL;
-
-#ifdef HAVE_ATOMICS
- refcount_lock = CRYPTO_THREAD_lock_new();
- if (refcount_lock == NULL) {
- ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
- return NULL;
- }
-#endif
-
- if ((res = OPENSSL_zalloc(sizeof(*res))) == NULL) {
- CRYPTO_THREAD_lock_free(refcount_lock);
- return NULL;
- }
-
- res->pkt = pkt;
- res->handle = pkt->handle;
- res->references = 1;
- res->lock = refcount_lock;
-
- return res;
-}
-
-int ossl_qrx_pkt_wrap_up_ref(OSSL_QRX_PKT_WRAP *pkt_wrap)
-{
- int ref = 0;
-
- if (pkt_wrap == NULL || pkt_wrap->pkt == NULL)
- return 0;
- CRYPTO_UP_REF(&pkt_wrap->references, &ref, pkt_wrap->lock);
- return 1;
-}
-
-void ossl_qrx_pkt_wrap_free(OSSL_QRX *qrx, OSSL_QRX_PKT_WRAP *pkt_wrap)
-{
- int ref = 0;
-
- if (pkt_wrap == NULL)
- return;
- CRYPTO_DOWN_REF(&pkt_wrap->references, &ref, pkt_wrap->lock);
- if (ref > 0)
- return;
- ossl_qrx_release_pkt(qrx, pkt_wrap->handle);
- CRYPTO_THREAD_lock_free(pkt_wrap->lock);
- OPENSSL_free(pkt_wrap);
-}
diff --git a/ssl/quic/quic_rstream.c b/ssl/quic/quic_rstream.c
index 9c4b8b716b..f8ad8b89de 100644
--- a/ssl/quic/quic_rstream.c
+++ b/ssl/quic/quic_rstream.c
@@ -17,7 +17,7 @@ struct quic_rstream_st {
OSSL_STATM *statm;
};
-QUIC_RSTREAM *ossl_quic_rstream_new(OSSL_QRX *qrx, QUIC_RXFC *rxfc,
+QUIC_RSTREAM *ossl_quic_rstream_new(QUIC_RXFC *rxfc,
OSSL_STATM *statm)
{
QUIC_RSTREAM *ret = OPENSSL_malloc(sizeof(*ret));
@@ -25,7 +25,7 @@ QUIC_RSTREAM *ossl_quic_rstream_new(OSSL_QRX *qrx, QUIC_RXFC *rxfc,
if (ret == NULL)
return NULL;
- ossl_sframe_list_init(&ret->fl, qrx);
+ ossl_sframe_list_init(&ret->fl);
ret->rxfc = rxfc;
ret->statm = statm;
return ret;
@@ -37,7 +37,7 @@ void ossl_quic_rstream_free(QUIC_RSTREAM *qrs)
OPENSSL_free(qrs);
}
-int ossl_quic_rstream_queue_data(QUIC_RSTREAM *qrs, OSSL_QRX_PKT_WRAP *pkt_wrap,
+int ossl_quic_rstream_queue_data(QUIC_RSTREAM *qrs, OSSL_QRX_PKT *pkt,
uint64_t offset,
const unsigned char *data, uint64_t data_len,
int fin)
@@ -47,7 +47,7 @@ int ossl_quic_rstream_queue_data(QUIC_RSTREAM *qrs, OSSL_QRX_PKT_WRAP *pkt_wrap,
range.start = offset;
range.end = offset + data_len;
- return ossl_sframe_list_insert(&qrs->fl, &range, pkt_wrap, data, fin);
+ return ossl_sframe_list_insert(&qrs->fl, &range, pkt, data, fin);
}
static int read_internal(QUIC_RSTREAM *qrs, unsigned char *buf, size_t size,
diff --git a/ssl/quic/quic_rx_depack.c b/ssl/quic/quic_rx_depack.c
index 66d2edaaae..2c189f20b7 100644
--- a/ssl/quic/quic_rx_depack.c
+++ b/ssl/quic/quic_rx_depack.c
@@ -13,7 +13,6 @@
#include "internal/quic_record_rx.h"
#include "internal/quic_ackm.h"
#include "internal/quic_rx_depack.h"
-#include "internal/quic_record_rx_wrap.h"
#include "internal/quic_error.h"
#include "internal/quic_fc.h"
#include "internal/sockets.h"
@@ -66,7 +65,7 @@ static int ssl_get_stream_type(QUIC_STREAM *stream)
* reference count. When the data is consumed (i.e. as a result of, say,
* SSL_read()), ossl_qrx_pkt_wrap_free() must be called.
*/
-static int ssl_queue_data(QUIC_STREAM *stream, OSSL_QRX_PKT_WRAP *pkt_wrap,
+static int ssl_queue_data(QUIC_STREAM *stream, OSSL_QRX_PKT *pkt,
const unsigned char *data, uint64_t data_len,
uint64_t logical_offset, int is_fin)
{
@@ -80,7 +79,7 @@ static int ssl_queue_data(QUIC_STREAM *stream, OSSL_QRX_PKT_WRAP *pkt_wrap,
return 0;
return stream->rstream == NULL
- || ossl_quic_rstream_queue_data(stream->rstream, pkt_wrap,
+ || ossl_quic_rstream_queue_data(stream->rstream, pkt,
logical_offset, data, data_len,
is_fin);
}
@@ -295,7 +294,7 @@ static int depack_do_frame_new_token(PACKET *pkt, QUIC_CONNECTION *connection,
}
static int depack_do_frame_stream(PACKET *pkt, QUIC_CONNECTION *connection,
- OSSL_QRX_PKT_WRAP *parent_pkt,
+ OSSL_QRX_PKT *parent_pkt,
OSSL_ACKM_RX_PKT *ackm_data)
{
OSSL_QUIC_FRAME_STREAM frame_data;
@@ -547,10 +546,10 @@ static int depack_do_frame_unknown_extension(PACKET *pkt,
/* Main frame processor */
static int depack_process_frames(QUIC_CONNECTION *connection, PACKET *pkt,
- OSSL_QRX_PKT_WRAP *parent_pkt, int packet_space,
+ OSSL_QRX_PKT *parent_pkt, int packet_space,
OSSL_TIME received, OSSL_ACKM_RX_PKT *ackm_data)
{
- uint32_t pkt_type = parent_pkt->pkt->hdr->type;
+ uint32_t pkt_type = parent_pkt->hdr->type;
while (PACKET_remaining(pkt) > 0) {
uint64_t frame_type;
@@ -748,7 +747,6 @@ int ossl_quic_handle_frames(QUIC_CONNECTION *connection, OSSL_QRX_PKT *qpacket)
{
PACKET pkt;
OSSL_ACKM_RX_PKT ackm_data;
- OSSL_QRX_PKT_WRAP *qpkt_wrap = NULL;
/*
* ok has three states:
* -1 error with ackm_data uninitialized
@@ -760,9 +758,6 @@ int ossl_quic_handle_frames(QUIC_CONNECTION *connection, OSSL_QRX_PKT *qpacket)
if (connection == NULL)
goto end;
- if ((qpkt_wrap = ossl_qrx_pkt_wrap_new(qpacket)) == NULL)
- goto end;
-
/* Initialize |ackm_data| (and reinitialize |ok|)*/
memset(&ackm_data, 0, sizeof(ackm_data));
/*
@@ -796,7 +791,7 @@ int ossl_quic_handle_frames(QUIC_CONNECTION *connection, OSSL_QRX_PKT *qpacket)
/* Now that special cases are out of the way, parse frames */
if (!PACKET_buf_init(&pkt, qpacket->hdr->data, qpacket->hdr->len)
- || !depack_process_frames(connection, &pkt, qpkt_wrap,
+ || !depack_process_frames(connection, &pkt, qpacket,
ackm_data.pkt_space, qpacket->time,
&ackm_data))
goto end;
@@ -814,19 +809,16 @@ int ossl_quic_handle_frames(QUIC_CONNECTION *connection, OSSL_QRX_PKT *qpacket)
ossl_ackm_on_rx_packet(GET_CONN_ACKM(connection), &ackm_data);
/*
- * Let go of the packet pointer in |qpkt_wrap|. This means that the
- * reference counter can't be incremented any more.
+ * Release the ref to the packet. This will free the packet unless something
+ * in our processing above has added a reference to it.
*/
- if (qpkt_wrap != NULL)
- qpkt_wrap->pkt = NULL;
-
- ossl_qrx_pkt_wrap_free(GET_CONN_QRX(connection), qpkt_wrap);
+ ossl_qrx_pkt_release(qpacket);
return ok > 0;
}
int ossl_quic_depacketize(QUIC_CONNECTION *connection)
{
- OSSL_QRX_PKT qpacket;
+ OSSL_QRX_PKT *qpacket = NULL;
if (connection == NULL)
return 0;
@@ -836,5 +828,5 @@ int ossl_quic_depacketize(QUIC_CONNECTION *connection)
if (ossl_qrx_read_pkt(GET_CONN_QRX(connection), &qpacket) <= 0)
return 0;
- return ossl_quic_handle_frames(connection, &qpacket);
+ return ossl_quic_handle_frames(connection, qpacket);
}
diff --git a/ssl/quic/quic_sf_list.c b/ssl/quic/quic_sf_list.c
index d382bd0904..2924b78e1f 100644
--- a/ssl/quic/quic_sf_list.c
+++ b/ssl/quic/quic_sf_list.c
@@ -9,31 +9,28 @@
#include "internal/uint_set.h"
#include "internal/common.h"
-#include "internal/quic_record_rx_wrap.h"
#include "internal/quic_sf_list.h"
struct stream_frame_st {
struct stream_frame_st *prev, *next;
UINT_RANGE range;
- OSSL_QRX_PKT_WRAP *pkt;
+ OSSL_QRX_PKT *pkt;
const unsigned char *data;
};
static void stream_frame_free(SFRAME_LIST *fl, STREAM_FRAME *sf)
{
- ossl_qrx_pkt_wrap_free(fl->qrx, sf->pkt);
+ ossl_qrx_pkt_release(sf->pkt);
OPENSSL_free(sf);
}
-static STREAM_FRAME *stream_frame_new(UINT_RANGE *range, OSSL_QRX_PKT_WRAP *pkt,
+static STREAM_FRAME *stream_frame_new(UINT_RANGE *range, OSSL_QRX_PKT *pkt,
const unsigned char *data)
{
STREAM_FRAME *sf = OPENSSL_zalloc(sizeof(*sf));
- if (pkt != NULL && !ossl_qrx_pkt_wrap_up_ref(pkt)) {
- OPENSSL_free(sf);
- return NULL;
- }
+ if (pkt != NULL)
+ ossl_qrx_pkt_up_ref(pkt);
sf->range = *range;
sf->pkt = pkt;
@@ -42,10 +39,9 @@ static STREAM_FRAME *stream_frame_new(UINT_RANGE *range, OSSL_QRX_PKT_WRAP *pkt,
return sf;
}
-void ossl_sframe_list_init(SFRAME_LIST *fl, OSSL_QRX *qrx)
+void ossl_sframe_list_init(SFRAME_LIST *fl)
{
memset(fl, 0, sizeof(*fl));
- fl->qrx = qrx;
}
void ossl_sframe_list_destroy(SFRAME_LIST *fl)
@@ -59,7 +55,7 @@ void ossl_sframe_list_destroy(SFRAME_LIST *fl)
}
static int append_frame(SFRAME_LIST *fl, UINT_RANGE *range,
- OSSL_QRX_PKT_WRAP *pkt,
+ OSSL_QRX_PKT *pkt,
const unsigned char *data)
{
STREAM_FRAME *new_frame;
@@ -75,7 +71,7 @@ static int append_frame(SFRAME_LIST *fl, UINT_RANGE *range,
}
int ossl_sframe_list_insert(SFRAME_LIST *fl, UINT_RANGE *range,
- OSSL_QRX_PKT_WRAP *pkt,
+ OSSL_QRX_PKT *pkt,
const unsigned char *data, int fin)
{
STREAM_FRAME *sf, *new_frame, *prev_frame, *next_frame;
diff --git a/test/quic_record_test.c b/test/quic_record_test.c
index c6ac10d854..5aab728a02 100644
--- a/test/quic_record_test.c
+++ b/test/quic_record_test.c
@@ -1791,7 +1791,7 @@ static int rx_run_script(const struct rx_test_op *script)
int testresult = 0, pkt_outstanding = 0;
struct rx_state s = {0};
size_t i;
- OSSL_QRX_PKT pkt = {0};
+ OSSL_QRX_PKT *pkt = NULL;
const struct rx_test_op *op = script;
for (; op->op != RX_TEST_OP_END; ++op)
@@ -1850,14 +1850,14 @@ static int rx_run_script(const struct rx_test_op *script)
goto err;
pkt_outstanding = 1;
- if (!TEST_ptr(pkt.hdr))
+ if (!TEST_ptr(pkt) || !TEST_ptr(pkt->hdr))
goto err;
- if (!TEST_mem_eq(pkt.hdr->data, pkt.hdr->len,
+ if (!TEST_mem_eq(pkt->hdr->data, pkt->hdr->len,
op->buf, op->buf_len))
goto err;
- if (!TEST_true(cmp_pkt_hdr(pkt.hdr, op->hdr,
+ if (!TEST_true(cmp_pkt_hdr(pkt->hdr, op->hdr,
op->buf, op->buf_len, 1)))
goto err;
@@ -1866,19 +1866,19 @@ static int rx_run_script(const struct rx_test_op *script)
if (!TEST_true(rx_state_ensure_for_frames(&s)))
goto err;
pkt_outstanding = 0;
- if (!TEST_true(ossl_quic_handle_frames(s.quic_conn, &pkt)))
+ if (!TEST_true(ossl_quic_handle_frames(s.quic_conn, pkt)))
goto err;
break;
case RX_TEST_OP_CHECK_PKT_FRAMES_INVALID:
if (!TEST_true(rx_state_ensure_for_frames(&s)))
goto err;
pkt_outstanding = 0;
- if (!TEST_false(ossl_quic_handle_frames(s.quic_conn, &pkt)))
+ if (!TEST_false(ossl_quic_handle_frames(s.quic_conn, pkt)))
goto err;
break;
default:
pkt_outstanding = 0;
- ossl_qrx_release_pkt(s.qrx, pkt.handle);
+ ossl_qrx_pkt_release(pkt);
break;
}
break;
@@ -1920,7 +1920,7 @@ static int rx_run_script(const struct rx_test_op *script)
testresult = 1;
err:
if (pkt_outstanding)
- ossl_qrx_release_pkt(s.qrx, pkt.handle);
+ ossl_qrx_pkt_release(pkt);
rx_state_teardown(&s);
return testresult;
}
diff --git a/test/quic_stream_test.c b/test/quic_stream_test.c
index dc0a618cd6..a322614ad9 100644
--- a/test/quic_stream_test.c
+++ b/test/quic_stream_test.c
@@ -330,7 +330,7 @@ static int test_rstream_simple(void)
size_t readbytes = 0, avail = 0;
int fin = 0;
- if (!TEST_ptr(rstream = ossl_quic_rstream_new(NULL, NULL, NULL)))
+ if (!TEST_ptr(rstream = ossl_quic_rstream_new(NULL, NULL)))
goto err;
if (!TEST_true(ossl_quic_rstream_queue_data(rstream, NULL, 5,
@@ -405,7 +405,7 @@ static int test_rstream_random(int idx)
if (!TEST_ptr(bulk_data = OPENSSL_malloc(data_size))
|| !TEST_ptr(read_buf = OPENSSL_malloc(data_size))
- || !TEST_ptr(rstream = ossl_quic_rstream_new(NULL, NULL, NULL)))
+ || !TEST_ptr(rstream = ossl_quic_rstream_new(NULL, NULL)))
goto err;
for (i = 0; i < data_size; ++i)
diff --git a/test/quic_txp_test.c b/test/quic_txp_test.c
index afdfba33e6..54d4a8679f 100644
--- a/test/quic_txp_test.c
+++ b/test/quic_txp_test.c
@@ -55,7 +55,7 @@ struct helper {
QUIC_DEMUX *demux;
OSSL_QRX *qrx;
OSSL_QRX_ARGS qrx_args;
- OSSL_QRX_PKT qrx_pkt;
+ OSSL_QRX_PKT *qrx_pkt;
PACKET pkt;
uint64_t frame_type;
union {
@@ -80,8 +80,8 @@ static void helper_cleanup(struct helper *h)
size_t i;
uint32_t pn_space;
- if (h->qrx_pkt.handle != NULL)
- ossl_qrx_release_pkt(h->qrx, h->qrx_pkt.handle);
+ ossl_qrx_pkt_release(h->qrx_pkt);
+ h->qrx_pkt = NULL;
for (pn_space = QUIC_PN_SPACE_INITIAL;
pn_space < QUIC_PN_SPACE_NUM;
@@ -1134,13 +1134,13 @@ static int run_script(const struct script_op *script)
break;
case OPK_RX_PKT:
ossl_quic_demux_pump(h.demux);
- if (h.qrx_pkt.handle != NULL)
- ossl_qrx_release_pkt(h.qrx, h.qrx_pkt.handle);
+ ossl_qrx_pkt_release(h.qrx_pkt);
+ h.qrx_pkt = NULL;
if (!TEST_true(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
goto err;
if (!TEST_true(PACKET_buf_init(&h.pkt,
- h.qrx_pkt.hdr->data,
- h.qrx_pkt.hdr->len)))
+ h.qrx_pkt->hdr->data,
+ h.qrx_pkt->hdr->len)))
goto err;
h.frame_type = UINT64_MAX;
break;
@@ -1151,8 +1151,8 @@ static int run_script(const struct script_op *script)
h.frame_type = UINT64_MAX;
break;
case OPK_EXPECT_DGRAM_LEN:
- if (!TEST_size_t_ge(h.qrx_pkt.datagram_len, (size_t)op->arg0)
- || !TEST_size_t_le(h.qrx_pkt.datagram_len, (size_t)op->arg1))
+ if (!TEST_size_t_ge(h.qrx_pkt->datagram_len, (size_t)op->arg0)
+ || !TEST_size_t_le(h.qrx_pkt->datagram_len, (size_t)op->arg1))
goto err;
break;
case OPK_EXPECT_FRAME:
@@ -1160,12 +1160,12 @@ static int run_script(const struct script_op *script)
goto err;
break;
case OPK_EXPECT_INITIAL_TOKEN:
- if (!TEST_mem_eq(h.qrx_pkt.hdr->token, h.qrx_pkt.hdr->token_len,
+ if (!TEST_mem_eq(h.qrx_pkt->hdr->token, h.qrx_pkt->hdr->token_len,
op->buf, (size_t)op->arg0))
goto err;
break;
case OPK_EXPECT_HDR:
- if (!TEST_true(cmp_pkt_hdr(h.qrx_pkt.hdr, op->buf,
+ if (!TEST_true(cmp_pkt_hdr(h.qrx_pkt->hdr, op->buf,
NULL, 0, 0)))
goto err;
break;