annotate src/event/quic/ngx_event_quic_streams.c @ 8990:b42a041d23a2 quic

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