aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/event/quic/ngx_event_quic.h2
-rw-r--r--src/event/quic/ngx_event_quic_frames.c21
2 files changed, 21 insertions, 2 deletions
diff --git a/src/event/quic/ngx_event_quic.h b/src/event/quic/ngx_event_quic.h
index 8f6dd7e78..109cd54ef 100644
--- a/src/event/quic/ngx_event_quic.h
+++ b/src/event/quic/ngx_event_quic.h
@@ -51,7 +51,9 @@ typedef enum {
typedef struct {
uint64_t size;
uint64_t offset;
+ uint64_t last_offset;
ngx_chain_t *chain;
+ ngx_chain_t **last_chain;
} ngx_quic_buffer_t;
diff --git a/src/event/quic/ngx_event_quic_frames.c b/src/event/quic/ngx_event_quic_frames.c
index c6d8de74e..5ffae32c3 100644
--- a/src/event/quic/ngx_event_quic_frames.c
+++ b/src/event/quic/ngx_event_quic_frames.c
@@ -421,6 +421,10 @@ ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, uint64_t limit)
qb->offset += n;
}
+ if (qb->offset >= qb->last_offset) {
+ qb->last_chain = NULL;
+ }
+
qb->chain = *ll;
*ll = NULL;
@@ -462,6 +466,10 @@ ngx_quic_skip_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
if (qb->chain == NULL) {
qb->offset = offset;
}
+
+ if (qb->offset >= qb->last_offset) {
+ qb->last_chain = NULL;
+ }
}
@@ -493,8 +501,14 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
ngx_buf_t *b;
ngx_chain_t *cl, **chain;
- base = qb->offset;
- chain = &qb->chain;
+ if (qb->last_chain && offset >= qb->last_offset) {
+ base = qb->last_offset;
+ chain = qb->last_chain;
+
+ } else {
+ base = qb->offset;
+ chain = &qb->chain;
+ }
while (in && limit) {
@@ -585,6 +599,9 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
}
}
+ qb->last_offset = base;
+ qb->last_chain = chain;
+
return in;
}