*/
#include "internal/quic_record_rx.h"
+#include "internal/quic_rx_depack.h"
#include "internal/quic_record_tx.h"
+#include "internal/quic_ackm.h"
+#include "internal/quic_cc.h"
+#include "internal/quic_ssl.h"
#include "testutil.h"
static const QUIC_CONN_ID empty_conn_id = {0, {0}};
#define RX_TEST_OP_KEY_UPDATE_TIMEOUT 11 /* complete key update process */
#define RX_TEST_OP_SET_INIT_KEY_PHASE 12 /* initial Key Phase bit value */
+/* These are subtest ops for RX_TEST_OP_CHECK_PKT, to additionally check frames */
+#define RX_TEST_OP_CHECK_PKT_FRAMES_OK 1 /* check that frames are parsed ok */
+#define RX_TEST_OP_CHECK_PKT_FRAMES_INVALID 2 /* check that frames fail to parse ok */
+
struct rx_test_op {
unsigned char op;
+ unsigned char subop;
const unsigned char *buf;
size_t buf_len;
const QUIC_PKT_HDR *hdr;
QUIC_PN largest_pn;
const QUIC_CONN_ID *dcid;
int (*new_qrx)(QUIC_DEMUX **demux, OSSL_QRX **qrx);
+
+ /* For frame checking */
};
#define RX_OP_END \
{ RX_TEST_OP_END }
#define RX_OP_SET_SCID_LEN(scid_len) \
- { RX_TEST_OP_SET_SCID_LEN, NULL, 0, NULL, (scid_len), 0, 0, NULL, NULL },
+ { RX_TEST_OP_SET_SCID_LEN, 0, NULL, 0, NULL, (scid_len), 0, 0, NULL, NULL },
#define RX_OP_SET_INIT_LARGEST_PN(largest_pn) \
- { RX_TEST_OP_SET_INIT_LARGEST_PN, NULL, 0, NULL, 0, 0, (largest_pn), NULL, NULL },
+ { RX_TEST_OP_SET_INIT_LARGEST_PN, 0, NULL, 0, NULL, 0, 0, (largest_pn), NULL, NULL },
#define RX_OP_ADD_RX_DCID(dcid) \
- { RX_TEST_OP_ADD_RX_DCID, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL },
+ { RX_TEST_OP_ADD_RX_DCID, 0, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL },
#define RX_OP_INJECT(dgram) \
- { RX_TEST_OP_INJECT, (dgram), sizeof(dgram), NULL, 0, 0, 0, NULL },
+ { RX_TEST_OP_INJECT, 0, (dgram), sizeof(dgram), NULL, 0, 0, 0, NULL },
#define RX_OP_PROVIDE_SECRET(el, suite, key) \
{ \
- RX_TEST_OP_PROVIDE_SECRET, (key), sizeof(key), \
+ RX_TEST_OP_PROVIDE_SECRET, 0, (key), sizeof(key), \
NULL, (el), (suite), 0, NULL, NULL \
},
#define RX_OP_PROVIDE_SECRET_INITIAL(dcid) \
- { RX_TEST_OP_PROVIDE_SECRET_INITIAL, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL },
+ { RX_TEST_OP_PROVIDE_SECRET_INITIAL, 0, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL },
#define RX_OP_DISCARD_EL(el) \
- { RX_TEST_OP_DISCARD_EL, NULL, 0, NULL, (el), 0, 0, NULL, NULL },
+ { RX_TEST_OP_DISCARD_EL, 0, NULL, 0, NULL, (el), 0, 0, NULL, NULL },
#define RX_OP_CHECK_PKT(expect_hdr, expect_body) \
{ \
- RX_TEST_OP_CHECK_PKT, (expect_body), sizeof(expect_body), \
+ RX_TEST_OP_CHECK_PKT, 0, (expect_body), sizeof(expect_body), \
&(expect_hdr), 0, 0, 0, NULL, NULL \
},
+#define RX_OP_CHECK_PKT_FRAMES_OK(expect_hdr, expect_body) \
+ { \
+ RX_TEST_OP_CHECK_PKT, RX_TEST_OP_CHECK_PKT_FRAMES_OK, \
+ (expect_body), sizeof(expect_body), &(expect_hdr), \
+ 0, 0, 0, NULL, NULL \
+ },
+#define RX_OP_CHECK_PKT_FRAMES_INVALID(expect_hdr, expect_body) \
+ { \
+ RX_TEST_OP_CHECK_PKT, RX_TEST_OP_CHECK_PKT_FRAMES_INVALID, \
+ (expect_body), sizeof(expect_body), &(expect_hdr), \
+ 0, 0, 0, NULL, NULL \
+ },
#define RX_OP_CHECK_NO_PKT() \
- { RX_TEST_OP_CHECK_NO_PKT, NULL, 0, NULL, 0, 0, 0, NULL, NULL },
+ { RX_TEST_OP_CHECK_NO_PKT, 0, NULL, 0, NULL, 0, 0, 0, NULL, NULL },
#define RX_OP_CHECK_KEY_EPOCH(expected) \
- { RX_TEST_OP_CHECK_KEY_EPOCH, NULL, 0, NULL, 0, 0, (expected), NULL },
+ { RX_TEST_OP_CHECK_KEY_EPOCH, 0, NULL, 0, NULL, 0, 0, (expected), NULL },
#define RX_OP_KEY_UPDATE_TIMEOUT(normal) \
- { RX_TEST_OP_KEY_UPDATE_TIMEOUT, NULL, 0, NULL, (normal), 0, 0, NULL },
+ { RX_TEST_OP_KEY_UPDATE_TIMEOUT, 0, NULL, 0, NULL, (normal), 0, 0, NULL },
#define RX_OP_SET_INIT_KEY_PHASE(kp_bit) \
- { RX_TEST_OP_SET_INIT_KEY_PHASE, NULL, 0, NULL, (kp_bit), 0, 0, NULL },
+ { RX_TEST_OP_SET_INIT_KEY_PHASE, 0, NULL, 0, NULL, (kp_bit), 0, 0, NULL },
#define RX_OP_INJECT_N(n) \
RX_OP_INJECT(rx_script_##n##_in)
#define RX_OP_CHECK_PKT_N(n) \
RX_OP_CHECK_PKT(rx_script_##n##_expect_hdr, rx_script_##n##_body)
+#define RX_OP_CHECK_PKT_FRAMES_OK_N(n) \
+ RX_OP_CHECK_PKT_FRAMES_OK(rx_script_##n##_expect_hdr, rx_script_##n##_body)
+#define RX_OP_CHECK_PKT_FRAMES_INVALID_N(n) \
+ RX_OP_CHECK_PKT_FRAMES_INVALID(rx_script_##n##_expect_hdr, rx_script_##n##_body)
-#define RX_OP_INJECT_CHECK(n) \
+#define RX_OP_INJECT_CHECK(n) \
RX_OP_INJECT_N(n) \
RX_OP_CHECK_PKT_N(n)
+#define RX_OP_INJECT_CHECK_FRAMES_OK(n) \
+ RX_OP_INJECT_N(n) \
+ RX_OP_CHECK_PKT_FRAMES_OK_N(n)
+
+#define RX_OP_INJECT_CHECK_FRAMES_INVALID(n) \
+ RX_OP_INJECT_N(n) \
+ RX_OP_CHECK_PKT_FRAMES_INVALID_N(3)
+
/* 1. RFC 9001 - A.3 Server Initial */
static const unsigned char rx_script_1_in[] = {
0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a,
0x25, 0xdf, 0x56, 0x6d, 0xc5, 0x43, 0x0b, 0x9a, 0x04, 0x5a, 0x12, 0x00,
0x13, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00,
0x20, 0x9d, 0x3c, 0x94, 0x0d, 0x89, 0x69, 0x0b, 0x84, 0xd0, 0x8a, 0x60,
- 0x99, 0x3c, 0x14, 0x4e, 0xca, 0x68, 0x4d, 0x10, 0x81, 0x28, 0x7c, 0x83,
+ 0x99, 0x3c, 0x14, 0x4e, 0xca, 0x68, 0x4d, 0x10, 0x81, 0x28, 0x7c, 0x83,
0x4d, 0x53, 0x11, 0xbc, 0xf3, 0x2b, 0xb9, 0xda, 0x1a, 0x00, 0x2b, 0x00,
0x02, 0x03, 0x04
};
RX_OP_SET_INIT_LARGEST_PN(0)
RX_OP_ADD_RX_DCID(empty_conn_id)
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_1_dcid)
- RX_OP_INJECT_CHECK(1)
+ RX_OP_INJECT_CHECK_FRAMES_OK(1)
RX_OP_CHECK_NO_PKT()
RX_OP_END
};
RX_OP_ADD_RX_DCID(empty_conn_id)
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_CHACHA20POLY1305,
rx_script_2_secret)
- RX_OP_INJECT_CHECK(2)
+ RX_OP_INJECT_CHECK_FRAMES_OK(2)
RX_OP_CHECK_NO_PKT()
RX_OP_END
};
static const struct rx_test_op rx_script_3[] = {
RX_OP_ADD_RX_DCID(empty_conn_id)
- RX_OP_INJECT_CHECK(3)
+ /*
+ * This is a version negotiation packet, so doesn't have any frames.
+ * However, the depacketizer still handles this sort of packet, so
+ * we still pass the packet to it, to exercise what it does.
+ */
+ RX_OP_INJECT_CHECK_FRAMES_OK(3)
RX_OP_CHECK_NO_PKT()
RX_OP_END
};
static const struct rx_test_op rx_script_4[] = {
RX_OP_ADD_RX_DCID(empty_conn_id)
- RX_OP_INJECT_CHECK(4)
+ RX_OP_INJECT_CHECK_FRAMES_OK(4)
RX_OP_CHECK_NO_PKT()
RX_OP_END
};
RX_OP_ADD_RX_DCID(empty_conn_id)
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_5_c2s_init_dcid)
RX_OP_INJECT_N(5)
- RX_OP_CHECK_PKT_N(5a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5a)
RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
QRL_SUITE_AES128GCM, rx_script_5_handshake_secret)
- RX_OP_CHECK_PKT_N(5b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5b)
RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_AES128GCM, rx_script_5_1rtt_secret)
- RX_OP_CHECK_PKT_N(5c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
RX_OP_CHECK_NO_PKT()
/* Try injecting the packet again */
* Initial packet is not output due to receiving a Handshake packet causing
* auto-discard of Initial keys
*/
- RX_OP_CHECK_PKT_N(5b)
- RX_OP_CHECK_PKT_N(5c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
RX_OP_CHECK_NO_PKT()
/* Try again with discarded keys */
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
RX_OP_INJECT_N(5)
- RX_OP_CHECK_PKT_N(5c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
RX_OP_CHECK_NO_PKT()
/* Try again */
RX_OP_INJECT_N(5)
- RX_OP_CHECK_PKT_N(5c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
RX_OP_CHECK_NO_PKT()
/* Try again with discarded 1-RTT keys */
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
RX_OP_INJECT_N(5)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_5_c2s_init_dcid)
- RX_OP_CHECK_PKT_N(5a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5a)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
QRL_SUITE_AES128GCM, rx_script_5_handshake_secret)
- RX_OP_CHECK_PKT_N(5b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5b)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_AES128GCM, rx_script_5_1rtt_secret)
- RX_OP_CHECK_PKT_N(5c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
RX_OP_CHECK_NO_PKT()
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
RX_OP_ADD_RX_DCID(empty_conn_id)
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_6_c2s_init_dcid)
RX_OP_INJECT_N(6)
- RX_OP_CHECK_PKT_N(6a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6a)
RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
QRL_SUITE_AES256GCM, rx_script_6_handshake_secret)
- RX_OP_CHECK_PKT_N(6b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6b)
RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_AES256GCM, rx_script_6_1rtt_secret)
- RX_OP_CHECK_PKT_N(6c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
RX_OP_CHECK_NO_PKT()
/* Try injecting the packet again */
* Initial packet is not output due to receiving a Handshake packet causing
* auto-discard of Initial keys
*/
- RX_OP_CHECK_PKT_N(6b)
- RX_OP_CHECK_PKT_N(6c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
RX_OP_CHECK_NO_PKT()
/* Try again with discarded keys */
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
RX_OP_INJECT_N(6)
- RX_OP_CHECK_PKT_N(6c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
RX_OP_CHECK_NO_PKT()
/* Try again */
RX_OP_INJECT_N(6)
- RX_OP_CHECK_PKT_N(6c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
RX_OP_CHECK_NO_PKT()
/* Try again with discarded 1-RTT keys */
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
RX_OP_INJECT_N(6)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_6_c2s_init_dcid)
- RX_OP_CHECK_PKT_N(6a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6a)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
QRL_SUITE_AES256GCM, rx_script_6_handshake_secret)
- RX_OP_CHECK_PKT_N(6b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6b)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_AES256GCM, rx_script_6_1rtt_secret)
- RX_OP_CHECK_PKT_N(6c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
RX_OP_CHECK_NO_PKT()
RX_OP_END
RX_OP_ADD_RX_DCID(empty_conn_id)
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_7_c2s_init_dcid)
RX_OP_INJECT_N(7)
- RX_OP_CHECK_PKT_N(7a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7a)
RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
QRL_SUITE_CHACHA20POLY1305, rx_script_7_handshake_secret)
- RX_OP_CHECK_PKT_N(7b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7b)
RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_CHACHA20POLY1305, rx_script_7_1rtt_secret)
- RX_OP_CHECK_PKT_N(7c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
RX_OP_CHECK_NO_PKT()
/* Try injecting the packet again */
* Initial packet is not output due to receiving a Handshake packet causing
* auto-discard of Initial keys
*/
- RX_OP_CHECK_PKT_N(7b)
- RX_OP_CHECK_PKT_N(7c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
RX_OP_CHECK_NO_PKT()
/* Try again with discarded keys */
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
RX_OP_INJECT_N(7)
- RX_OP_CHECK_PKT_N(7c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
RX_OP_CHECK_NO_PKT()
/* Try again */
RX_OP_INJECT_N(7)
- RX_OP_CHECK_PKT_N(7c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
RX_OP_CHECK_NO_PKT()
/* Try again with discarded 1-RTT keys */
RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
RX_OP_INJECT_N(7)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET_INITIAL(rx_script_7_c2s_init_dcid)
- RX_OP_CHECK_PKT_N(7a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7a)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
QRL_SUITE_CHACHA20POLY1305, rx_script_7_handshake_secret)
- RX_OP_CHECK_PKT_N(7b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7b)
RX_OP_CHECK_NO_PKT()
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_CHACHA20POLY1305, rx_script_7_1rtt_secret)
- RX_OP_CHECK_PKT_N(7c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
RX_OP_CHECK_NO_PKT()
RX_OP_END
RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
QRL_SUITE_AES128GCM, rx_script_8_1rtt_secret)
/* Now the injected packet is successfully returned */
- RX_OP_CHECK_PKT_N(8a)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8a)
RX_OP_CHECK_NO_PKT()
RX_OP_CHECK_KEY_EPOCH(0)
/* Packet with new key phase */
RX_OP_INJECT_N(8b)
/* Packet is successfully decrypted and returned */
- RX_OP_CHECK_PKT_N(8b)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8b)
RX_OP_CHECK_NO_PKT()
/* Key epoch has increased */
RX_OP_CHECK_KEY_EPOCH(1)
*/
RX_OP_INJECT_N(8c)
/* Should still be decrypted OK */
- RX_OP_CHECK_PKT_N(8c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8c)
RX_OP_CHECK_NO_PKT()
/* Epoch has not changed */
RX_OP_CHECK_KEY_EPOCH(1)
/* Another packet with the new keys. */
RX_OP_INJECT_N(8d)
- RX_OP_CHECK_PKT_N(8d)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8d)
RX_OP_CHECK_NO_PKT()
RX_OP_CHECK_KEY_EPOCH(1)
/* We can inject the old packet multiple times and it still works */
RX_OP_INJECT_N(8c)
- RX_OP_CHECK_PKT_N(8c)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8c)
RX_OP_CHECK_NO_PKT()
RX_OP_CHECK_KEY_EPOCH(1)
/* Move from COOLDOWN to NORMAL and try again */
RX_OP_KEY_UPDATE_TIMEOUT(1)
RX_OP_INJECT_N(8e)
- RX_OP_CHECK_PKT_N(8e)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8e)
RX_OP_CHECK_NO_PKT()
RX_OP_CHECK_KEY_EPOCH(2)
/* Can still receive old packet */
RX_OP_INJECT_N(8d)
- RX_OP_CHECK_PKT_N(8d)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8d)
RX_OP_CHECK_NO_PKT()
RX_OP_CHECK_KEY_EPOCH(2)
/* Try a packet from epoch 3 */
RX_OP_INJECT_N(8f)
- RX_OP_CHECK_PKT_N(8f)
+ RX_OP_CHECK_PKT_FRAMES_OK_N(8f)
RX_OP_CHECK_NO_PKT()
RX_OP_CHECK_KEY_EPOCH(3)
}
struct rx_state {
- QUIC_DEMUX *demux;
- OSSL_QRX *qrx;
- OSSL_QRX_ARGS args;
+ QUIC_DEMUX *demux;
+
+ /* OSSL_QRX with necessary data */
+ OSSL_QRX *qrx;
+ OSSL_QRX_ARGS args;
+
+ /* OSSL_ACKM with necessary data */
+ OSSL_ACKM *ackm;
+ OSSL_CC_DATA *ccdata;
+ OSSL_STATM statm; /* NOT the state machine! */
+
+ /* Used for the RX depacketizer, and wraps the |qrx| and |ackm| */
+ SSL_CTX *quic_ssl_ctx;
+ QUIC_CONNECTION *quic_conn;
};
static void rx_state_teardown(struct rx_state *s)
{
+ if (s->ackm != NULL) {
+ ossl_ackm_free(s->ackm);
+ ossl_quic_conn_set_ackm(s->quic_conn, NULL);
+ s->ackm = NULL;
+ }
+ if (s->ccdata != NULL) {
+ ossl_cc_dummy_method.free(s->ccdata);
+ s->ccdata = NULL;
+ }
+
if (s->qrx != NULL) {
ossl_qrx_free(s->qrx);
+ ossl_quic_conn_set_qrx(s->quic_conn, NULL);
s->qrx = NULL;
}
+ if (s->quic_conn != NULL) {
+ SSL_free((SSL *)s->quic_conn);
+ s->quic_conn = NULL;
+ }
+ if (s->quic_ssl_ctx != NULL) {
+ SSL_CTX_free(s->quic_ssl_ctx);
+ s->quic_ssl_ctx = NULL;
+ }
+
if (s->demux != NULL) {
ossl_quic_demux_free(s->demux);
s->demux = NULL;
static uint64_t time_counter = 0;
+static OSSL_TIME fake_now(void *ignored)
+{
+ OSSL_TIME f = {0};
+
+ return f;
+}
+
static OSSL_TIME expected_time(uint64_t counter)
{
return ossl_time_multiply(ossl_ticks2time(OSSL_TIME_MS), counter);
s->args.demux = s->demux;
s->args.max_deferred = 32;
+ /* Initialise OSSL_QRX */
if (s->qrx == NULL
&& !TEST_ptr(s->qrx = ossl_qrx_new(&s->args)))
return 0;
return 1;
}
+static int rx_state_ensure_for_frames(struct rx_state *s)
+{
+ SSL *qs;
+
+ if (!rx_state_ensure(s))
+ return 0;
+
+ /* Initialise ACK manager and congestion controller. */
+ if ((s->ccdata == NULL
+ && !TEST_ptr(s->ccdata = ossl_cc_dummy_method.new(NULL, NULL, NULL)))
+ || (s->ackm == NULL
+ && !TEST_ptr(s->ackm = ossl_ackm_new(fake_now, NULL, &s->statm,
+ &ossl_cc_dummy_method,
+ s->ccdata))))
+ return 0;
+
+ if (s->quic_conn == NULL
+ && (!TEST_ptr(s->quic_ssl_ctx
+ = SSL_CTX_new_ex(NULL, NULL, OSSL_QUIC_client_method()))
+ || !TEST_ptr(qs = SSL_new(s->quic_ssl_ctx))
+ || !TEST_ptr(s->quic_conn = ossl_quic_conn_from_ssl(qs))
+ || !TEST_true(ossl_quic_conn_set_qrx(s->quic_conn, s->qrx))
+ || !TEST_true(ossl_quic_conn_set_ackm(s->quic_conn, s->ackm))))
+ return 0;
+ return 1;
+}
+
static int rx_run_script(const struct rx_test_op *script)
{
int testresult = 0, pkt_outstanding = 0;
op->buf, op->buf_len, 1)))
goto err;
- ossl_qrx_release_pkt(s.qrx, pkt.handle);
- pkt_outstanding = 0;
+ switch (op->subop) {
+ case RX_TEST_OP_CHECK_PKT_FRAMES_OK:
+ 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)))
+ 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)))
+ goto err;
+ break;
+ default:
+ pkt_outstanding = 0;
+ ossl_qrx_release_pkt(s.qrx, pkt.handle);
+ break;
+ }
break;
case RX_TEST_OP_CHECK_NO_PKT:
if (!TEST_true(rx_state_ensure(&s)))