mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-16 10:36:55 +00:00
MINOR: hq-interop: use zero-copy to transfer single HTX data block
Similarly to H3, hq-interop now uses zero-copy when dealing with a HTX message with only a single data block. Exchange HTX and QCS buffer, and use the HTX data block for HTTP payload. This is only possible if QCS buffer is empty. Contrary to HTTP/3, no extra frame header is needed before transferring HTTP payload. hq-interop is only implemented for testing purpose so this change should not be noticeable by users. However, it will be useful to be able to test zero-copy transfer on QUIC interop testing.
This commit is contained in:
parent
d3987b69c3
commit
f8e095b058
@ -8,6 +8,8 @@
|
||||
#include <haproxy/http.h>
|
||||
#include <haproxy/mux_quic.h>
|
||||
#include <haproxy/qmux_http.h>
|
||||
#include <haproxy/qmux_trace.h>
|
||||
#include <haproxy/trace.h>
|
||||
|
||||
static ssize_t hq_interop_rcv_buf(struct qcs *qcs, struct buffer *b, int fin)
|
||||
{
|
||||
@ -110,6 +112,28 @@ static size_t hq_interop_snd_buf(struct qcs *qcs, struct buffer *buf,
|
||||
|
||||
switch (btype) {
|
||||
case HTX_BLK_DATA:
|
||||
if (unlikely(fsize == count &&
|
||||
!b_data(res) &&
|
||||
htx_nbblks(htx) == 1 && btype == HTX_BLK_DATA)) {
|
||||
void *old_area = res->area;
|
||||
|
||||
TRACE_DATA("perform zero-copy DATA transfer", QMUX_EV_STRM_SEND,
|
||||
qcs->qcc->conn, qcs);
|
||||
|
||||
/* remap MUX buffer to HTX area */
|
||||
*res = b_make(buf->area, buf->size,
|
||||
sizeof(struct htx) + blk->addr, fsize);
|
||||
|
||||
/* assign old MUX area to HTX buffer. */
|
||||
buf->area = old_area;
|
||||
buf->data = buf->head = 0;
|
||||
total += fsize;
|
||||
|
||||
/* reload HTX with empty buffer. */
|
||||
*htx = *htx_from_buf(buf);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (fsize > count)
|
||||
fsize = count;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user