From: Amaury Denoyelle Date: Wed, 27 Apr 2022 13:17:11 +0000 (+0200) Subject: MINOR: mux-quic: add a app-layer context in qcs X-Git-Tag: v2.6-dev8~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=47447af1efb400ca894a150216b0802c10486e51;p=thirdparty%2Fhaproxy.git MINOR: mux-quic: add a app-layer context in qcs Define 2 new callback for qcc_app_ops : attach and detach. They are called when a qcs instance is respectively allocated and freed. If implemented, they can allocate a custom context stored in the new abstract field ctx of qcs. For now, h3 and hq-interop does not use these new callbacks. They will be soon implemented by the h3 layer to allocate a context used for stateful demuxing. This change is required to support the demuxing of H3 frames bigger than a buffer. --- diff --git a/include/haproxy/mux_quic-t.h b/include/haproxy/mux_quic-t.h index 1b6a4c8cbd..eafa62d15d 100644 --- a/include/haproxy/mux_quic-t.h +++ b/include/haproxy/mux_quic-t.h @@ -98,6 +98,7 @@ struct qcs { struct conn_stream *cs; struct cs_endpoint *endp; uint32_t flags; /* QC_SF_* */ + void *ctx; /* app-ops context */ struct { struct eb_root frms; /* received frames ordered by their offsets */ @@ -126,9 +127,11 @@ struct qcs { /* QUIC application layer operations */ struct qcc_app_ops { int (*init)(struct qcc *qcc); + int (*attach)(struct qcs *qcs); int (*attach_ruqs)(struct qcs *qcs, void *ctx); int (*decode_qcs)(struct qcs *qcs, int fin, void *ctx); size_t (*snd_buf)(struct conn_stream *cs, struct buffer *buf, size_t count, int flags); + void (*detach)(struct qcs *qcs); int (*finalize)(void *ctx); int (*is_active)(const struct qcc *qcc, void *ctx); void (*release)(void *ctx); diff --git a/src/mux_quic.c b/src/mux_quic.c index 17adf46611..5c5ba2cb9f 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -116,6 +116,7 @@ struct qcs *qcs_new(struct qcc *qcc, uint64_t id, enum qcs_type type) qcs->qcc = qcc; qcs->cs = NULL; qcs->flags = QC_SF_NONE; + qcs->ctx = NULL; /* allocate transport layer stream descriptor * @@ -126,6 +127,10 @@ struct qcs *qcs_new(struct qcc *qcc, uint64_t id, enum qcs_type type) if (!qcs->stream) goto err; + if (qcc->app_ops->attach) { + if (qcc->app_ops->attach(qcs)) + goto err; + } qcs->endp = cs_endpoint_new(); if (!qcs->endp) { @@ -169,6 +174,9 @@ struct qcs *qcs_new(struct qcc *qcc, uint64_t id, enum qcs_type type) return qcs; err: + if (qcs->ctx && qcc->app_ops->detach) + qcc->app_ops->detach(qcs); + if (qcs->stream) qc_stream_desc_release(qcs->stream); @@ -188,6 +196,9 @@ void qcs_free(struct qcs *qcs) BUG_ON(!qcs->qcc->strms[qcs_id_type(qcs->id)].nb_streams); --qcs->qcc->strms[qcs_id_type(qcs->id)].nb_streams; + if (qcs->ctx && qcs->qcc->app_ops->detach) + qcs->qcc->app_ops->detach(qcs); + qc_stream_desc_release(qcs->stream); BUG_ON(qcs->endp && !(qcs->endp->flags & CS_EP_ORPHAN));