From: Amaury Denoyelle Date: Fri, 3 Dec 2021 13:44:21 +0000 (+0100) Subject: MEDIUM: xprt-quic: finalize app layer initialization after ALPN nego X-Git-Tag: v2.6-dev1~321 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2288c3087170296474f1cc871b5ad82ce317628;p=thirdparty%2Fhaproxy.git MEDIUM: xprt-quic: finalize app layer initialization after ALPN nego The app layer is initialized after the handshake completion by the XPRT stack. Call the finalize operation just after that. Remove the erroneous call to finalize by the mux in the TPs callback as the app layer is not yet initialized at this stage. This should fix the missing H3 settings currently not emitted by haproxy. --- diff --git a/src/mux_quic.c b/src/mux_quic.c index b15f1f7f32..64990e4614 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -498,12 +498,6 @@ void quic_mux_transport_params_update(struct qcc *qcc) qcc->strms[QCS_SRV_BIDI].rx.max_data = srv_params->initial_max_stream_data_bidi_local; qcc->strms[QCS_SRV_UNI].rx.max_data = srv_params->initial_max_stream_data_uni; } - - /* Now that we have all the flow control information, we can finalize the application - * context. - */ - if (qcc->app_ops) - qcc->app_ops->finalize(qcc->ctx); } /* Initialize the mux once it's attached. For outgoing connections, the context diff --git a/src/xprt_quic.c b/src/xprt_quic.c index c7056c07a4..0ed7336c35 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -1827,6 +1827,7 @@ static inline int qc_provide_cdata(struct quic_enc_level *el, { int ssl_err, state; struct quic_conn *qc; + const struct qcc_app_ops *app_ops; const char *alpn; int alpn_len; @@ -1887,12 +1888,10 @@ static inline int qc_provide_cdata(struct quic_enc_level *el, conn_get_alpn(ctx->conn, &alpn, &alpn_len); if (alpn_len >= 2 && memcmp(alpn, "h3", 2) == 0) { - qc->qcc->app_ops = &h3_ops; - if (!qc->qcc->app_ops->init(qc->qcc)) - goto err; + app_ops = qc->qcc->app_ops = &h3_ops; } else if (alpn_len >= 10 && memcmp(alpn, "hq-interop", 10) == 0) { - qc->qcc->app_ops = &hq_interop_ops; + app_ops = qc->qcc->app_ops = &hq_interop_ops; } else { /* TODO RFC9001 8.1. Protocol Negotiation @@ -1902,6 +1901,14 @@ static inline int qc_provide_cdata(struct quic_enc_level *el, goto err; } + if (app_ops->init) { + if (!app_ops->init(qc->qcc)) + goto err; + } + + if (app_ops->finalize) + app_ops->finalize(qc->qcc->ctx); + out: TRACE_LEAVE(QUIC_EV_CONN_SSLDATA, ctx->conn); return 1;