/* 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);
#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;
*
* 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);
return total;
}
-static int h3_attach(struct qcs *qcs)
+static int h3_attach(struct qcs *qcs, void *conn_ctx)
{
struct h3s *h3s;
return 1;
qcs->ctx = h3s;
+ h3s->h3c = conn_ctx;
+
h3s->demux_frame_len = 0;
h3s->demux_frame_type = 0;
h3s->flags = 0;
#include <haproxy/mux_quic.h>
#include <haproxy/ncbuf.h>
-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;
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;
}
{
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;
}