From 91ae7aa7ec825107ab12239f808cfe5713cc7372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Tue, 3 Aug 2021 16:45:39 +0200 Subject: [PATCH] MINOR: quic: quic_conn_io_cb() task rework Modify this task which is called at least each a packet is received by a listener so that to make it behave almost as qc_do_hdshk(). This latter is no more useful and removed. --- src/xprt_quic.c | 61 +++++++++++++++---------------------------------- 1 file changed, 18 insertions(+), 43 deletions(-) diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 8c08a189f..cb7092e7b 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2597,19 +2597,19 @@ int qc_treat_rx_pkts(struct quic_enc_level *el, struct ssl_sock_ctx *ctx) return 0; } -/* Called during handshakes to parse and build Initial and Handshake packets for QUIC - * connections with as I/O handler context. - * Returns 1 if succeeded, 0 if not. - */ -int qc_do_hdshk(struct ssl_sock_ctx *ctx) +/* QUIC connection packet handler task. */ +struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state) { int ret, ssl_err; + struct ssl_sock_ctx *ctx; struct quic_conn *qc; enum quic_tls_enc_level tel, next_tel; struct quic_enc_level *qel, *next_qel; struct quic_tls_ctx *tls_ctx; struct qring *qr; // Tx ring + int prev_st, st; + ctx = context; qc = ctx->conn->qc; qr = NULL; TRACE_ENTER(QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state); @@ -2630,9 +2630,20 @@ int qc_do_hdshk(struct ssl_sock_ctx *ctx) (tls_ctx->rx.flags & QUIC_FL_TLS_SECRETS_SET)) qc_rm_hp_pkts(qel, ctx); + prev_st = HA_ATOMIC_LOAD(&qc->state); if (!qc_treat_rx_pkts(qel, ctx)) goto err; + st = HA_ATOMIC_LOAD(&qc->state); + if (prev_st == QUIC_HS_ST_SERVER_HANDSHAKE && st >= QUIC_HS_ST_COMPLETE) { + /* Discard the Handshake keys. */ + quic_tls_discard_keys(&qc->els[QUIC_TLS_ENC_LEVEL_HANDSHAKE]); + quic_pktns_discard(qc->els[QUIC_TLS_ENC_LEVEL_HANDSHAKE].pktns, qc); + qc_set_timer(ctx); + if (!quic_build_post_handshake_frames(qc)) + goto err; + } + if (!qr) qr = MT_LIST_POP(qc->tx.qring_list, typeof(qr), mt_list); ret = qc_prep_hdshk_pkts(qr, ctx); @@ -2653,29 +2664,16 @@ int qc_do_hdshk(struct ssl_sock_ctx *ctx) goto next_level; } - /* If the handshake has not been completed -> out! */ - if (qc->state < QUIC_HS_ST_COMPLETE) - goto out; - - /* Discard the Handshake keys. */ - quic_tls_discard_keys(&qc->els[QUIC_TLS_ENC_LEVEL_HANDSHAKE]); - quic_pktns_discard(qc->els[QUIC_TLS_ENC_LEVEL_HANDSHAKE].pktns, qc); - qc_set_timer(ctx); - if (!quic_build_post_handshake_frames(qc) || - !qc_prep_phdshk_pkts(qr, qc) || - !qc_send_ppkts(qr, ctx)) - goto err; - out: MT_LIST_APPEND(qc->tx.qring_list, &qr->mt_list); TRACE_LEAVE(QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state); - return 1; + return t; err: if (qr) MT_LIST_APPEND(qc->tx.qring_list, &qr->mt_list); TRACE_DEVEL("leaving in error", QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state, &ssl_err); - return 0; + return t; } /* Uninitialize QUIC encryption level. Never fails. */ @@ -4220,29 +4218,6 @@ int qc_prep_phdshk_pkts(struct qring *qr, struct quic_conn *qc) return 0; } -/* QUIC connection packet handler task. */ -struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state) -{ - struct ssl_sock_ctx *ctx = context; - - if (ctx->conn->qc->state < QUIC_HS_ST_COMPLETE) { - qc_do_hdshk(ctx); - } - else { - struct quic_conn *qc = ctx->conn->qc; - struct qring *qr; - - qr = MT_LIST_POP(qc->tx.qring_list, typeof(qr), mt_list); - /* XXX TO DO: may fail!!! XXX */ - qc_treat_rx_pkts(&qc->els[QUIC_TLS_ENC_LEVEL_APP], ctx); - qc_prep_phdshk_pkts(qr, qc); - qc_send_ppkts(qr, ctx); - MT_LIST_APPEND(qc->tx.qring_list, &qr->mt_list); - } - - return t; -} - /* Copy up to bytes from connection internal stream storage into buffer . * Return the number of bytes which have been copied. */