mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-03-11 05:48:41 +00:00
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.
This commit is contained in:
parent
0ac3851f14
commit
91ae7aa7ec
@ -2597,19 +2597,19 @@ int qc_treat_rx_pkts(struct quic_enc_level *el, struct ssl_sock_ctx *ctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called during handshakes to parse and build Initial and Handshake packets for QUIC
|
/* QUIC connection packet handler task. */
|
||||||
* connections with <ctx> as I/O handler context.
|
struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state)
|
||||||
* Returns 1 if succeeded, 0 if not.
|
|
||||||
*/
|
|
||||||
int qc_do_hdshk(struct ssl_sock_ctx *ctx)
|
|
||||||
{
|
{
|
||||||
int ret, ssl_err;
|
int ret, ssl_err;
|
||||||
|
struct ssl_sock_ctx *ctx;
|
||||||
struct quic_conn *qc;
|
struct quic_conn *qc;
|
||||||
enum quic_tls_enc_level tel, next_tel;
|
enum quic_tls_enc_level tel, next_tel;
|
||||||
struct quic_enc_level *qel, *next_qel;
|
struct quic_enc_level *qel, *next_qel;
|
||||||
struct quic_tls_ctx *tls_ctx;
|
struct quic_tls_ctx *tls_ctx;
|
||||||
struct qring *qr; // Tx ring
|
struct qring *qr; // Tx ring
|
||||||
|
int prev_st, st;
|
||||||
|
|
||||||
|
ctx = context;
|
||||||
qc = ctx->conn->qc;
|
qc = ctx->conn->qc;
|
||||||
qr = NULL;
|
qr = NULL;
|
||||||
TRACE_ENTER(QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state);
|
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))
|
(tls_ctx->rx.flags & QUIC_FL_TLS_SECRETS_SET))
|
||||||
qc_rm_hp_pkts(qel, ctx);
|
qc_rm_hp_pkts(qel, ctx);
|
||||||
|
|
||||||
|
prev_st = HA_ATOMIC_LOAD(&qc->state);
|
||||||
if (!qc_treat_rx_pkts(qel, ctx))
|
if (!qc_treat_rx_pkts(qel, ctx))
|
||||||
goto err;
|
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)
|
if (!qr)
|
||||||
qr = MT_LIST_POP(qc->tx.qring_list, typeof(qr), mt_list);
|
qr = MT_LIST_POP(qc->tx.qring_list, typeof(qr), mt_list);
|
||||||
ret = qc_prep_hdshk_pkts(qr, ctx);
|
ret = qc_prep_hdshk_pkts(qr, ctx);
|
||||||
@ -2653,29 +2664,16 @@ int qc_do_hdshk(struct ssl_sock_ctx *ctx)
|
|||||||
goto next_level;
|
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:
|
out:
|
||||||
MT_LIST_APPEND(qc->tx.qring_list, &qr->mt_list);
|
MT_LIST_APPEND(qc->tx.qring_list, &qr->mt_list);
|
||||||
TRACE_LEAVE(QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state);
|
TRACE_LEAVE(QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state);
|
||||||
return 1;
|
return t;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
if (qr)
|
if (qr)
|
||||||
MT_LIST_APPEND(qc->tx.qring_list, &qr->mt_list);
|
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);
|
TRACE_DEVEL("leaving in error", QUIC_EV_CONN_HDSHK, ctx->conn, &qc->state, &ssl_err);
|
||||||
return 0;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Uninitialize <qel> QUIC encryption level. Never fails. */
|
/* Uninitialize <qel> QUIC encryption level. Never fails. */
|
||||||
@ -4220,29 +4218,6 @@ int qc_prep_phdshk_pkts(struct qring *qr, struct quic_conn *qc)
|
|||||||
return 0;
|
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 <count> bytes from connection <conn> internal stream storage into buffer <buf>.
|
/* Copy up to <count> bytes from connection <conn> internal stream storage into buffer <buf>.
|
||||||
* Return the number of bytes which have been copied.
|
* Return the number of bytes which have been copied.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user