diff --git a/include/haproxy/mux_quic-t.h b/include/haproxy/mux_quic-t.h index 51e3f882a..b32d4f966 100644 --- a/include/haproxy/mux_quic-t.h +++ b/include/haproxy/mux_quic-t.h @@ -136,8 +136,8 @@ struct qcs { /* QUIC application layer operations */ struct qcc_app_ops { int (*init)(struct qcc *qcc); - int (*attach)(struct qcs *qcs); - int (*decode_qcs)(struct qcs *qcs, int fin, void *ctx); + int (*attach)(struct qcs *qcs, void *conn_ctx); + int (*decode_qcs)(struct qcs *qcs, int fin); size_t (*snd_buf)(struct stconn *sc, struct buffer *buf, size_t count, int flags); void (*detach)(struct qcs *qcs); int (*finalize)(void *ctx); diff --git a/src/h3.c b/src/h3.c index 1b8e37831..b9a9fed36 100644 --- a/src/h3.c +++ b/src/h3.c @@ -133,6 +133,8 @@ DECLARE_STATIC_POOL(pool_head_h3c, "h3c", sizeof(struct h3c)); #define H3_SF_UNI_NO_H3 0x00000002 /* unidirectional stream does not carry H3 frames */ struct h3s { + struct h3c *h3c; + enum h3s_t type; int demux_frame_len; int demux_frame_type; @@ -574,11 +576,11 @@ static size_t h3_parse_settings_frm(struct h3c *h3c, const struct ncbuf *rxbuf, * * Returns 0 on success else non-zero. */ -static int h3_decode_qcs(struct qcs *qcs, int fin, void *ctx) +static int h3_decode_qcs(struct qcs *qcs, int fin) { struct ncbuf *rxbuf = &qcs->rx.ncbuf; - struct h3c *h3c = ctx; struct h3s *h3s = qcs->ctx; + struct h3c *h3c = h3s->h3c; ssize_t ret; h3_debug_printf(stderr, "%s: STREAM ID: %lu\n", __func__, qcs->id); @@ -1020,7 +1022,7 @@ size_t h3_snd_buf(struct stconn *sc, struct buffer *buf, size_t count, int flags return total; } -static int h3_attach(struct qcs *qcs) +static int h3_attach(struct qcs *qcs, void *conn_ctx) { struct h3s *h3s; @@ -1031,6 +1033,8 @@ static int h3_attach(struct qcs *qcs) return 1; qcs->ctx = h3s; + h3s->h3c = conn_ctx; + h3s->demux_frame_len = 0; h3s->demux_frame_type = 0; h3s->flags = 0; diff --git a/src/hq_interop.c b/src/hq_interop.c index c9ab68390..f5c0e79cd 100644 --- a/src/hq_interop.c +++ b/src/hq_interop.c @@ -9,7 +9,7 @@ #include #include -static int hq_interop_decode_qcs(struct qcs *qcs, int fin, void *ctx) +static int hq_interop_decode_qcs(struct qcs *qcs, int fin) { struct ncbuf *rxbuf = &qcs->rx.ncbuf; struct htx *htx; diff --git a/src/mux_quic.c b/src/mux_quic.c index 04ed1bac6..84237c3e6 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -139,7 +139,7 @@ struct qcs *qcs_new(struct qcc *qcc, uint64_t id, enum qcs_type type) qcs->id = qcs->by_id.key = id; if (qcc->app_ops->attach) { - if (qcc->app_ops->attach(qcs)) + if (qcc->app_ops->attach(qcs, qcc->ctx)) goto err; } @@ -434,7 +434,7 @@ static int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs) { TRACE_ENTER(QMUX_EV_QCS_RECV, qcc->conn, qcs); - if (qcc->app_ops->decode_qcs(qcs, qcs->flags & QC_SF_FIN_RECV, qcc->ctx)) { + if (qcc->app_ops->decode_qcs(qcs, qcs->flags & QC_SF_FIN_RECV)) { TRACE_DEVEL("leaving on decoding error", QMUX_EV_QCS_RECV, qcc->conn, qcs); return 1; }