]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic: quic_conn_io_cb() task rework
authorFrédéric Lécaille <flecaille@haproxy.com>
Tue, 3 Aug 2021 14:45:39 +0000 (16:45 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 23 Sep 2021 13:27:25 +0000 (15:27 +0200)
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

index 8c08a189f533efc30b3f5f1fed9d5c58e3b591c4..cb7092e7b5dee318771e16e59b75237c3065e957 100644 (file)
@@ -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 <ctx> 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 <qel> 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 <count> bytes from connection <conn> internal stream storage into buffer <buf>.
  * Return the number of bytes which have been copied.
  */