From 055025fa3b6d42d61ee99d8b6d26a0bf93444e85 Mon Sep 17 00:00:00 2001 From: Roman Arutyunyan Date: Mon, 14 Feb 2022 14:51:10 +0300 Subject: [PATCH] QUIC: trim input chain in ngx_quic_buffer_write(). This allows to eliminate explicit trimming when handling input STREAM frame. As a result, ngx_quic_trim_chain() is eliminated as well. --- src/event/quic/ngx_event_quic_frames.c | 36 +++++++++++-------------- src/event/quic/ngx_event_quic_frames.h | 1 - src/event/quic/ngx_event_quic_streams.c | 5 ---- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/event/quic/ngx_event_quic_frames.c b/src/event/quic/ngx_event_quic_frames.c index b89072ea2..4a39141eb 100644 --- a/src/event/quic/ngx_event_quic_frames.c +++ b/src/event/quic/ngx_event_quic_frames.c @@ -258,26 +258,6 @@ ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame) } -void -ngx_quic_trim_chain(ngx_chain_t *in, size_t size) -{ - size_t n; - ngx_buf_t *b; - - while (in && size > 0) { - b = in->buf; - n = ngx_min((size_t) (b->last - b->pos), size); - - b->pos += n; - size -= n; - - if (b->pos == b->last) { - in = in->next; - } - } -} - - void ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in) { @@ -551,6 +531,22 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, chain = &qb->chain; while (in && limit) { + + if (offset < base) { + n = ngx_min((uint64_t) (in->buf->last - in->buf->pos), + ngx_min(base - offset, limit)); + + in->buf->pos += n; + offset += n; + limit -= n; + + if (in->buf->pos == in->buf->last) { + in = in->next; + } + + continue; + } + cl = *chain; if (cl == NULL) { diff --git a/src/event/quic/ngx_event_quic_frames.h b/src/event/quic/ngx_event_quic_frames.h index 853e36ca1..48cb22e91 100644 --- a/src/event/quic/ngx_event_quic_frames.h +++ b/src/event/quic/ngx_event_quic_frames.h @@ -26,7 +26,6 @@ ngx_int_t ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, ngx_chain_t *ngx_quic_alloc_chain(ngx_connection_t *c); ngx_chain_t *ngx_quic_copy_buf(ngx_connection_t *c, u_char *data, size_t len); -void ngx_quic_trim_chain(ngx_chain_t *in, size_t size); void ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in); ngx_chain_t *ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c index 1906bc695..78650b04f 100644 --- a/src/event/quic/ngx_event_quic_streams.c +++ b/src/event/quic/ngx_event_quic_streams.c @@ -1115,11 +1115,6 @@ ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, return NGX_OK; } - if (f->offset < qs->recv_offset) { - ngx_quic_trim_chain(frame->data, qs->recv_offset - f->offset); - f->offset = qs->recv_offset; - } - if (f->fin) { if (qs->recv_final_size != (uint64_t) -1 && qs->recv_final_size != last) {