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 */
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 */
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>.
* <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);
}
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
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,