MINOR: h3: define snd_buf callback and divert mux ops
diff --git a/include/haproxy/h3.h b/include/haproxy/h3.h
index 67ead4c..4c329b8 100644
--- a/include/haproxy/h3.h
+++ b/include/haproxy/h3.h
@@ -93,5 +93,7 @@
extern const struct qcc_app_ops h3_ops;
+size_t h3_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
+
#endif /* USE_QUIC */
#endif /* _HAPROXY_H3_T_H */
diff --git a/include/haproxy/mux_quic.h b/include/haproxy/mux_quic.h
index 7d7b7cc..4e9bb4c 100644
--- a/include/haproxy/mux_quic.h
+++ b/include/haproxy/mux_quic.h
@@ -122,5 +122,7 @@
return bidi_qcs_new(qcc, id);
}
+size_t qc_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
+
#endif /* USE_QUIC */
#endif /* _HAPROXY_MUX_QUIC_H */
diff --git a/src/h3.c b/src/h3.c
index f961ab1..194d57f 100644
--- a/src/h3.c
+++ b/src/h3.c
@@ -433,7 +433,54 @@
ABORT_NOW();
return buf;
+}
+
+size_t h3_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
+{
+ size_t total = 0;
+ struct qcs *qcs = cs->ctx;
+ struct htx *htx;
+ enum htx_blk_type btype;
+ struct htx_blk *blk;
+ uint32_t bsize;
+ int32_t idx;
+ int ret;
+
+ htx = htx_from_buf(buf);
+
+ while (count && !htx_is_empty(htx)) {
+ idx = htx_get_head(htx);
+ blk = htx_get_blk(htx, idx);
+ btype = htx_get_blk_type(blk);
+ bsize = htx_get_blksz(blk);
+
+ /* Not implemented : QUIC on backend side */
+ BUG_ON(btype == HTX_BLK_REQ_SL);
+
+ switch (btype) {
+ case HTX_BLK_RES_SL:
+ /* TODO HEADERS h3 frame */
+
+ case HTX_BLK_DATA:
+ /* TODO DATA h3 frame */
+
+ case HTX_BLK_TLR:
+ case HTX_BLK_EOT:
+ /* TODO trailers */
+
+ default:
+ htx_remove_blk(htx, blk);
+ total += bsize;
+ count -= bsize;
+ break;
+ }
+ }
+
+ // TODO should I call the mux directly here ?
+ qc_snd_buf(cs, buf, total, flags);
+ out:
+ return total;
}
/* Finalize the initialization of remotely initiated uni-stream <qcs>.
diff --git a/src/mux_quic.c b/src/mux_quic.c
index f870f70..83229c2 100644
--- a/src/mux_quic.c
+++ b/src/mux_quic.c
@@ -1867,10 +1867,9 @@
* <count> bytes. Returns the number of bytes effectively sent. Some status
* flags may be updated on the conn_stream.
*/
-static size_t qc_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
+size_t qc_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
{
struct qcs *qcs = cs->ctx;
- size_t total = 0;
TRACE_ENTER(QC_EV_QCS_SEND|QC_EV_STRM_SEND, qcs->qcc->conn, qcs);
@@ -1880,7 +1879,7 @@
}
TRACE_LEAVE(QC_EV_QCS_SEND|QC_EV_STRM_SEND, qcs->qcc->conn, qcs);
- return total;
+ return count;
}
/* Called from the upper layer, to send data from buffer <buf> for no more than
@@ -2118,7 +2117,8 @@
static const struct mux_ops qc_ops = {
.init = qc_init,
.wake = qc_wake,
- .snd_buf = qc_snd_buf,
+ //.snd_buf = qc_snd_buf,
+ .snd_buf = h3_snd_buf,
.rcv_buf = qc_rcv_buf,
.subscribe = qc_subscribe,
.unsubscribe = qc_unsubscribe,