annotate src/event/quic/ngx_event_quic_streams.c @ 9174:31702c53d2db

QUIC: reusing crypto contexts for header protection.
author Sergey Kandaurov <pluknet@nginx.com>
date Fri, 20 Oct 2023 18:05:07 +0400
parents ad3d34ddfdcc
children 4ed4e1e7f115
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
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
16 static ngx_int_t ngx_quic_do_reset_stream(ngx_quic_stream_t *qs,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
17 ngx_uint_t err);
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
18 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
19 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
20 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
21 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
22 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
23 static void ngx_quic_init_streams_handler(ngx_connection_t *c);
9058
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
24 static ngx_int_t ngx_quic_do_init_streams(ngx_connection_t *c);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 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
26 uint64_t id);
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
27 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
28 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
29 size_t size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 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
31 size_t size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 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
33 ngx_chain_t *in, off_t limit);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
34 static ngx_int_t ngx_quic_stream_flush(ngx_quic_stream_t *qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 static void ngx_quic_stream_cleanup_handler(void *data);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
36 static ngx_int_t ngx_quic_close_stream(ngx_quic_stream_t *qs);
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
37 static ngx_int_t ngx_quic_can_shutdown(ngx_connection_t *c);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
38 static ngx_int_t ngx_quic_control_flow(ngx_quic_stream_t *qs, uint64_t last);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
39 static ngx_int_t ngx_quic_update_flow(ngx_quic_stream_t *qs, uint64_t last);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
40 static ngx_int_t ngx_quic_update_max_stream_data(ngx_quic_stream_t *qs);
8909
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
41 static ngx_int_t ngx_quic_update_max_data(ngx_connection_t *c);
8993
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
42 static void ngx_quic_set_event(ngx_event_t *ev);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 ngx_connection_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 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
47 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 uint64_t id;
9069
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
49 ngx_connection_t *pc, *sc;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
50 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52
8988
6434160b4b78 QUIC: allowed main QUIC connection for some operations.
Roman Arutyunyan <arut@nginx.com>
parents: 8968
diff changeset
53 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
54 qc = ngx_quic_get_connection(pc);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
56 if (qc->closing) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
57 return NULL;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
58 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
59
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 if (bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 if (qc->streams.server_streams_bidi
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 >= qc->streams.server_max_streams_bidi)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 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
65 "quic too many server bidi streams:%uL",
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 return NULL;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 id = (qc->streams.server_streams_bidi << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 | NGX_QUIC_STREAM_SERVER_INITIATED;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 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
74 "quic creating server bidi stream"
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 " streams:%uL max:%uL id:0x%xL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 qc->streams.server_streams_bidi,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 qc->streams.server_max_streams_bidi, id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 qc->streams.server_streams_bidi++;
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 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 if (qc->streams.server_streams_uni
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 >= qc->streams.server_max_streams_uni)
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_debug1(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 too many server uni streams:%uL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 qc->streams.server_streams_uni);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 }
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 id = (qc->streams.server_streams_uni << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 | NGX_QUIC_STREAM_SERVER_INITIATED
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 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
96 "quic creating server uni stream"
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 " streams:%uL max:%uL id:0x%xL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 qc->streams.server_streams_uni,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 qc->streams.server_max_streams_uni, id);
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 qc->streams.server_streams_uni++;
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
9069
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
104 qs = ngx_quic_create_stream(pc, id);
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
105 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108
9069
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
109 sc = qs->connection;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
110
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
111 sc->write->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
112 sc->write->ready = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
113
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
114 if (bidi) {
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
115 sc->read->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
116 }
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
117
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
118 return sc;
8750
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
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 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 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
124 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
125 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 ngx_rbtree_node_t **p;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 ngx_quic_stream_t *qn, *qnt;
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 for ( ;; ) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 qn = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 qnt = (ngx_quic_stream_t *) temp;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 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
134
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 if (*p == sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 break;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 temp = *p;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 *p = node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 node->parent = temp;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 node->left = sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 node->right = sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 ngx_rbt_red(node);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 ngx_quic_stream_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 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
152 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 ngx_rbtree_node_t *node, *sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 ngx_quic_stream_t *qn;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 node = rbtree->root;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 sentinel = rbtree->sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 while (node != sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 qn = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 if (id == qn->id) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 return qn;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 node = (id < qn->id) ? node->left : node->right;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 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
175 {
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
176 ngx_pool_t *pool;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
177 ngx_queue_t *q;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 ngx_rbtree_t *tree;
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
179 ngx_connection_t *sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
183 while (!ngx_queue_empty(&qc->streams.uninitialized)) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
184 q = ngx_queue_head(&qc->streams.uninitialized);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
185 ngx_queue_remove(q);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
186
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
187 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
188 pool = qs->connection->pool;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
189
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
190 ngx_close_connection(qs->connection);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
191 ngx_destroy_pool(pool);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
192 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
193
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 tree = &qc->streams.tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 if (tree->root == tree->sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
200 node = ngx_rbtree_min(tree->root, tree->sentinel);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
201
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
202 while (node) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 qs = (ngx_quic_stream_t *) node;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
204 node = ngx_rbtree_next(tree, node);
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
205 sc = qs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
207 qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_RECVD;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
208 qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
209
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
210 if (sc == NULL) {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
211 ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
212 continue;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
213 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
214
9065
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
215 sc->read->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
216 sc->write->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
217
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
218 ngx_quic_set_event(sc->read);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
219 ngx_quic_set_event(sc->write);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
221 sc->close = 1;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
222 sc->read->handler(sc->read);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
225 if (tree->root == tree->sentinel) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
226 return NGX_OK;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
227 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
228
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
229 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
230 "quic connection has active streams");
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 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
238 {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
239 return ngx_quic_do_reset_stream(c->quic, err);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
240 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
241
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
242
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
243 static ngx_int_t
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
244 ngx_quic_do_reset_stream(ngx_quic_stream_t *qs, ngx_uint_t err)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
245 {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
250 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
251 || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_SENT
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
252 || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_RECVD)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
253 {
8875
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
254 return NGX_OK;
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
255 }
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8861
diff changeset
256
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
257 qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
258 qs->send_final_size = qs->send_offset;
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
259
9065
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
260 if (qs->connection) {
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
261 qs->connection->write->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
262 }
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
263
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
267 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
268 "quic stream id:0x%xL reset", qs->id);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
269
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 frame->type = NGX_QUIC_FT_RESET_STREAM;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 frame->u.reset_stream.id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 frame->u.reset_stream.error_code = err;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
279 frame->u.reset_stream.final_size = qs->send_offset;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
283 ngx_quic_free_buffer(pc, &qs->send);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
284
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
289 ngx_int_t
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
290 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
291 {
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
292 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
293 if (ngx_quic_shutdown_stream_send(c) != NGX_OK) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
294 return NGX_ERROR;
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
295 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
296 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
297
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
298 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
299 if (ngx_quic_shutdown_stream_recv(c) != NGX_OK) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
300 return NGX_ERROR;
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
301 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
302 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
303
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
304 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
305 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
306
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
307
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
308 static ngx_int_t
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
309 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
310 {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
311 ngx_quic_stream_t *qs;
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
312
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
313 qs = c->quic;
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
314
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
315 if (qs->send_state != NGX_QUIC_STREAM_SEND_READY
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
316 && qs->send_state != NGX_QUIC_STREAM_SEND_SEND)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
317 {
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
318 return NGX_OK;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
319 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
320
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
321 qs->send_state = NGX_QUIC_STREAM_SEND_SEND;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
322 qs->send_final_size = c->sent;
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
323
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
324 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, qs->parent->log, 0,
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
325 "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
326
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
327 return ngx_quic_stream_flush(qs);
8890
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
328 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
329
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8886
diff changeset
330
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
331 static ngx_int_t
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
332 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
333 {
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
334 ngx_connection_t *pc;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
335 ngx_quic_frame_t *frame;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
336 ngx_quic_stream_t *qs;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
337 ngx_quic_connection_t *qc;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
338
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
339 qs = c->quic;
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
340
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
341 if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
342 && qs->recv_state != NGX_QUIC_STREAM_RECV_SIZE_KNOWN)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
343 {
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
344 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
345 }
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 pc = qs->parent;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
348 qc = ngx_quic_get_connection(pc);
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
349
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
350 if (qc->conf->stream_close_code == 0) {
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
351 return NGX_OK;
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
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
354 frame = ngx_quic_alloc_frame(pc);
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
355 if (frame == NULL) {
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
356 return NGX_ERROR;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
357 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
358
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
359 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
8938
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
360 "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
361
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
362 frame->level = ssl_encryption_application;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
363 frame->type = NGX_QUIC_FT_STOP_SENDING;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
364 frame->u.stop_sending.id = qs->id;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
365 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
366
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
367 ngx_quic_queue_frame(qc, frame);
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
368
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
369 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
370 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
371
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8937
diff changeset
372
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 static ngx_quic_stream_t *
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
374 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
375 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 uint64_t min_id;
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
377 ngx_event_t *rev;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
378 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
381 qc = ngx_quic_get_connection(c);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
382
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
383 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
384
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
385 if (qs) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
386 return qs;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
387 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388
8905
832723a49026 QUIC: stop processing new client streams at the closing state.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8890
diff changeset
389 if (qc->shutdown || qc->closing) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 return NGX_QUIC_STREAM_GONE;
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
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
393 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
394 "quic stream id:0x%xL is missing", id);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
395
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 if ((id >> 2) < qc->streams.server_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407 if ((id >> 2) < qc->streams.client_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 return NGX_QUIC_STREAM_GONE;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 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
412 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 }
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 min_id = (qc->streams.client_streams_uni << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 qc->streams.client_streams_uni = (id >> 2) + 1;
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 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 if ((id >> 2) < qc->streams.server_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431 if ((id >> 2) < qc->streams.client_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 return NGX_QUIC_STREAM_GONE;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 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
436 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 min_id = (qc->streams.client_streams_bidi << 2);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 qc->streams.client_streams_bidi = (id >> 2) + 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
445 * 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
446 *
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
447 * successive streams of each type are created with numerically increasing
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8791
diff changeset
448 * 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
449 * 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
450 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
452 #if (NGX_SUPPRESS_WARN)
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
453 qs = NULL;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
454 #endif
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
455
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
456 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
457
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
458 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
459
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
460 if (qs == NULL) {
8906
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
461 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
462 return NULL;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
463 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
464
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
465 continue;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
468 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
469
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
470 rev = qs->connection->read;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
471 rev->handler = ngx_quic_init_stream_handler;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
472
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
473 if (qc->streams.initialized) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
474 ngx_post_event(rev, &ngx_posted_events);
9086
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
475
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
476 if (qc->push.posted) {
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
477 /*
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
478 * The posted stream can produce output immediately.
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
479 * By postponing the push event, we coalesce the stream
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
480 * output with queued frames in one UDP datagram.
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
481 */
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
482
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
483 ngx_delete_posted_event(&qc->push);
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
484 ngx_post_event(&qc->push, &ngx_posted_events);
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9075
diff changeset
485 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488
8906
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
489 if (qs == NULL) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
490 return NGX_QUIC_STREAM_GONE;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
491 }
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 return qs;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
494 }
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 static ngx_int_t
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
498 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
499 {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
500 uint64_t code;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
501 ngx_quic_frame_t *frame;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
502 ngx_quic_connection_t *qc;
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 qc = ngx_quic_get_connection(c);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
505
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
506 code = (id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
507 ? qc->conf->stream_reject_code_uni
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
508 : qc->conf->stream_reject_code_bidi;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
509
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
510 if (code == 0) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
511 return NGX_DECLINED;
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
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
514 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
515 "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
516
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
517 frame = ngx_quic_alloc_frame(c);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
518 if (frame == NULL) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
519 return NGX_ERROR;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
520 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
521
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
522 frame->level = ssl_encryption_application;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
523 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
524 frame->u.reset_stream.id = id;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
525 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
526 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
527
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
528 ngx_quic_queue_frame(qc, frame);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
529
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
530 frame = ngx_quic_alloc_frame(c);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
531 if (frame == NULL) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
532 return NGX_ERROR;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
533 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
534
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
535 frame->level = ssl_encryption_application;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
536 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
537 frame->u.stop_sending.id = id;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
538 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
539
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
540 ngx_quic_queue_frame(qc, frame);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
541
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8905
diff changeset
542 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
546 static void
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
547 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
548 {
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
549 ngx_connection_t *c;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
550 ngx_quic_stream_t *qs;
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
551
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
552 c = ev->data;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
553 qs = c->quic;
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
554
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
555 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
556
9069
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
557 if ((qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) {
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
558 c->write->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
559 c->write->ready = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
560 }
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
561
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
562 c->read->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9065
diff changeset
563
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
564 ngx_queue_remove(&qs->queue);
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
565
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
566 c->listening->handler(c);
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
567 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
568
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
569
8886
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
570 ngx_int_t
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
571 ngx_quic_init_streams(ngx_connection_t *c)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
572 {
8886
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
573 ngx_int_t rc;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
574 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
575
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
576 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
577
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
578 if (qc->streams.initialized) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
579 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
580 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
581
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
582 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
583
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
584 if (rc == NGX_ERROR) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
585 return NGX_ERROR;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
586 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
587
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
588 if (rc == NGX_AGAIN) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
589 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
590 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
591 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
592
9058
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
593 return ngx_quic_do_init_streams(c);
8886
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
594 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
595
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
596
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
597 static void
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8876
diff changeset
598 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
599 {
9058
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
600 if (ngx_quic_do_init_streams(c) != NGX_OK) {
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
601 ngx_quic_close_connection(c, NGX_ERROR);
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
602 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
603 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
604
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
605
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
606 static ngx_int_t
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
607 ngx_quic_do_init_streams(ngx_connection_t *c)
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
608 {
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
609 ngx_queue_t *q;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
610 ngx_quic_stream_t *qs;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
611 ngx_quic_connection_t *qc;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
612
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
613 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
614
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
615 qc = ngx_quic_get_connection(c);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
616
9058
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
617 if (qc->conf->init) {
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
618 if (qc->conf->init(c) != NGX_OK) {
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
619 return NGX_ERROR;
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
620 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
621 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
622
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
623 for (q = ngx_queue_head(&qc->streams.uninitialized);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
624 q != ngx_queue_sentinel(&qc->streams.uninitialized);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
625 q = ngx_queue_next(q))
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
626 {
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
627 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
628 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
629 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
630
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
631 qc->streams.initialized = 1;
9058
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
632
9158
ad3d34ddfdcc QUIC: "handshake_timeout" configuration parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 9112
diff changeset
633 if (!qc->closing && qc->close.timer_set) {
ad3d34ddfdcc QUIC: "handshake_timeout" configuration parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 9112
diff changeset
634 ngx_del_timer(&qc->close);
ad3d34ddfdcc QUIC: "handshake_timeout" configuration parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 9112
diff changeset
635 }
ad3d34ddfdcc QUIC: "handshake_timeout" configuration parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 9112
diff changeset
636
9058
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 9053
diff changeset
637 return NGX_OK;
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
638 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
639
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
640
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641 static ngx_quic_stream_t *
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
642 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
643 {
9101
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
644 ngx_str_t addr_text;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645 ngx_log_t *log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646 ngx_pool_t *pool;
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
647 ngx_uint_t reusable;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
648 ngx_queue_t *q;
9101
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
649 struct sockaddr *sockaddr;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
650 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
651 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
652 ngx_pool_cleanup_t *cln;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
654
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
655 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
656 "quic stream id:0x%xL create", id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
659
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
660 if (!ngx_queue_empty(&qc->streams.free)) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
661 q = ngx_queue_head(&qc->streams.free);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
662 qs = ngx_queue_data(q, ngx_quic_stream_t, queue);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
663 ngx_queue_remove(&qs->queue);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
664
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
665 } else {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
666 /*
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
667 * the number of streams is limited by transport
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
668 * parameters and application requirements
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
669 */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
670
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
671 qs = ngx_palloc(c->pool, sizeof(ngx_quic_stream_t));
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
672 if (qs == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
673 return NULL;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
674 }
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
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
677 ngx_memzero(qs, sizeof(ngx_quic_stream_t));
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
678
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
679 qs->node.key = id;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
680 qs->parent = c;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
681 qs->id = id;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
682 qs->send_final_size = (uint64_t) -1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
683 qs->recv_final_size = (uint64_t) -1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
684
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
685 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
686 if (pool == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
687 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
688 return NULL;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
689 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
691 log = ngx_palloc(pool, sizeof(ngx_log_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692 if (log == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693 ngx_destroy_pool(pool);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
694 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
695 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
698 *log = *c->log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699 pool->log = log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700
9101
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
701 sockaddr = ngx_palloc(pool, c->socklen);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
702 if (sockaddr == NULL) {
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
703 ngx_destroy_pool(pool);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
704 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
705 return NULL;
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
706 }
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
707
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
708 ngx_memcpy(sockaddr, c->sockaddr, c->socklen);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
709
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
710 if (c->addr_text.data) {
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
711 addr_text.data = ngx_pnalloc(pool, c->addr_text.len);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
712 if (addr_text.data == NULL) {
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
713 ngx_destroy_pool(pool);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
714 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
715 return NULL;
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
716 }
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
717
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
718 ngx_memcpy(addr_text.data, c->addr_text.data, c->addr_text.len);
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
719 addr_text.len = c->addr_text.len;
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
720
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
721 } else {
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
722 addr_text.len = 0;
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
723 addr_text.data = NULL;
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
724 }
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
725
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
726 reusable = c->reusable;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
727 ngx_reusable_connection(c, 0);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
728
8860
a2cef164a924 QUIC: simplified stream fd initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
729 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
730 if (sc == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
731 ngx_destroy_pool(pool);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
732 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
733 ngx_reusable_connection(c, reusable);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
734 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
736
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
737 qs->connection = sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
738
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
739 sc->quic = qs;
8842
486c6a9be111 QUIC: store QUIC connection fd in stream fake connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8841
diff changeset
740 sc->shared = 1;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
741 sc->type = SOCK_STREAM;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
742 sc->pool = pool;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
743 sc->ssl = c->ssl;
9101
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
744 sc->sockaddr = sockaddr;
9100
cc3d24a9b76f QUIC: set c->socklen for streams.
Roman Arutyunyan <arut@nginx.com>
parents: 9086
diff changeset
745 sc->socklen = c->socklen;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
746 sc->listening = c->listening;
9101
3bb003fcd682 QUIC: keep stream sockaddr and addr_text constant.
Roman Arutyunyan <arut@nginx.com>
parents: 9100
diff changeset
747 sc->addr_text = addr_text;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
748 sc->local_sockaddr = c->local_sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
749 sc->local_socklen = c->local_socklen;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
750 sc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
9063
e3760b9b7c8e HTTP/3: fixed $connection_time.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9058
diff changeset
751 sc->start_time = c->start_time;
8861
630ecd703805 QUIC: set NGX_TCP_NODELAY_DISABLED for fake stream connections.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8860
diff changeset
752 sc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
753
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
754 sc->recv = ngx_quic_stream_recv;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
755 sc->send = ngx_quic_stream_send;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
756 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
757
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
758 sc->read->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
759 sc->write->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
760
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
761 sc->read->handler = ngx_quic_empty_handler;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
762 sc->write->handler = ngx_quic_empty_handler;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
763
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
764 log->connection = sc->number;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
765
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
766 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
767 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
768 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
769 qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_READ;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
770 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
771
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
772 } else {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
773 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
774 qs->recv_state = NGX_QUIC_STREAM_RECV_RECV;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
775 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
776 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779 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
780 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
781 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
782
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783 } else {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
784 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
785 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
786 }
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
787
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
788 qs->recv_state = NGX_QUIC_STREAM_RECV_RECV;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
789 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
790 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
792 qs->recv_window = qs->recv_max_data;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
793
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794 cln = ngx_pool_cleanup_add(pool, 0);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 if (cln == NULL) {
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
796 ngx_close_connection(sc);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797 ngx_destroy_pool(pool);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
798 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
799 ngx_reusable_connection(c, reusable);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
803 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
804 cln->data = sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
806 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
807
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
808 return qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
810
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
812 void
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
813 ngx_quic_cancelable_stream(ngx_connection_t *c)
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
814 {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
815 ngx_connection_t *pc;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
816 ngx_quic_stream_t *qs;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
817 ngx_quic_connection_t *qc;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
818
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
819 qs = c->quic;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
820 pc = qs->parent;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
821 qc = ngx_quic_get_connection(pc);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
822
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
823 if (!qs->cancelable) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
824 qs->cancelable = 1;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
825
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
826 if (ngx_quic_can_shutdown(pc) == NGX_OK) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
827 ngx_reusable_connection(pc, 1);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
828
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
829 if (qc->shutdown) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
830 ngx_quic_shutdown_quic(pc);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
831 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
832 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
833 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
834 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
835
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
836
8827
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
837 static void
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
838 ngx_quic_empty_handler(ngx_event_t *ev)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
839 {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
840 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
841
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8820
diff changeset
842
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
844 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
845 {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
846 ssize_t len;
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
847 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
848 ngx_chain_t *cl, *in;
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
849 ngx_event_t *rev;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
850 ngx_connection_t *pc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
851 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
852
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
853 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
854 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
855 rev = c->read;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
856
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
857 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
858 || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
859 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
860 qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_READ;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
861 return NGX_ERROR;
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
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
864 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
865 "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
866
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
867 if (size == 0) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
868 return 0;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
871 in = ngx_quic_read_buffer(pc, &qs->recv, size);
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
872 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
873 return NGX_ERROR;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
874 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
876 len = 0;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
877
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
878 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
879 b = cl->buf;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
880 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
881 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
882 }
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
883
8948
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8947
diff changeset
884 ngx_quic_free_chain(pc, in);
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
885
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
886 if (len == 0) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
887 rev->ready = 0;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
888
9003
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8993
diff changeset
889 if (qs->recv_state == NGX_QUIC_STREAM_RECV_DATA_RECVD
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
890 && qs->recv_offset == qs->recv_final_size)
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
891 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
892 qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_READ;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
893 }
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
894
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
895 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
896 rev->eof = 1;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
897 return 0;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
898 }
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
899
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
900 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
901 "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
902 return NGX_AGAIN;
8750
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
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
905 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
906 "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
907
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
908 if (ngx_quic_update_flow(qs, qs->recv_offset + len) != NGX_OK) {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
909 return NGX_ERROR;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912 return len;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917 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
918 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919 ngx_buf_t b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 ngx_chain_t cl;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922 ngx_memzero(&b, sizeof(ngx_buf_t));
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 b.memory = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
925 b.pos = buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
926 b.last = buf + size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
927
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
928 cl.buf = &b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929 cl.next = NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
930
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
931 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
932 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
933 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935 if (b.pos == buf) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936 return NGX_AGAIN;
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 return b.pos - buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943 static ngx_chain_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944 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
945 {
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
946 uint64_t n, flow;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
948 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
949 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
950 ngx_quic_connection_t *qc;
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 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
953 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955 wev = c->write;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
957 if (qs->send_state != NGX_QUIC_STREAM_SEND_READY
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
958 && qs->send_state != NGX_QUIC_STREAM_SEND_SEND)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
959 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
960 wev->error = 1;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 return NGX_CHAIN_ERROR;
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
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
964 qs->send_state = NGX_QUIC_STREAM_SEND_SEND;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
965
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
966 flow = qs->acked + qc->conf->stream_buffer_size - qs->sent;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
967
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968 if (flow == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
969 wev->ready = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
972
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
973 if (limit == 0 || limit > (off_t) flow) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
974 limit = flow;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
977 n = qs->send.size;
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
978
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
979 in = ngx_quic_write_buffer(pc, &qs->send, in, limit, qs->sent);
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
980 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
981 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
982 }
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
983
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
984 n = qs->send.size - n;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985 c->sent += n;
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
986 qs->sent += n;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987 qc->streams.sent += n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
988
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
989 if (flow == n) {
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
990 wev->ready = 0;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
991 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
993 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
994 "quic send_chain sent:%uL", n);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
995
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
996 if (ngx_quic_stream_flush(qs) != NGX_OK) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
997 return NGX_CHAIN_ERROR;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
998 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
999
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1000 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1001 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1004 static ngx_int_t
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1005 ngx_quic_stream_flush(ngx_quic_stream_t *qs)
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1006 {
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1007 off_t limit, len;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1008 ngx_uint_t last;
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1009 ngx_chain_t *out;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1010 ngx_quic_frame_t *frame;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1011 ngx_connection_t *pc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1012 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1013
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1014 if (qs->send_state != NGX_QUIC_STREAM_SEND_SEND) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1015 return NGX_OK;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1016 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1017
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1018 pc = qs->parent;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1019 qc = ngx_quic_get_connection(pc);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1020
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1021 if (qc->streams.send_max_data == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1022 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
1023 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1024
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1025 limit = ngx_min(qc->streams.send_max_data - qc->streams.send_offset,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1026 qs->send_max_data - qs->send_offset);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1027
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1028 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1029 "quic stream id:0x%xL flush limit:%O", qs->id, limit);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1030
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1031 len = qs->send.offset;
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1032
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1033 out = ngx_quic_read_buffer(pc, &qs->send, limit);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1034 if (out == NGX_CHAIN_ERROR) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1035 return NGX_ERROR;
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
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1038 len = qs->send.offset - len;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1039 last = 0;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1040
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1041 if (qs->send_final_size != (uint64_t) -1
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1042 && qs->send_final_size == qs->send.offset)
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1043 {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1044 qs->send_state = NGX_QUIC_STREAM_SEND_DATA_SENT;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1045 last = 1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1046 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1047
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1048 if (len == 0 && !last) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1049 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1050 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1051
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1052 frame = ngx_quic_alloc_frame(pc);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1053 if (frame == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1054 return NGX_ERROR;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1056
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1057 frame->level = ssl_encryption_application;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1058 frame->type = NGX_QUIC_FT_STREAM;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1059 frame->data = out;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1060
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1061 frame->u.stream.off = 1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1062 frame->u.stream.len = 1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1063 frame->u.stream.fin = last;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1064
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1065 frame->u.stream.stream_id = qs->id;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1066 frame->u.stream.offset = qs->send_offset;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1067 frame->u.stream.length = len;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1068
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1069 ngx_quic_queue_frame(qc, frame);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1070
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1071 qs->send_offset += len;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1072 qc->streams.send_offset += len;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1073
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1074 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0,
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1075 "quic stream id:0x%xL flush len:%O last:%ui",
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1076 qs->id, len, last);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1077
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1078 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1079 return ngx_quic_close_stream(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1081
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1082 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086 static void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087 ngx_quic_stream_cleanup_handler(void *data)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1088 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089 ngx_connection_t *c = data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1090
9112
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1091 ngx_quic_stream_t *qs;
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1092 ngx_quic_connection_t *qc;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1093
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1094 qs = c->quic;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1095
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1096 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, qs->parent->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1097 "quic stream id:0x%xL cleanup", qs->id);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1098
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1099 if (ngx_quic_shutdown_stream(c, NGX_RDWR_SHUTDOWN) != NGX_OK) {
9112
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1100 goto failed;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1101 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1102
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1103 qs->connection = NULL;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1104
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1105 if (ngx_quic_close_stream(qs) != NGX_OK) {
9112
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1106 goto failed;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1107 }
9112
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1108
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1109 return;
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1110
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1111 failed:
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1112
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1113 qc = ngx_quic_get_connection(qs->parent);
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1114 qc->error = NGX_QUIC_ERR_INTERNAL_ERROR;
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1115
d59277dd3d8c QUIC: fixed post-close use-after-free.
Roman Arutyunyan <arut@nginx.com>
parents: 9101
diff changeset
1116 ngx_post_event(&qc->close, &ngx_posted_events);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1117 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1118
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1119
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1120 static ngx_int_t
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1121 ngx_quic_close_stream(ngx_quic_stream_t *qs)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1122 {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1123 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1124 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1126
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1128 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1130 if (!qc->closing) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1131 /* make sure everything is sent and final size is received */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1132
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1133 if (qs->recv_state == NGX_QUIC_STREAM_RECV_RECV) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1134 return NGX_OK;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1135 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1136
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1137 if (qs->send_state != NGX_QUIC_STREAM_SEND_DATA_RECVD
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1138 && qs->send_state != NGX_QUIC_STREAM_SEND_RESET_RECVD)
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1139 {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1140 return NGX_OK;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1141 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1142 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1143
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1144 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1145 "quic stream id:0x%xL close", qs->id);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1146
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1147 ngx_quic_free_buffer(pc, &qs->send);
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1148 ngx_quic_free_buffer(pc, &qs->recv);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1149
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1151 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
8750
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 if (qc->closing) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1154 /* schedule handler call to continue ngx_quic_close_connection() */
9050
aaca8e111959 QUIC: post close event for connection close.
Roman Arutyunyan <arut@nginx.com>
parents: 9045
diff changeset
1155 ngx_post_event(&qc->close, &ngx_posted_events);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1156 return NGX_OK;
8750
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
9053
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1159 if (!pc->reusable && ngx_quic_can_shutdown(pc) == NGX_OK) {
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1160 ngx_reusable_connection(pc, 1);
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1161 }
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1162
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1163 if (qc->shutdown) {
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1164 ngx_quic_shutdown_quic(pc);
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1165 return NGX_OK;
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1166 }
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 9052
diff changeset
1167
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1168 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
1169 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 if (frame == NULL) {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1171 return NGX_ERROR;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1172 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1173
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1174 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175 frame->type = NGX_QUIC_FT_MAX_STREAMS;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1176
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1178 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
1179 frame->u.max_streams.bidi = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1180
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182 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
1183 frame->u.max_streams.bidi = 1;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1188
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1189 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1191
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1193 static ngx_int_t
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1194 ngx_quic_can_shutdown(ngx_connection_t *c)
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1195 {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1196 ngx_rbtree_t *tree;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1197 ngx_rbtree_node_t *node;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1198 ngx_quic_stream_t *qs;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1199 ngx_quic_connection_t *qc;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1200
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1201 qc = ngx_quic_get_connection(c);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1202
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1203 tree = &qc->streams.tree;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1204
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1205 if (tree->root != tree->sentinel) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1206 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1207 node;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1208 node = ngx_rbtree_next(tree, node))
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1209 {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1210 qs = (ngx_quic_stream_t *) node;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1211
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1212 if (!qs->cancelable) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1213 return NGX_DECLINED;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1214 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1215 }
9075
12b756caaf16 QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9069
diff changeset
1216 }
9051
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1217
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1218 return NGX_OK;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1219 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1220
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 9050
diff changeset
1221
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1223 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
1224 ngx_quic_frame_t *frame)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1225 {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1226 uint64_t last;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1227 ngx_quic_stream_t *qs;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1228 ngx_quic_connection_t *qc;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1229 ngx_quic_stream_frame_t *f;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1230
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1232 f = &frame->u.stream;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1233
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1234 if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1235 && (f->stream_id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1236 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1237 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1238 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1239 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1240
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1241 /* no overflow since both values are 62-bit */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1242 last = f->offset + f->length;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1243
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1244 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
1245
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1246 if (qs == NULL) {
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1247 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1248 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1249
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1250 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1251 return NGX_OK;
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
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1254 if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1255 && qs->recv_state != NGX_QUIC_STREAM_RECV_SIZE_KNOWN)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1256 {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1257 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1258 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1259
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1260 if (ngx_quic_control_flow(qs, last) != NGX_OK) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1261 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1262 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1263
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1264 if (qs->recv_final_size != (uint64_t) -1 && last > qs->recv_final_size) {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1265 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
1266 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1267 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1268
8962
47f45a98f892 QUIC: fixed handling STREAM FIN.
Roman Arutyunyan <arut@nginx.com>
parents: 8952
diff changeset
1269 if (last < qs->recv_offset) {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1270 return NGX_OK;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1271 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1272
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1273 if (f->fin) {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1274 if (qs->recv_final_size != (uint64_t) -1 && qs->recv_final_size != last)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1275 {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1276 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
1277 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1278 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1279
8783
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1280 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
1281 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
1282 return NGX_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1283 }
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1284
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1285 qs->recv_final_size = last;
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1286 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
1287 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1288
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1289 if (ngx_quic_write_buffer(c, &qs->recv, frame->data, f->length, f->offset)
8947
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8946
diff changeset
1290 == NGX_CHAIN_ERROR)
8784
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1291 {
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1292 return NGX_ERROR;
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1293 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1294
9003
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8993
diff changeset
1295 if (qs->recv_state == NGX_QUIC_STREAM_RECV_SIZE_KNOWN
9011
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 9010
diff changeset
1296 && qs->recv.size == qs->recv_final_size)
9003
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8993
diff changeset
1297 {
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8993
diff changeset
1298 qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_RECVD;
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8993
diff changeset
1299 }
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8993
diff changeset
1300
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1301 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1302 return ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1303 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1304
9045
c6580dce98a8 QUIC: fixed triggering stream read event (ticket #2409).
Roman Arutyunyan <arut@nginx.com>
parents: 9012
diff changeset
1305 if (f->offset <= qs->recv_offset) {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1306 ngx_quic_set_event(qs->connection->read);
8784
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1307 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1308
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8783
diff changeset
1309 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1310 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1311
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1312
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1313 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1314 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
1315 ngx_quic_max_data_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1316 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1317 ngx_rbtree_t *tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1318 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1319 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1320 ngx_quic_connection_t *qc;
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 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1323 tree = &qc->streams.tree;
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 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
1326 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1327 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1328
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1329 if (tree->root == tree->sentinel
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1330 || qc->streams.send_offset < qc->streams.send_max_data)
8841
1f7f98638dc2 QUIC: fixed null pointer dereference in MAX_DATA handler.
Mariano Di Martino <mariano.dimartino@uhasselt.be>
parents: 8828
diff changeset
1331 {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1332 /* not blocked on MAX_DATA */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1333 qc->streams.send_max_data = f->max_data;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1334 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1335 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1336
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1337 qc->streams.send_max_data = f->max_data;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1338 node = ngx_rbtree_min(tree->root, tree->sentinel);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1339
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1340 while (node && qc->streams.send_offset < qc->streams.send_max_data) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1341
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1342 qs = (ngx_quic_stream_t *) node;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1343 node = ngx_rbtree_next(tree, node);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1344
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1345 if (ngx_quic_stream_flush(qs) != NGX_OK) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1346 return NGX_ERROR;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1347 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1348 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1349
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1350 return NGX_OK;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1353
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1354 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1355 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
1356 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
1357 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1358 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1359 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1360
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1361
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1362 ngx_int_t
8909
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1363 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
1364 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
1365 {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1366 return ngx_quic_update_max_data(c);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1367 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1368
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1369
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1370 ngx_int_t
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1371 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
1372 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
1373 {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1374 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1375 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1376
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1377 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1378
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1379 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1380 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1381 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1382 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1383 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1384 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1385
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1386 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
1387
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1388 if (qs == NULL) {
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1389 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1390 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1391
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1392 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1393 return NGX_OK;
8750
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
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1396 return ngx_quic_update_max_stream_data(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1397 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1398
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 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1401 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
1402 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
1403 {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1404 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1405 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1406
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1407 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1408
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1409 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1410 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1411 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1412 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1413 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1414 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1415
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1416 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
1417
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1418 if (qs == NULL) {
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1419 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1420 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1421
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1422 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1423 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1424 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1425
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1426 if (f->limit <= qs->send_max_data) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1427 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1428 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1429
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1430 if (qs->send_offset < qs->send_max_data) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1431 /* not blocked on MAX_STREAM_DATA */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1432 qs->send_max_data = f->limit;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1433 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1434 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1435
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1436 qs->send_max_data = f->limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1437
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1438 return ngx_quic_stream_flush(qs);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1439 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1440
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1441
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1442 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1443 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
1444 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
1445 {
9065
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
1446 ngx_event_t *rev;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1447 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1448 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1449
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1450 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1451
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1452 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1453 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1454 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1455 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1456 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1457 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1458
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1459 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
1460
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1461 if (qs == NULL) {
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1462 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1463 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1464
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1465 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1466 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1467 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1468
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1469 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
1470 || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1471 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1472 return NGX_OK;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1473 }
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1474
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1475 qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_RECVD;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1476
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1477 if (ngx_quic_control_flow(qs, f->final_size) != NGX_OK) {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1478 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1479 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1480
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1481 if (qs->recv_final_size != (uint64_t) -1
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1482 && qs->recv_final_size != f->final_size)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1483 {
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1484 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
1485 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1486 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1487
8783
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1488 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
1489 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
1490 return NGX_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1491 }
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8782
diff changeset
1492
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1493 qs->recv_final_size = f->final_size;
8782
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8779
diff changeset
1494
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1495 if (ngx_quic_update_flow(qs, qs->recv_final_size) != NGX_OK) {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1496 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1497 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1498
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1499 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1500 return ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1501 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1502
9065
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
1503 rev = qs->connection->read;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
1504 rev->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
1505
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9064
diff changeset
1506 ngx_quic_set_event(rev);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1507
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1508 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1509 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1510
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1511
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1512 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1513 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
1514 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
1515 {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1516 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1517 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1518
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1519 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1520
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1521 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1522 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1523 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1524 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1525 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1526 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1527
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1528 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
1529
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1530 if (qs == NULL) {
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1531 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1532 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1533
8937
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1534 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8936
diff changeset
1535 return NGX_OK;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1536 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1537
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1538 if (ngx_quic_do_reset_stream(qs, f->error_code) != NGX_OK) {
8876
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1539 return NGX_ERROR;
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1540 }
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8875
diff changeset
1541
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1542 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1543 return ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1544 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1545
8993
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1546 ngx_quic_set_event(qs->connection->write);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1547
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1548 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1549 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1550
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1551
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1552 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1553 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
1554 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
1555 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1556 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1557
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1558 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1559
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1560 if (f->bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1561 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
1562 qc->streams.server_max_streams_bidi = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1563
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1564 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
1565 "quic max_streams_bidi:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1566 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1567
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1568 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1569 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
1570 qc->streams.server_max_streams_uni = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1571
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1572 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
1573 "quic max_streams_uni:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1574 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1575 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1576
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1577 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1578 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1579
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1580
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1581 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1582 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
1583 {
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1584 uint64_t acked;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1585 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1586 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1587
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1588 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1589
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1590 switch (f->type) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1591
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1592 case NGX_QUIC_FT_RESET_STREAM:
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1593
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1594 qs = ngx_quic_find_stream(&qc->streams.tree, f->u.reset_stream.id);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1595 if (qs == NULL) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1596 return;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1597 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1598
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1599 qs->send_state = NGX_QUIC_STREAM_SEND_RESET_RECVD;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1600
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1601 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1602 "quic stream id:0x%xL ack reset final_size:%uL",
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1603 qs->id, f->u.reset_stream.final_size);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1604
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1605 break;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1606
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1607 case NGX_QUIC_FT_STREAM:
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1608
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1609 qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1610 if (qs == NULL) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1611 return;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1612 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1613
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1614 acked = qs->acked;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1615 qs->acked += f->u.stream.length;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1616
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1617 if (f->u.stream.fin) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1618 qs->fin_acked = 1;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1619 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1620
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1621 if (qs->send_state == NGX_QUIC_STREAM_SEND_DATA_SENT
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1622 && qs->acked == qs->sent && qs->fin_acked)
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1623 {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1624 qs->send_state = NGX_QUIC_STREAM_SEND_DATA_RECVD;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1625 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1626
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1627 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1628 "quic stream id:0x%xL ack len:%uL fin:%d unacked:%uL",
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1629 qs->id, f->u.stream.length, f->u.stream.fin,
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1630 qs->sent - qs->acked);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1631
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1632 if (qs->connection
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1633 && qs->sent - acked == qc->conf->stream_buffer_size
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1634 && f->u.stream.length > 0)
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1635 {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1636 ngx_quic_set_event(qs->connection->write);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1637 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1638
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1639 break;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1640
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1641 default:
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1642 return;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1643 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1644
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1645 if (qs->connection == NULL) {
9052
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 9051
diff changeset
1646 ngx_quic_close_stream(qs);
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1647 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1648 }
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1649
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1650
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1651 static ngx_int_t
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1652 ngx_quic_control_flow(ngx_quic_stream_t *qs, uint64_t last)
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1653 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1654 uint64_t len;
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1655 ngx_connection_t *pc;
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1656 ngx_quic_connection_t *qc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1657
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1658 pc = qs->parent;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1659 qc = ngx_quic_get_connection(pc);
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1660
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1661 if (last <= qs->recv_last) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1662 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1663 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1664
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1665 len = last - qs->recv_last;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1666
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1667 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1668 "quic stream id:0x%xL flow control msd:%uL/%uL md:%uL/%uL",
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1669 qs->id, last, qs->recv_max_data, qc->streams.recv_last + len,
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1670 qc->streams.recv_max_data);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1671
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1672 qs->recv_last += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1673
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1674 if (qs->recv_state == NGX_QUIC_STREAM_RECV_RECV
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1675 && qs->recv_last > qs->recv_max_data)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1676 {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1677 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1678 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1679 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1680
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1681 qc->streams.recv_last += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1682
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1683 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
1684 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1685 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1686 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1687
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1688 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1689 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1690
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1691
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1692 static ngx_int_t
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1693 ngx_quic_update_flow(ngx_quic_stream_t *qs, uint64_t last)
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1694 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1695 uint64_t len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1696 ngx_connection_t *pc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1697 ngx_quic_connection_t *qc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1698
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1699 pc = qs->parent;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1700 qc = ngx_quic_get_connection(pc);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1701
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1702 if (last <= qs->recv_offset) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1703 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1704 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1705
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1706 len = last - qs->recv_offset;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1707
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1708 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1709 "quic stream id:0x%xL flow update %uL", qs->id, last);
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1710
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1711 qs->recv_offset += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1712
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1713 if (qs->recv_max_data <= qs->recv_offset + qs->recv_window / 2) {
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1714 if (ngx_quic_update_max_stream_data(qs) != NGX_OK) {
8791
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1715 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1716 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1717 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1718
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1719 qc->streams.recv_offset += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1720
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1721 if (qc->streams.recv_max_data
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1722 <= qc->streams.recv_offset + qc->streams.recv_window / 2)
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1723 {
8909
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1724 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
1725 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1726 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1727 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1728
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1729 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8784
diff changeset
1730 }
8855
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1731
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8842
diff changeset
1732
8908
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1733 static ngx_int_t
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1734 ngx_quic_update_max_stream_data(ngx_quic_stream_t *qs)
8908
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1735 {
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1736 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
1737 ngx_connection_t *pc;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1738 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
1739 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
1740
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1741 pc = qs->parent;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1742 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
1743
8990
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1744 if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1745 return NGX_OK;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1746 }
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8988
diff changeset
1747
8908
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1748 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
1749
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1750 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
1751 return NGX_OK;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1752 }
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1753
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1754 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
1755
9010
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1756 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1757 "quic stream id:0x%xL flow update msd:%uL",
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 9005
diff changeset
1758 qs->id, qs->recv_max_data);
8908
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1759
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1760 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
1761 if (frame == NULL) {
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1762 return NGX_ERROR;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1763 }
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1764
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1765 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
1766 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
1767 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
1768 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
1769
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1770 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
1771
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1772 return NGX_OK;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1773 }
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1774
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8906
diff changeset
1775
8909
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1776 static ngx_int_t
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1777 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
1778 {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1779 uint64_t recv_max_data;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1780 ngx_quic_frame_t *frame;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1781 ngx_quic_connection_t *qc;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1782
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1783 qc = ngx_quic_get_connection(c);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1784
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1785 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
1786
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1787 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
1788 return NGX_OK;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1789 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1790
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1791 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
1792
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1793 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
1794 "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
1795
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1796 frame = ngx_quic_alloc_frame(c);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1797 if (frame == NULL) {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1798 return NGX_ERROR;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1799 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1800
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1801 frame->level = ssl_encryption_application;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1802 frame->type = NGX_QUIC_FT_MAX_DATA;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1803 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
1804
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1805 ngx_quic_queue_frame(qc, frame);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1806
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1807 return NGX_OK;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1808 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1809
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8908
diff changeset
1810
8993
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1811 static void
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1812 ngx_quic_set_event(ngx_event_t *ev)
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1813 {
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1814 ev->ready = 1;
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1815
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1816 if (ev->active) {
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1817 ngx_post_event(ev, &ngx_posted_events);
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1818 }
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8990
diff changeset
1819 }