annotate src/event/quic/ngx_event_quic_streams.c @ 8905:832723a49026 quic

QUIC: stop processing new client streams at the closing state.
author Sergey Kandaurov <pluknet@nginx.com>
date Fri, 12 Nov 2021 16:29:07 +0300
parents b4c7853b0488
children 41caf5410110
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 #define NGX_QUIC_STREAM_GONE (void *) -1
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 static ngx_quic_stream_t *ngx_quic_create_client_stream(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 uint64_t id);
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
18 static ngx_int_t ngx_quic_init_stream(ngx_quic_stream_t *qs);
8886
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
19 static void ngx_quic_init_streams_handler(ngx_connection_t *c);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c,
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
21 uint64_t id);
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
22 static void ngx_quic_empty_handler(ngx_event_t *ev);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 size_t size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 size_t size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 static ngx_chain_t *ngx_quic_stream_send_chain(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 ngx_chain_t *in, off_t limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 static size_t ngx_quic_max_stream_flow(ngx_connection_t *c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 static void ngx_quic_stream_cleanup_handler(void *data);
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
31 static ngx_int_t ngx_quic_control_flow(ngx_connection_t *c, uint64_t last);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
32 static ngx_int_t ngx_quic_update_flow(ngx_connection_t *c, uint64_t last);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_connection_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 uint64_t id;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
39 ngx_quic_stream_t *qs, *nqs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43 qc = ngx_quic_get_connection(qs->parent);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 if (bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 if (qc->streams.server_streams_bidi
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 >= qc->streams.server_max_streams_bidi)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 "quic too many server bidi streams:%uL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 qc->streams.server_streams_bidi);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 id = (qc->streams.server_streams_bidi << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 | NGX_QUIC_STREAM_SERVER_INITIATED;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 "quic creating server bidi stream"
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 " streams:%uL max:%uL id:0x%xL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 qc->streams.server_streams_bidi,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 qc->streams.server_max_streams_bidi, id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 qc->streams.server_streams_bidi++;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 if (qc->streams.server_streams_uni
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 >= qc->streams.server_max_streams_uni)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 "quic too many server uni streams:%uL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 qc->streams.server_streams_uni);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 id = (qc->streams.server_streams_uni << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 | NGX_QUIC_STREAM_SERVER_INITIATED
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 "quic creating server uni stream"
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 " streams:%uL max:%uL id:0x%xL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 qc->streams.server_streams_uni,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 qc->streams.server_max_streams_uni, id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 qc->streams.server_streams_uni++;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
89 nqs = ngx_quic_create_stream(qs->parent, id);
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
90 if (nqs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
94 return nqs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 ngx_rbtree_node_t **p;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 ngx_quic_stream_t *qn, *qnt;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 for ( ;; ) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 qn = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 qnt = (ngx_quic_stream_t *) temp;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 if (*p == sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 break;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 temp = *p;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 *p = node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 node->parent = temp;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 node->left = sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 node->right = sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 ngx_rbt_red(node);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 ngx_quic_stream_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 ngx_quic_find_stream(ngx_rbtree_t *rbtree, uint64_t id)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 ngx_rbtree_node_t *node, *sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 ngx_quic_stream_t *qn;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 node = rbtree->root;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 sentinel = rbtree->sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 while (node != sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 qn = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 if (id == qn->id) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 return qn;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 node = (id < qn->id) ? node->left : node->right;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 ngx_quic_close_streams(ngx_connection_t *c, ngx_quic_connection_t *qc)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 {
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
152 ngx_pool_t *pool;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
153 ngx_queue_t *q;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 ngx_event_t *rev, *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 ngx_rbtree_t *tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 #if (NGX_DEBUG)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 ngx_uint_t ns;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 #endif
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
163 while (!ngx_queue_empty(&qc->streams.uninitialized)) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
164 q = ngx_queue_head(&qc->streams.uninitialized);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
165 ngx_queue_remove(q);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
166
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
167 qs = ngx_queue_data(q, ngx_quic_stream_t, queue);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
168 pool = qs->connection->pool;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
169
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
170 ngx_close_connection(qs->connection);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
171 ngx_destroy_pool(pool);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
172 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
173
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 tree = &qc->streams.tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 if (tree->root == tree->sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 #if (NGX_DEBUG)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 ns = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 #endif
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 node = ngx_rbtree_next(tree, node))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 qs = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
190 rev = qs->connection->read;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 rev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 rev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
194 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 wev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 ngx_post_event(rev, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 if (rev->timer_set) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_del_timer(rev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 #if (NGX_DEBUG)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 ns++;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 #endif
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 "quic connection has %ui active streams", ns);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224
8875
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
225 wev = c->write;
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
226
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
227 if (wev->error) {
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
228 return NGX_OK;
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
229 }
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
230
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 frame->type = NGX_QUIC_FT_RESET_STREAM;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 frame->u.reset_stream.id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 frame->u.reset_stream.error_code = err;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 frame->u.reset_stream.final_size = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 wev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
255 ngx_int_t
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
256 ngx_quic_shutdown_stream(ngx_connection_t *c, int how)
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
257 {
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
258 ngx_event_t *wev;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
259 ngx_connection_t *pc;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
260 ngx_quic_frame_t *frame;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
261 ngx_quic_stream_t *qs;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
262 ngx_quic_connection_t *qc;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
263
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
264 if (how != NGX_WRITE_SHUTDOWN) {
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
265 return NGX_OK;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
266 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
267
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
268 wev = c->write;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
269
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
270 if (wev->error) {
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
271 return NGX_OK;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
272 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
273
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
274 qs = c->quic;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
275 pc = qs->parent;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
276 qc = ngx_quic_get_connection(pc);
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
277
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
278 frame = ngx_quic_alloc_frame(pc);
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
279 if (frame == NULL) {
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
280 return NGX_ERROR;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
281 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
282
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
283 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
284 "quic stream id:0x%xL shutdown", qs->id);
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
285
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
286 frame->level = ssl_encryption_application;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
287 frame->type = NGX_QUIC_FT_STREAM;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
288 frame->u.stream.off = 1;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
289 frame->u.stream.len = 1;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
290 frame->u.stream.fin = 1;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
291
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
292 frame->u.stream.stream_id = qs->id;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
293 frame->u.stream.offset = c->sent;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
294 frame->u.stream.length = 0;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
295
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
296 ngx_quic_queue_frame(qc, frame);
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
297
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
298 wev->ready = 1;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
299 wev->error = 1;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
300
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
301 return NGX_OK;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
302 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
303
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
304
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 static ngx_quic_stream_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 ngx_quic_create_client_stream(ngx_connection_t *c, uint64_t id)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 uint64_t min_id;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
309 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 "quic stream id:0x%xL is new", id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316
8905
832723a49026 QUIC: stop processing new client streams at the closing state.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8890
diff changeset
317 if (qc->shutdown || qc->closing) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 if ((id >> 2) < qc->streams.server_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 if ((id >> 2) < qc->streams.client_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 if ((id >> 2) >= qc->streams.client_max_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 min_id = (qc->streams.client_streams_uni << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 qc->streams.client_streams_uni = (id >> 2) + 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 if ((id >> 2) < qc->streams.server_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 if ((id >> 2) < qc->streams.client_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360 if ((id >> 2) >= qc->streams.client_max_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 min_id = (qc->streams.client_streams_bidi << 2);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 qc->streams.client_streams_bidi = (id >> 2) + 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
370 * RFC 9000, 2.1. Stream Types and Identifiers
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371 *
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
372 * successive streams of each type are created with numerically increasing
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
373 * stream IDs. A stream ID that is used out of order results in all
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
374 * streams of that type with lower-numbered stream IDs also being opened.
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377 for ( /* void */ ; min_id < id; min_id += 0x04) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
379 qs = ngx_quic_create_stream(c, min_id);
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
380 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
384 if (ngx_quic_init_stream(qs) != NGX_OK) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
385 return NULL;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
386 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387
8905
832723a49026 QUIC: stop processing new client streams at the closing state.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8890
diff changeset
388 if (qc->shutdown || qc->closing) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
393 return ngx_quic_create_stream(c, id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
397 static ngx_int_t
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
398 ngx_quic_init_stream(ngx_quic_stream_t *qs)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
399 {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
400 ngx_connection_t *c;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
401 ngx_quic_connection_t *qc;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
402
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
403 qc = ngx_quic_get_connection(qs->parent);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
404
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
405 c = qs->connection;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
406
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
407 if (!qc->streams.initialized) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
408 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
409 "quic postpone stream init");
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
410
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
411 ngx_queue_insert_tail(&qc->streams.uninitialized, &qs->queue);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
412 return NGX_OK;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
413 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
414
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
415 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic init stream");
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
416
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
417 c->listening->handler(c);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
418
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
419 return NGX_OK;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
420 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
421
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
422
8886
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
423 ngx_int_t
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
424 ngx_quic_init_streams(ngx_connection_t *c)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
425 {
8886
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
426 ngx_int_t rc;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
427 ngx_quic_connection_t *qc;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
428
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
429 qc = ngx_quic_get_connection(c);
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
430
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
431 if (qc->streams.initialized) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
432 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
433 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
434
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
435 rc = ngx_ssl_ocsp_validate(c);
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
436
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
437 if (rc == NGX_ERROR) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
438 return NGX_ERROR;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
439 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
440
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
441 if (rc == NGX_AGAIN) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
442 c->ssl->handler = ngx_quic_init_streams_handler;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
443 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
444 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
445
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
446 ngx_quic_init_streams_handler(c);
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
447
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
448 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
449 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
450
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
451
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
452 static void
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
453 ngx_quic_init_streams_handler(ngx_connection_t *c)
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
454 {
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
455 ngx_queue_t *q;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
456 ngx_quic_stream_t *qs;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
457 ngx_quic_connection_t *qc;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
458
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
459 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic init streams");
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
460
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
461 qc = ngx_quic_get_connection(c);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
462
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
463 while (!ngx_queue_empty(&qc->streams.uninitialized)) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
464 q = ngx_queue_head(&qc->streams.uninitialized);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
465 ngx_queue_remove(q);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
466
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
467 qs = ngx_queue_data(q, ngx_quic_stream_t, queue);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
468
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
469 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, qs->connection->log, 0,
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
470 "quic init postponed stream");
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
471
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
472 qs->connection->listening->handler(qs->connection);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
473 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
474
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
475 qc->streams.initialized = 1;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
476 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
477
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
478
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 static ngx_quic_stream_t *
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
480 ngx_quic_create_stream(ngx_connection_t *c, uint64_t id)
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 ngx_log_t *log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 ngx_pool_t *pool;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
484 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
485 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486 ngx_pool_cleanup_t *cln;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490 "quic stream id:0x%xL create", id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
495 if (pool == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
499 qs = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
500 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
505 qs->node.key = id;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
506 qs->parent = c;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
507 qs->id = id;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
508 qs->final_size = (uint64_t) -1;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 log = ngx_palloc(pool, sizeof(ngx_log_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511 if (log == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 *log = *c->log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 pool->log = log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518
8860
a2cef164a924 QUIC: simplified stream fd initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
519 sc = ngx_get_connection(c->fd, log);
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
520 if (sc == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
525 qs->connection = sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
527 sc->quic = qs;
8842
486c6a9be111 QUIC: store QUIC connection fd in stream fake connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8841
diff changeset
528 sc->shared = 1;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
529 sc->type = SOCK_STREAM;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
530 sc->pool = pool;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
531 sc->ssl = c->ssl;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
532 sc->sockaddr = c->sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
533 sc->listening = c->listening;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
534 sc->addr_text = c->addr_text;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
535 sc->local_sockaddr = c->local_sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
536 sc->local_socklen = c->local_socklen;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
537 sc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
8861
630ecd703805 QUIC: set NGX_TCP_NODELAY_DISABLED for fake stream connections.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8860
diff changeset
538 sc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
540 sc->recv = ngx_quic_stream_recv;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
541 sc->send = ngx_quic_stream_send;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
542 sc->send_chain = ngx_quic_stream_send_chain;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
544 sc->read->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
545 sc->write->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
546
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
547 sc->read->handler = ngx_quic_empty_handler;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
548 sc->write->handler = ngx_quic_empty_handler;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
549
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
550 log->connection = sc->number;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 {
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
555 sc->write->ready = 1;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
560 qs->send_max_data = qc->ctp.initial_max_stream_data_uni;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
561
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
562 } else {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
563 qs->recv_max_data = qc->tp.initial_max_stream_data_uni;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
568 qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_remote;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
569 qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_local;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
570
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 } else {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
572 qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_local;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
573 qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_remote;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
577 qs->recv_window = qs->recv_max_data;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
578
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579 cln = ngx_pool_cleanup_add(pool, 0);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 if (cln == NULL) {
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
581 ngx_close_connection(sc);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 cln->handler = ngx_quic_stream_cleanup_handler;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
587 cln->data = sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
589 ngx_rbtree_insert(&qc->streams.tree, &qs->node);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
591 return qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
595 static void
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
596 ngx_quic_empty_handler(ngx_event_t *ev)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
597 {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
598 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
599
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
600
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603 {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
604 ssize_t len, n;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
605 ngx_buf_t *b;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
606 ngx_chain_t *cl, **ll;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
607 ngx_event_t *rev;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
608 ngx_connection_t *pc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
609 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 rev = c->read;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615 if (rev->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
619 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
620 "quic stream id:0x%xL recv eof:%d buf:%uz",
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
621 qs->id, rev->pending_eof, size);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
623 if (qs->in == NULL || qs->in->buf->sync) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 rev->ready = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
626 if (qs->recv_offset == qs->final_size) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 rev->eof = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 "quic stream id:0x%xL recv() not ready", qs->id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
633 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
634 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
635
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
636 len = 0;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
637 cl = qs->in;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
638
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
639 for (ll = &cl; *ll; ll = &(*ll)->next) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
640 b = (*ll)->buf;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
642 if (b->sync) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
643 /* hole */
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
644 break;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
645 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
646
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
647 n = ngx_min(b->last - b->pos, (ssize_t) size);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
648 buf = ngx_cpymem(buf, b->pos, n);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
649
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
650 len += n;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
651 size -= n;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
652 b->pos += n;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
654 if (b->pos != b->last) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
655 break;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
656 }
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
657 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
659 qs->in = *ll;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
660 *ll = NULL;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
661
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
662 ngx_quic_free_bufs(pc, cl);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
663
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
664 if (qs->in == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
665 rev->ready = rev->pending_eof;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
666 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
667
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
668 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
669 "quic stream id:0x%xL recv len:%z", qs->id, len);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
670
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
671 if (ngx_quic_update_flow(c, qs->recv_offset + len) != NGX_OK) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
672 return NGX_ERROR;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
673 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
674
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
675 return len;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
676 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
677
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
678
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
679 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
680 ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
681 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
682 ngx_buf_t b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
683 ngx_chain_t cl;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685 ngx_memzero(&b, sizeof(ngx_buf_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
686
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
687 b.memory = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
688 b.pos = buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 b.last = buf + size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
691 cl.buf = &b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692 cl.next = NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
694 if (ngx_quic_stream_send_chain(c, &cl, 0) == NGX_CHAIN_ERROR) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
695 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
698 if (b.pos == buf) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
701
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
702 return b.pos - buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 static ngx_chain_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707 ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
708 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
709 size_t n, flow;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
710 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711 ngx_chain_t *cl;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
712 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
713 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
714 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
715 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
716
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
717 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
718 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
719 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
720 wev = c->write;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
721
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
722 if (wev->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
723 return NGX_CHAIN_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
724 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
725
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
726 flow = ngx_quic_max_stream_flow(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
727 if (flow == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
728 wev->ready = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
729 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
730 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
731
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
732 n = (limit && (size_t) limit < flow) ? (size_t) limit : flow;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
733
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
734 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
736 return NGX_CHAIN_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
737 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
738
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
739 frame->data = ngx_quic_copy_chain(pc, in, n);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
740 if (frame->data == NGX_CHAIN_ERROR) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
741 return NGX_CHAIN_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
742 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
743
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
744 for (n = 0, cl = frame->data; cl; cl = cl->next) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
745 n += ngx_buf_size(cl->buf);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
746 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
747
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
748 while (in && ngx_buf_size(in->buf) == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
749 in = in->next;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
750 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
751
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
752 frame->level = ssl_encryption_application;
8820
4009f120cad4 QUIC: eliminated stream type from ngx_quic_stream_frame_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8797
diff changeset
753 frame->type = NGX_QUIC_FT_STREAM;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
754 frame->u.stream.off = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
755 frame->u.stream.len = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
756 frame->u.stream.fin = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
757
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758 frame->u.stream.stream_id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759 frame->u.stream.offset = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
760 frame->u.stream.length = n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
761
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
762 c->sent += n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
763 qc->streams.sent += n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
764
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
765 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
766
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
767 wev->ready = (n < flow) ? 1 : 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
768
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
769 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
770 "quic send_chain sent:%uz", n);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
771
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
772 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
773 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
774
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
775
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
776 static size_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777 ngx_quic_max_stream_flow(ngx_connection_t *c)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779 size_t size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
780 uint64_t sent, unacked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
781 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785 qc = ngx_quic_get_connection(qs->parent);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 size = NGX_QUIC_STREAM_BUFSIZE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 sent = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789 unacked = sent - qs->acked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 if (qc->streams.send_max_data == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792 qc->streams.send_max_data = qc->ctp.initial_max_data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
793 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797 "quic send flow hit buffer size");
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
798 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801 if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802 size = NGX_QUIC_STREAM_BUFSIZE - unacked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
803 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
804
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805 if (qc->streams.sent >= qc->streams.send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
806 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
807 "quic send flow hit MAX_DATA");
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
810
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811 if (qc->streams.sent + size > qc->streams.send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
812 size = qc->streams.send_max_data - qc->streams.sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
813 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
814
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
815 if (sent >= qs->send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
816 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
817 "quic send flow hit MAX_STREAM_DATA");
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
818 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
819 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
820
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
821 if (sent + size > qs->send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
822 size = qs->send_max_data - sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
823 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
824
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
825 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
826 "quic send flow:%uz", size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
827
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
828 return size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
832 static void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
833 ngx_quic_stream_cleanup_handler(void *data)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
834 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
835 ngx_connection_t *c = data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
836
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
839 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
840 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
841
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
842 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
844 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
845
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
846 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
847 "quic stream id:0x%xL cleanup", qs->id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
848
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
849 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
850 ngx_quic_free_bufs(pc, qs->in);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
851
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
852 if (qc->closing) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
853 /* schedule handler call to continue ngx_quic_close_connection() */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
854 ngx_post_event(pc->read, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
855 return;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
856 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
857
8756
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
858 if (qc->error) {
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
859 goto done;
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
860 }
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
861
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
862 c->read->pending_eof = 1;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
863
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
864 (void) ngx_quic_update_flow(c, qs->recv_last);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
865
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
866 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
867 || (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
868 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869 if (!c->read->pending_eof && !c->read->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
871 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
872 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
873 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
874
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
876 frame->type = NGX_QUIC_FT_STOP_SENDING;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
877 frame->u.stop_sending.id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
878 frame->u.stop_sending.error_code = 0x100; /* HTTP/3 no error */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
880 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
881 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
882 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
883
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
884 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
885 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
886 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
887 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
888 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
889
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
890 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
891 frame->type = NGX_QUIC_FT_MAX_STREAMS;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
892
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
893 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
894 frame->u.max_streams.limit = ++qc->streams.client_max_streams_uni;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
895 frame->u.max_streams.bidi = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
896
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
897 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898 frame->u.max_streams.limit = ++qc->streams.client_max_streams_bidi;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
899 frame->u.max_streams.bidi = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
900 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
901
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
902 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
903
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
904 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 /* do not send fin for client unidirectional streams */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
906 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910 if (c->write->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
913
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
914 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915 "quic stream id:0x%xL send fin", qs->id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
918 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922 frame->level = ssl_encryption_application;
8820
4009f120cad4 QUIC: eliminated stream type from ngx_quic_stream_frame_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8797
diff changeset
923 frame->type = NGX_QUIC_FT_STREAM;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
924 frame->u.stream.off = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
925 frame->u.stream.len = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
926 frame->u.stream.fin = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
927
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
928 frame->u.stream.stream_id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929 frame->u.stream.offset = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
930 frame->u.stream.length = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
931
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
932 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
933
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934 done:
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936 (void) ngx_quic_output(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938 if (qc->shutdown) {
8828
a9f6540e61da QUIC: asynchronous shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8827
diff changeset
939 ngx_post_event(pc->read, &ngx_posted_events);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945 ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
946 ngx_quic_frame_t *frame)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
948 uint64_t last;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
949 ngx_pool_t *pool;
8784
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
950 ngx_event_t *rev;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
951 ngx_connection_t *sc;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
952 ngx_quic_stream_t *qs;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
953 ngx_quic_connection_t *qc;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
954 ngx_quic_stream_frame_t *f;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
957 f = &frame->u.stream;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
958
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
959 if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960 && (f->stream_id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
962 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
964 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
965
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
966 /* no overflow since both values are 62-bit */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
967 last = f->offset + f->length;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
969 qs = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
971 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
972 qs = ngx_quic_create_client_stream(c, f->stream_id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
973
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
974 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
977
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
978 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
979 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
980 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
981
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
982 sc = qs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
983
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
984 if (ngx_quic_control_flow(sc, last) != NGX_OK) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985 goto cleanup;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
986 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
988 if (f->fin) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
989 sc->read->pending_eof = 1;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
990 qs->final_size = last;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
991 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
992
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
993 if (f->offset == 0) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
994 sc->read->ready = 1;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
995 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
996
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
997 if (ngx_quic_order_bufs(c, &qs->in, frame->data, f->offset) != NGX_OK) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998 goto cleanup;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
999 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1000
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1001 return ngx_quic_init_stream(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1004 sc = qs->connection;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1005
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1006 rev = sc->read;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1007
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1008 if (rev->error) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1009 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1010 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1011
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1012 if (ngx_quic_control_flow(sc, last) != NGX_OK) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1013 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1014 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1016 if (qs->final_size != (uint64_t) -1 && last > qs->final_size) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1017 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1018 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1019 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1020
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1021 if (last <= qs->recv_offset) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1022 return NGX_OK;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1023 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1024
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1025 if (f->offset < qs->recv_offset) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1026 ngx_quic_trim_bufs(frame->data, qs->recv_offset - f->offset);
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1027 f->offset = qs->recv_offset;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1028 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1029
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1030 if (f->fin) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1031 if (qs->final_size != (uint64_t) -1 && qs->final_size != last) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1032 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1033 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1034 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1035
8783
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1036 if (qs->recv_last > last) {
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1037 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1038 return NGX_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1039 }
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1040
8784
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1041 rev->pending_eof = 1;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1042 qs->final_size = last;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1043 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1044
8784
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1045 if (ngx_quic_order_bufs(c, &qs->in, frame->data,
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1046 f->offset - qs->recv_offset)
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1047 != NGX_OK)
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1048 {
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1049 return NGX_ERROR;
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1050 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1051
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1052 if (f->offset == qs->recv_offset) {
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1053 rev->ready = 1;
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1054
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1055 if (rev->active) {
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1056 rev->handler(rev);
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1057 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1058 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1059
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1060 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1061
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1062 cleanup:
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1063
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1064 pool = sc->pool;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1065
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1066 ngx_close_connection(sc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1067 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1068
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1069 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1070 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1071
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1072
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1073 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1074 ngx_quic_handle_max_data_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1075 ngx_quic_max_data_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1076 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1077 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1078 ngx_rbtree_t *tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1079 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1081 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1082
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084 tree = &qc->streams.tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086 if (f->max_data <= qc->streams.send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1088 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089
8841
1f7f98638dc2 QUIC: fixed null pointer dereference in MAX_DATA handler.
Mariano Di Martino <mariano.dimartino@uhasselt.be>
parents: 8828
diff changeset
1090 if (tree->root != tree->sentinel
1f7f98638dc2 QUIC: fixed null pointer dereference in MAX_DATA handler.
Mariano Di Martino <mariano.dimartino@uhasselt.be>
parents: 8828
diff changeset
1091 && qc->streams.sent >= qc->streams.send_max_data)
1f7f98638dc2 QUIC: fixed null pointer dereference in MAX_DATA handler.
Mariano Di Martino <mariano.dimartino@uhasselt.be>
parents: 8828
diff changeset
1092 {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1093
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1095 node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1096 node = ngx_rbtree_next(tree, node))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1097 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1098 qs = (ngx_quic_stream_t *) node;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
1099 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1100
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1101 if (wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1102 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1103 ngx_post_event(wev, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1104 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1105 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1106 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1107
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1108 qc->streams.send_max_data = f->max_data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1109
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1110 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1111 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115 ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1116 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1119 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1120
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1121
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1122 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1123 ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1124 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125 {
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1126 uint64_t limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 ngx_quic_frame_t *frame;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1128 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1131 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1133 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1134 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1135 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1136 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1137 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1138 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1139
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1140 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1142 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1143 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1145 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1149 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1151 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1152
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1153 limit = qs->recv_max_data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1154
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1155 if (ngx_quic_init_stream(qs) != NGX_OK) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1156 return NGX_ERROR;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1157 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1158
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1159 } else {
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1160 limit = qs->recv_max_data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1161 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1162
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1163 frame = ngx_quic_alloc_frame(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1164 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1165 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1166 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1167
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1168 frame->level = pkt->level;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1169 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 frame->u.max_stream_data.id = f->id;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1171 frame->u.max_stream_data.limit = limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1172
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1173 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1174
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1176 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1178
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1179 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1180 ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1183 uint64_t sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1184 ngx_event_t *wev;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1185 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1188 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1189
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1191 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1193 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1194 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1195 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1196
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1197 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1198
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1199 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1200 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1201
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1202 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1203 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1204 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1206 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1207 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1208 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1209
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1210 if (f->limit > qs->send_max_data) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1211 qs->send_max_data = f->limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1212 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1213
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1214 return ngx_quic_init_stream(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1215 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1216
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1217 if (f->limit <= qs->send_max_data) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1218 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1219 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1220
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1221 sent = qs->connection->sent;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1223 if (sent >= qs->send_max_data) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1224 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1225
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1226 if (wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1227 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1228 ngx_post_event(wev, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1229 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1230 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1232 qs->send_max_data = f->limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1233
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1234 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1235 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1236
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1237
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1238 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1239 ngx_quic_handle_reset_stream_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1240 ngx_quic_header_t *pkt, ngx_quic_reset_stream_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1241 {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1242 ngx_pool_t *pool;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1243 ngx_event_t *rev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1244 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1245 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1246 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1247
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1248 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1249
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1250 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1251 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1252 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1253 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1254 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1255 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1256
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1257 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1258
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1259 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1260 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1261
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1262 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1263 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1264 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1265
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1266 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1267 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1268 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1269
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1270 sc = qs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1271
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1272 rev = sc->read;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1273 rev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1274 rev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1275
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1276 if (ngx_quic_control_flow(sc, f->final_size) != NGX_OK) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1277 goto cleanup;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1278 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1279
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1280 qs->final_size = f->final_size;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1281
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1282 if (ngx_quic_update_flow(sc, qs->final_size) != NGX_OK) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1283 goto cleanup;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1284 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1285
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1286 return ngx_quic_init_stream(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1287 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1288
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1289 sc = qs->connection;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1290
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1291 rev = sc->read;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1292 rev->error = 1;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1293 rev->ready = 1;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1294
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1295 if (ngx_quic_control_flow(sc, f->final_size) != NGX_OK) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1296 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1297 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1298
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1299 if (qs->final_size != (uint64_t) -1 && qs->final_size != f->final_size) {
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1300 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1301 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1302 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1303
8783
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1304 if (qs->recv_last > f->final_size) {
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1305 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1306 return NGX_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1307 }
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1308
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1309 qs->final_size = f->final_size;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1310
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1311 if (ngx_quic_update_flow(sc, qs->final_size) != NGX_OK) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1312 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1313 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1314
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1315 if (rev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1316 rev->handler(rev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1317 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1318
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1319 return NGX_OK;
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1320
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1321 cleanup:
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1322
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1323 pool = sc->pool;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1324
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1325 ngx_close_connection(sc);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1326 ngx_destroy_pool(pool);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1327
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1328 return NGX_ERROR;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1329 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1330
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1331
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1332 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1333 ngx_quic_handle_stop_sending_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1334 ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1335 {
8876
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1336 ngx_pool_t *pool;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1337 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1338 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1339 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1340 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1341
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1342 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1343
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1344 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1345 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1346 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1347 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1348 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1349 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1350
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1351 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1352
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1353 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1354 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1355
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1356 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1357 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1358 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1359
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1360 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1361 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1362 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1363
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1364 sc = qs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1365
8876
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1366 if (ngx_quic_reset_stream(sc, f->error_code) != NGX_OK) {
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1367 pool = sc->pool;
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1368
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1369 ngx_close_connection(sc);
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1370 ngx_destroy_pool(pool);
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1371
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1372 return NGX_ERROR;
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1373 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1374
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
1375 return ngx_quic_init_stream(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1376 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1377
8876
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1378 if (ngx_quic_reset_stream(qs->connection, f->error_code) != NGX_OK) {
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1379 return NGX_ERROR;
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1380 }
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1381
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1382 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1383
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1384 if (wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1385 wev->handler(wev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1386 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1387
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1388 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1389 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1390
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1391
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1392 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1393 ngx_quic_handle_max_streams_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1394 ngx_quic_header_t *pkt, ngx_quic_max_streams_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1395 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1396 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1397
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1398 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1399
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1400 if (f->bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1401 if (qc->streams.server_max_streams_bidi < f->limit) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1402 qc->streams.server_max_streams_bidi = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1403
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1404 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1405 "quic max_streams_bidi:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1406 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1407
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1408 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1409 if (qc->streams.server_max_streams_uni < f->limit) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1410 qc->streams.server_max_streams_uni = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1411
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1412 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1413 "quic max_streams_uni:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1414 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1415 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1416
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1417 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1418 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1419
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1420
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1421 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1422 ngx_quic_handle_stream_ack(ngx_connection_t *c, ngx_quic_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1423 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1424 uint64_t sent, unacked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1425 ngx_event_t *wev;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1426 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1427 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1428
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1429 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1430
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1431 qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1432 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1433 return;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1434 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1435
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1436 wev = qs->connection->write;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1437 sent = qs->connection->sent;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1438 unacked = sent - qs->acked;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1439
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1440 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1441 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1442 ngx_post_event(wev, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1443 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1444
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1445 qs->acked += f->u.stream.length;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1446
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1447 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, qs->connection->log, 0,
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1448 "quic stream ack len:%uL acked:%uL unacked:%uL",
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1449 f->u.stream.length, qs->acked, sent - qs->acked);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1450 }
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1451
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1452
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1453 static ngx_int_t
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1454 ngx_quic_control_flow(ngx_connection_t *c, uint64_t last)
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1455 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1456 uint64_t len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1457 ngx_event_t *rev;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1458 ngx_quic_stream_t *qs;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1459 ngx_quic_connection_t *qc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1460
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1461 rev = c->read;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1462 qs = c->quic;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1463 qc = ngx_quic_get_connection(qs->parent);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1464
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1465 if (last <= qs->recv_last) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1466 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1467 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1468
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1469 len = last - qs->recv_last;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1470
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1471 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1472 "quic flow control msd:%uL/%uL md:%uL/%uL",
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1473 last, qs->recv_max_data, qc->streams.recv_last + len,
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1474 qc->streams.recv_max_data);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1475
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1476 qs->recv_last += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1477
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1478 if (!rev->error && qs->recv_last > qs->recv_max_data) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1479 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1480 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1481 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1482
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1483 qc->streams.recv_last += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1484
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1485 if (qc->streams.recv_last > qc->streams.recv_max_data) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1486 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1487 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1488 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1489
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1490 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1491 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1493
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1494 static ngx_int_t
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1495 ngx_quic_update_flow(ngx_connection_t *c, uint64_t last)
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1496 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1497 uint64_t len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1498 ngx_event_t *rev;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1499 ngx_connection_t *pc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1500 ngx_quic_frame_t *frame;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1501 ngx_quic_stream_t *qs;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1502 ngx_quic_connection_t *qc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1503
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1504 rev = c->read;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1505 qs = c->quic;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1506 pc = qs->parent;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1507 qc = ngx_quic_get_connection(pc);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1508
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1509 if (last <= qs->recv_offset) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1510 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1511 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1512
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1513 len = last - qs->recv_offset;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1514
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1515 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1516 "quic flow update %uL", last);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1517
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1518 qs->recv_offset += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1519
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1520 if (!rev->pending_eof && !rev->error
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1521 && qs->recv_max_data <= qs->recv_offset + qs->recv_window / 2)
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1522 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1523 qs->recv_max_data = qs->recv_offset + qs->recv_window;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1524
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1525 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1526 "quic flow update msd:%uL", qs->recv_max_data);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1527
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1528 frame = ngx_quic_alloc_frame(pc);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1529 if (frame == NULL) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1530 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1531 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1532
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1533 frame->level = ssl_encryption_application;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1534 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1535 frame->u.max_stream_data.id = qs->id;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1536 frame->u.max_stream_data.limit = qs->recv_max_data;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1537
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1538 ngx_quic_queue_frame(qc, frame);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1539 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1540
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1541 qc->streams.recv_offset += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1542
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1543 if (qc->streams.recv_max_data
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1544 <= qc->streams.recv_offset + qc->streams.recv_window / 2)
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1545 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1546 qc->streams.recv_max_data = qc->streams.recv_offset
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1547 + qc->streams.recv_window;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1548
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1549 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1550 "quic flow update md:%uL", qc->streams.recv_max_data);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1551
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1552 frame = ngx_quic_alloc_frame(pc);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1553 if (frame == NULL) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1554 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1555 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1556
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1557 frame->level = ssl_encryption_application;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1558 frame->type = NGX_QUIC_FT_MAX_DATA;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1559 frame->u.max_data.max_data = qc->streams.recv_max_data;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1560
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1561 ngx_quic_queue_frame(qc, frame);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1562 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1563
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1564 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1565 }
8855
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1566
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1567
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1568 ngx_int_t
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1569 ngx_quic_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1570 {
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1571 if (!rev->active && !rev->ready) {
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1572 rev->active = 1;
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1573
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1574 } else if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) {
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1575 rev->active = 0;
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1576 }
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1577
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1578 return NGX_OK;
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1579 }
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1580
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1581
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1582 ngx_int_t
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1583 ngx_quic_handle_write_event(ngx_event_t *wev, size_t lowat)
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1584 {
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1585 if (!wev->active && !wev->ready) {
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1586 wev->active = 1;
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1587
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1588 } else if (wev->active && wev->ready) {
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1589 wev->active = 0;
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1590 }
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1591
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1592 return NGX_OK;
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1593 }