# HG changeset patch # User Roman Arutyunyan # Date 1644839470 -10800 # Node ID 489c2dcb318019dc337644beda10f8ca16c953d0 # Parent f9c788f3f5cc08fb82818ee63ee379a7d5d55b45 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. diff --git a/src/event/quic/ngx_event_quic_frames.c b/src/event/quic/ngx_event_quic_frames.c --- a/src/event/quic/ngx_event_quic_frames.c +++ b/src/event/quic/ngx_event_quic_frames.c @@ -259,26 +259,6 @@ ngx_quic_free_frame(ngx_connection_t *c, 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) { ngx_chain_t *cl; @@ -551,6 +531,22 @@ ngx_quic_write_buffer(ngx_connection_t * 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 --- 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_conne 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 --- 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_connect 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) {