annotate src/event/quic/ngx_event_quic_streams.c @ 8640:c4f249d485e3 quic

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