annotate src/event/quic/ngx_event_quic_frames.c @ 8950:fb811b6c76ee quic

QUIC: refactored buffer allocation, spliting and freeing. Previously, buffer lists was used to track used buffers. Now reference counter is used instead. The new implementation is simpler and faster with many buffer clones.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 24 Dec 2021 18:39:22 +0300
parents 2e22110828dd
children 5acd0d89d8c2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 #define NGX_QUIC_BUFFER_SIZE 4096
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
15 #define ngx_quic_buf_refs(b) (b)->shadow->num
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
16 #define ngx_quic_buf_inc_refs(b) ngx_quic_buf_refs(b)++
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
17 #define ngx_quic_buf_dec_refs(b) ngx_quic_buf_refs(b)--
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
18 #define ngx_quic_buf_set_refs(b, v) ngx_quic_buf_refs(b) = v
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
19
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
20
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
21 static ngx_buf_t *ngx_quic_alloc_buf(ngx_connection_t *c);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
22 static void ngx_quic_free_buf(ngx_connection_t *c, ngx_buf_t *b);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
23 static ngx_buf_t *ngx_quic_clone_buf(ngx_connection_t *c, ngx_buf_t *b);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
24
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
25
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
26 static ngx_buf_t *
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
27 ngx_quic_alloc_buf(ngx_connection_t *c)
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
28 {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
29 u_char *p;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
30 ngx_buf_t *b;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
31 ngx_quic_connection_t *qc;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
32
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
33 qc = ngx_quic_get_connection(c);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
34
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
35 b = qc->free_bufs;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
36
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
37 if (b) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
38 qc->free_bufs = b->shadow;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
39 p = b->start;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
40
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
41 } else {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
42 b = qc->free_shadow_bufs;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
43
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
44 if (b) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
45 qc->free_shadow_bufs = b->shadow;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
46
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
47 #ifdef NGX_QUIC_DEBUG_ALLOC
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
48 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
49 "quic use shadow buffer n:%ui %ui",
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
50 ++qc->nbufs, --qc->nshadowbufs);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
51 #endif
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
52
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
53 } else {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
54 b = ngx_palloc(c->pool, sizeof(ngx_buf_t));
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
55 if (b == NULL) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
56 return NULL;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
57 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
58
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
59 #ifdef NGX_QUIC_DEBUG_ALLOC
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
60 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
61 "quic new buffer n:%ui", ++qc->nbufs);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
62 #endif
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
63 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
64
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
65 p = ngx_pnalloc(c->pool, NGX_QUIC_BUFFER_SIZE);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
66 if (p == NULL) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
67 return NULL;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
68 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
69 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
70
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
71 #ifdef NGX_QUIC_DEBUG_ALLOC
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
72 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic alloc buffer %p", b);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
73 #endif
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
74
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
75 ngx_memzero(b, sizeof(ngx_buf_t));
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
76
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
77 b->tag = (ngx_buf_tag_t) &ngx_quic_alloc_buf;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
78 b->temporary = 1;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
79 b->shadow = b;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
80
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
81 b->start = p;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
82 b->pos = p;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
83 b->last = p;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
84 b->end = p + NGX_QUIC_BUFFER_SIZE;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
85
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
86 ngx_quic_buf_set_refs(b, 1);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
87
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
88 return b;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
89 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
90
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
91
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
92 static void
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
93 ngx_quic_free_buf(ngx_connection_t *c, ngx_buf_t *b)
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
94 {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
95 ngx_buf_t *shadow;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
96 ngx_quic_connection_t *qc;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
97
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
98 qc = ngx_quic_get_connection(c);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
99
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
100 ngx_quic_buf_dec_refs(b);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
101
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
102 #ifdef NGX_QUIC_DEBUG_ALLOC
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
103 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
104 "quic free buffer %p r:%ui",
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
105 b, (ngx_uint_t) ngx_quic_buf_refs(b));
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
106 #endif
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
107
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
108 shadow = b->shadow;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
109
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
110 if (ngx_quic_buf_refs(b) == 0) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
111 shadow->shadow = qc->free_bufs;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
112 qc->free_bufs = shadow;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
113 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
114
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
115 if (b != shadow) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
116 b->shadow = qc->free_shadow_bufs;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
117 qc->free_shadow_bufs = b;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
118 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
119
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
120 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
121
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
122
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
123 static ngx_buf_t *
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
124 ngx_quic_clone_buf(ngx_connection_t *c, ngx_buf_t *b)
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
125 {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
126 ngx_buf_t *nb;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
127 ngx_quic_connection_t *qc;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
128
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
129 qc = ngx_quic_get_connection(c);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
130
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
131 nb = qc->free_shadow_bufs;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
132
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
133 if (nb) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
134 qc->free_shadow_bufs = nb->shadow;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
135
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
136 } else {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
137 nb = ngx_palloc(c->pool, sizeof(ngx_buf_t));
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
138 if (nb == NULL) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
139 return NULL;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
140 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
141
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
142 #ifdef NGX_QUIC_DEBUG_ALLOC
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
143 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
144 "quic new shadow buffer n:%ui", ++qc->nshadowbufs);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
145 #endif
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
146 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
147
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
148 *nb = *b;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
149
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
150 ngx_quic_buf_inc_refs(b);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
151
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
152 #ifdef NGX_QUIC_DEBUG_ALLOC
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
153 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
154 "quic clone buffer %p %p r:%ui",
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
155 b, nb, (ngx_uint_t) ngx_quic_buf_refs(b));
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
156 #endif
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
157
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
158 return nb;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
159 }
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
160
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 ngx_quic_frame_t *
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 ngx_quic_alloc_frame(ngx_connection_t *c)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 ngx_queue_t *q;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 ngx_quic_frame_t *frame;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 ngx_quic_connection_t *qc;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 qc = ngx_quic_get_connection(c);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 if (!ngx_queue_empty(&qc->free_frames)) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 q = ngx_queue_head(&qc->free_frames);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 ngx_queue_remove(&frame->queue);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 #ifdef NGX_QUIC_DEBUG_ALLOC
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 "quic reuse frame n:%ui", qc->nframes);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 #endif
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182
8883
404de224517e QUIC: limited the total number of frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8820
diff changeset
183 } else if (qc->nframes < 10000) {
8803
6c213bec71c2 QUIC: fixed double memzero of new frames in ngx_quic_alloc_frame().
Sergey Kandaurov <pluknet@nginx.com>
parents: 8782
diff changeset
184 frame = ngx_palloc(c->pool, sizeof(ngx_quic_frame_t));
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 if (frame == NULL) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 return NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 ++qc->nframes;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190
8883
404de224517e QUIC: limited the total number of frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8820
diff changeset
191 #ifdef NGX_QUIC_DEBUG_ALLOC
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 "quic alloc frame n:%ui", qc->nframes);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 #endif
8883
404de224517e QUIC: limited the total number of frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8820
diff changeset
195
404de224517e QUIC: limited the total number of frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8820
diff changeset
196 } else {
404de224517e QUIC: limited the total number of frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8820
diff changeset
197 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic flood detected");
404de224517e QUIC: limited the total number of frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8820
diff changeset
198 return NULL;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_memzero(frame, sizeof(ngx_quic_frame_t));
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 return frame;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 void
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 ngx_quic_connection_t *qc;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 qc = ngx_quic_get_connection(c);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 if (frame->data) {
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
215 ngx_quic_free_chain(c, frame->data);
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 ngx_queue_insert_head(&qc->free_frames, &frame->queue);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 #ifdef NGX_QUIC_DEBUG_ALLOC
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 "quic free frame n:%ui", qc->nframes);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 #endif
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8753
diff changeset
227 void
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
228 ngx_quic_trim_chain(ngx_chain_t *in, size_t size)
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
229 {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
230 size_t n;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
231 ngx_buf_t *b;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
232
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
233 while (in && size > 0) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
234 b = in->buf;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
235 n = ngx_min((size_t) (b->last - b->pos), size);
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
236
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
237 b->pos += n;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
238 size -= n;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
239
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
240 if (b->pos == b->last) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
241 in = in->next;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
242 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
243 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
244 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
245
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
246
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
247 void
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
248 ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in)
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 {
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
250 ngx_chain_t *cl;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 while (in) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 cl = in;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 in = in->next;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
256 ngx_quic_free_buf(c, cl->buf);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
257 ngx_free_chain(c->pool, cl);
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 void
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 ngx_queue_t *q;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 ngx_quic_frame_t *f;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 do {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 q = ngx_queue_head(frames);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 if (q == ngx_queue_sentinel(frames)) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 ngx_queue_remove(q);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 ngx_quic_free_frame(c, f);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 } while (1);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 void
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 ngx_quic_send_ctx_t *ctx;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 ctx = ngx_quic_get_send_ctx(qc, frame->level);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 ngx_queue_insert_tail(&ctx->frames, &frame->queue);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 frame->len = ngx_quic_create_frame(NULL, frame);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 /* always succeeds */
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 if (qc->closing) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 return;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 ngx_post_event(&qc->push, &ngx_posted_events);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 ngx_int_t
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 size_t shrink;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 ngx_quic_frame_t *nf;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 ngx_quic_ordered_frame_t *of, *onf;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 switch (f->type) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 case NGX_QUIC_FT_CRYPTO:
8820
4009f120cad4 QUIC: eliminated stream type from ngx_quic_stream_frame_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8803
diff changeset
313 case NGX_QUIC_FT_STREAM:
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 default:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 return NGX_DECLINED;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 if ((size_t) f->len <= len) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 return NGX_OK;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 shrink = f->len - len;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 "quic split frame now:%uz need:%uz shrink:%uz",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 f->len, len, shrink);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 of = &f->u.ord;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 if (of->length <= shrink) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 return NGX_DECLINED;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 of->length -= shrink;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 f->len = ngx_quic_create_frame(NULL, f);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 if ((size_t) f->len > len) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 ngx_log_error(NGX_LOG_ERR, c->log, 0, "could not split QUIC frame");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 return NGX_ERROR;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 nf = ngx_quic_alloc_frame(c);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 if (nf == NULL) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 return NGX_ERROR;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 *nf = *f;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 onf = &nf->u.ord;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351 onf->offset += of->length;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 onf->length = shrink;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 nf->len = ngx_quic_create_frame(NULL, nf);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
355 f->data = ngx_quic_read_chain(c, &nf->data, of->length);
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
356 if (f->data == NGX_CHAIN_ERROR) {
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 return NGX_ERROR;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360 ngx_queue_insert_after(&f->queue, &nf->queue);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 return NGX_OK;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
366 ngx_chain_t *
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
367 ngx_quic_read_chain(ngx_connection_t *c, ngx_chain_t **chain, off_t limit)
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 {
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
369 off_t n;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
370 ngx_buf_t *b;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
371 ngx_chain_t *out, *cl, **ll;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
373 out = *chain;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
375 for (ll = &out; *ll; ll = &(*ll)->next) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
376 b = (*ll)->buf;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
377
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
378 if (b->sync) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
379 /* hole */
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
380 break;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
383 if (limit == 0) {
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
387 n = b->last - b->pos;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
388
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
389 if (n > limit) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
390 goto split;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
391 }
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
392
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
393 limit -= n;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
396 *chain = *ll;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
397 *ll = NULL;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
398
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
399 return out;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
400
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
401 split:
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
402
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
403 cl = ngx_alloc_chain_link(c->pool);
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
404 if (cl == NULL) {
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 return NGX_CHAIN_ERROR;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
408 cl->buf = ngx_quic_clone_buf(c, b);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
409 if (cl->buf == NULL) {
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
410 return NGX_CHAIN_ERROR;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
413 cl->buf->pos += limit;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
414 b->last = cl->buf->pos;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
415 b->last_buf = 0;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
417 ll = &(*ll)->next;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
418 cl->next = *ll;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
419 *ll = NULL;
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
420 *chain = cl;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422 return out;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 ngx_chain_t *
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
427 ngx_quic_alloc_chain(ngx_connection_t *c)
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 {
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
429 ngx_chain_t *cl;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431 cl = ngx_alloc_chain_link(c->pool);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 if (cl == NULL) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 return NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435
8950
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
436 cl->buf = ngx_quic_alloc_buf(c);
fb811b6c76ee QUIC: refactored buffer allocation, spliting and freeing.
Roman Arutyunyan <arut@nginx.com>
parents: 8949
diff changeset
437 if (cl->buf == NULL) {
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 return NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 return cl;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 ngx_chain_t *
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 ngx_quic_copy_buf(ngx_connection_t *c, u_char *data, size_t len)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 size_t n;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 ngx_buf_t *b;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 ngx_chain_t *cl, *out, **ll;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 out = NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 ll = &out;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 while (len) {
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
456 cl = ngx_quic_alloc_chain(c);
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 if (cl == NULL) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 return NGX_CHAIN_ERROR;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461 b = cl->buf;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 n = ngx_min((size_t) (b->end - b->last), len);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 b->last = ngx_cpymem(b->last, data, n);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 data += n;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 len -= n;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 *ll = cl;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 ll = &cl->next;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 *ll = NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 return out;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 ngx_chain_t *
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
480 ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *in,
8946
56dec0d4e5b1 QUIC: avoid excessive buffer allocations in stream output.
Roman Arutyunyan <arut@nginx.com>
parents: 8919
diff changeset
481 off_t limit, off_t offset)
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 {
8946
56dec0d4e5b1 QUIC: avoid excessive buffer allocations in stream output.
Roman Arutyunyan <arut@nginx.com>
parents: 8919
diff changeset
483 off_t n;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
484 u_char *p;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
485 ngx_buf_t *b;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
486 ngx_chain_t *cl, *sl;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487
8946
56dec0d4e5b1 QUIC: avoid excessive buffer allocations in stream output.
Roman Arutyunyan <arut@nginx.com>
parents: 8919
diff changeset
488 while (in && limit) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
489 cl = *chain;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
491 if (cl == NULL) {
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
492 cl = ngx_quic_alloc_chain(c);
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
493 if (cl == NULL) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
494 return NGX_CHAIN_ERROR;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
495 }
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
497 cl->buf->last = cl->buf->end;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
498 cl->buf->sync = 1; /* hole */
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
499 cl->next = NULL;
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
500 *chain = cl;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
503 b = cl->buf;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
504 n = b->last - b->pos;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
506 if (n <= offset) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
507 offset -= n;
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
508 chain = &cl->next;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
509 continue;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
512 if (b->sync && offset > 0) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
513 /* split hole at offset */
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
514
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
515 b->sync = 0;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
516
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
517 sl = ngx_quic_read_chain(c, &cl, offset);
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
518 if (cl == NGX_CHAIN_ERROR) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
519 return NGX_CHAIN_ERROR;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
520 }
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
522 sl->buf->sync = 1;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
523 cl->buf->sync = 1;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
524
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
525 *chain = sl;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
526 sl->next = cl;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
527 continue;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529
8946
56dec0d4e5b1 QUIC: avoid excessive buffer allocations in stream output.
Roman Arutyunyan <arut@nginx.com>
parents: 8919
diff changeset
530 for (p = b->pos + offset; p != b->last && in && limit; /* void */ ) {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
531 n = ngx_min(b->last - p, in->buf->last - in->buf->pos);
8946
56dec0d4e5b1 QUIC: avoid excessive buffer allocations in stream output.
Roman Arutyunyan <arut@nginx.com>
parents: 8919
diff changeset
532 n = ngx_min(n, limit);
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
534 if (b->sync) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
535 ngx_memcpy(p, in->buf->pos, n);
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
536 }
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
538 p += n;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
539 in->buf->pos += n;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
540 offset += n;
8946
56dec0d4e5b1 QUIC: avoid excessive buffer allocations in stream output.
Roman Arutyunyan <arut@nginx.com>
parents: 8919
diff changeset
541 limit -= n;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
543 if (in->buf->pos == in->buf->last) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
544 in = in->next;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
545 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
546 }
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
548 if (b->sync && p == b->last) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
549 b->sync = 0;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
550 continue;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
551 }
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
552
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
553 if (b->sync && p != b->pos) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
554 /* split hole at p - b->pos */
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
555
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
556 b->sync = 0;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
557
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
558 sl = ngx_quic_read_chain(c, &cl, p - b->pos);
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
559 if (sl == NGX_CHAIN_ERROR) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
560 return NGX_CHAIN_ERROR;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
561 }
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
563 cl->buf->sync = 1;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
564
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
565 *chain = sl;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
566 sl->next = cl;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
570 return in;
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 #if (NGX_DEBUG)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576 void
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577 ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx)
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579 u_char *p, *last, *pos, *end;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 ssize_t n;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581 uint64_t gap, range, largest, smallest;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 ngx_uint_t i;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 u_char buf[NGX_MAX_ERROR_STR];
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 p = buf;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 last = buf + sizeof(buf);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 switch (f->type) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590 case NGX_QUIC_FT_CRYPTO:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
591 p = ngx_slprintf(p, last, "CRYPTO len:%uL off:%uL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 f->u.crypto.length, f->u.crypto.offset);
8919
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
593
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
594 #ifdef NGX_QUIC_DEBUG_FRAMES
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
595 {
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
596 ngx_chain_t *cl;
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
597
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
598 p = ngx_slprintf(p, last, " data:");
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
599
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
600 for (cl = f->data; cl; cl = cl->next) {
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
601 p = ngx_slprintf(p, last, "%*xs",
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
602 cl->buf->last - cl->buf->pos, cl->buf->pos);
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
603 }
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
604 }
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
605 #endif
a6a328ebd362 QUIC: logging of CRYPTO frame payload under NGX_QUIC_DEBUG_FRAMES.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8883
diff changeset
606
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609 case NGX_QUIC_FT_PADDING:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610 p = ngx_slprintf(p, last, "PADDING");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 case NGX_QUIC_FT_ACK:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614 case NGX_QUIC_FT_ACK_ECN:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 p = ngx_slprintf(p, last, "ACK n:%ui delay:%uL ",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617 f->u.ack.range_count, f->u.ack.delay);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 if (f->data) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620 pos = f->data->buf->pos;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621 end = f->data->buf->last;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 } else {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 pos = NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625 end = NULL;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
626 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628 largest = f->u.ack.largest;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629 smallest = f->u.ack.largest - f->u.ack.first_range;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 if (largest == smallest) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 p = ngx_slprintf(p, last, "%uL", largest);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
633
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
634 } else {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
635 p = ngx_slprintf(p, last, "%uL-%uL", largest, smallest);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
636 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
637
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
638 for (i = 0; i < f->u.ack.range_count; i++) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
639 n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
640 if (n == NGX_ERROR) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
642 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
643
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
644 pos += n;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646 largest = smallest - gap - 2;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
647 smallest = largest - range;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
648
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
649 if (largest == smallest) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
650 p = ngx_slprintf(p, last, " %uL", largest);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
651
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
652 } else {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653 p = ngx_slprintf(p, last, " %uL-%uL", largest, smallest);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
654 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
655 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
656
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657 if (f->type == NGX_QUIC_FT_ACK_ECN) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658 p = ngx_slprintf(p, last, " ECN counters ect0:%uL ect1:%uL ce:%uL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
659 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
661 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
662
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
663 case NGX_QUIC_FT_PING:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
664 p = ngx_slprintf(p, last, "PING");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
665 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
666
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
667 case NGX_QUIC_FT_NEW_CONNECTION_ID:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
668 p = ngx_slprintf(p, last,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
669 "NEW_CONNECTION_ID seq:%uL retire:%uL len:%ud",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
670 f->u.ncid.seqnum, f->u.ncid.retire, f->u.ncid.len);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
671 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
672
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
673 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
674 p = ngx_slprintf(p, last, "RETIRE_CONNECTION_ID seqnum:%uL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
675 f->u.retire_cid.sequence_number);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
676 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
677
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
678 case NGX_QUIC_FT_CONNECTION_CLOSE:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
679 case NGX_QUIC_FT_CONNECTION_CLOSE_APP:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
680 p = ngx_slprintf(p, last, "CONNECTION_CLOSE%s err:%ui",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
681 f->type == NGX_QUIC_FT_CONNECTION_CLOSE ? "" : "_APP",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
682 f->u.close.error_code);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
683
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684 if (f->u.close.reason.len) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685 p = ngx_slprintf(p, last, " %V", &f->u.close.reason);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
686 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
687
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
688 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 p = ngx_slprintf(p, last, " ft:%ui", f->u.close.frame_type);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
691
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693
8820
4009f120cad4 QUIC: eliminated stream type from ngx_quic_stream_frame_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8803
diff changeset
694 case NGX_QUIC_FT_STREAM:
8749
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
695 p = ngx_slprintf(p, last, "STREAM id:0x%xL", f->u.stream.stream_id);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697 if (f->u.stream.off) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
698 p = ngx_slprintf(p, last, " off:%uL", f->u.stream.offset);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
701 if (f->u.stream.len) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
702 p = ngx_slprintf(p, last, " len:%uL", f->u.stream.length);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705 if (f->u.stream.fin) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 p = ngx_slprintf(p, last, " fin:1");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
708
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
709 #ifdef NGX_QUIC_DEBUG_FRAMES
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
710 {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711 ngx_chain_t *cl;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
712
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
713 p = ngx_slprintf(p, last, " data:");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
714
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
715 for (cl = f->data; cl; cl = cl->next) {
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
716 p = ngx_slprintf(p, last, "%*xs",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
717 cl->buf->last - cl->buf->pos, cl->buf->pos);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
718 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
719 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
720 #endif
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
721
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
722 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
723
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
724 case NGX_QUIC_FT_MAX_DATA:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
725 p = ngx_slprintf(p, last, "MAX_DATA max_data:%uL on recv",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
726 f->u.max_data.max_data);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
727 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
728
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
729 case NGX_QUIC_FT_RESET_STREAM:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
730 p = ngx_slprintf(p, last, "RESET_STREAM"
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
731 " id:0x%xL error_code:0x%xL final_size:0x%xL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
732 f->u.reset_stream.id, f->u.reset_stream.error_code,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
733 f->u.reset_stream.final_size);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
734 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
736 case NGX_QUIC_FT_STOP_SENDING:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
737 p = ngx_slprintf(p, last, "STOP_SENDING id:0x%xL err:0x%xL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
738 f->u.stop_sending.id, f->u.stop_sending.error_code);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
739 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
740
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
741 case NGX_QUIC_FT_STREAMS_BLOCKED:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
742 case NGX_QUIC_FT_STREAMS_BLOCKED2:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
743 p = ngx_slprintf(p, last, "STREAMS_BLOCKED limit:%uL bidi:%ui",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
744 f->u.streams_blocked.limit, f->u.streams_blocked.bidi);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
745 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
746
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
747 case NGX_QUIC_FT_MAX_STREAMS:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
748 case NGX_QUIC_FT_MAX_STREAMS2:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
749 p = ngx_slprintf(p, last, "MAX_STREAMS limit:%uL bidi:%ui",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
750 f->u.max_streams.limit, f->u.max_streams.bidi);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
751 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
752
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
753 case NGX_QUIC_FT_MAX_STREAM_DATA:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
754 p = ngx_slprintf(p, last, "MAX_STREAM_DATA id:0x%xL limit:%uL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
755 f->u.max_stream_data.id, f->u.max_stream_data.limit);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
756 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
757
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759 case NGX_QUIC_FT_DATA_BLOCKED:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
760 p = ngx_slprintf(p, last, "DATA_BLOCKED limit:%uL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
761 f->u.data_blocked.limit);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
762 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
763
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
764 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
765 p = ngx_slprintf(p, last, "STREAM_DATA_BLOCKED id:0x%xL limit:%uL",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
766 f->u.stream_data_blocked.id,
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
767 f->u.stream_data_blocked.limit);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
768 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
769
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
770 case NGX_QUIC_FT_PATH_CHALLENGE:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
771 p = ngx_slprintf(p, last, "PATH_CHALLENGE data:0x%*xs",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
772 sizeof(f->u.path_challenge.data),
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
773 f->u.path_challenge.data);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
774 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
775
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
776 case NGX_QUIC_FT_PATH_RESPONSE:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777 p = ngx_slprintf(p, last, "PATH_RESPONSE data:0x%*xs",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778 sizeof(f->u.path_challenge.data),
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779 f->u.path_challenge.data);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
780 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
781
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782 case NGX_QUIC_FT_NEW_TOKEN:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783 p = ngx_slprintf(p, last, "NEW_TOKEN");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786 case NGX_QUIC_FT_HANDSHAKE_DONE:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 p = ngx_slprintf(p, last, "HANDSHAKE DONE");
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790 default:
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 p = ngx_slprintf(p, last, "unknown type 0x%xi", f->type);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792 break;
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
793 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, "quic frame %s %s %*s",
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796 tx ? "tx" : "rx", ngx_quic_level_name(f->level),
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797 p - buf, buf);
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
798 }
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799
660c4a2f95f3 QUIC: separate files for frames related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800 #endif