changeset 9012:489c2dcb3180 quic

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.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 14 Feb 2022 14:51:10 +0300
parents f9c788f3f5cc
children b5656025ddb5
files src/event/quic/ngx_event_quic_frames.c src/event/quic/ngx_event_quic_frames.h src/event/quic/ngx_event_quic_streams.c
diffstat 3 files changed, 16 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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,
--- 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)
         {