annotate src/event/quic/ngx_event_quic_streams.c @ 9084:d565cf69ff5d quic

QUIC: reschedule path validation on path insertion/removal. Two issues fixed: - new path validation could be scheduled late - a validated path could leave a spurious timer
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 09 May 2023 19:42:40 +0400
parents f68fdb017141
children cc3d24a9b76f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 #define NGX_QUIC_STREAM_GONE (void *) -1
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
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: 8850
diff changeset
17 ngx_uint_t err);
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
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: 8726
diff changeset
19 static ngx_int_t ngx_quic_shutdown_stream_recv(ngx_connection_t *c);
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
20 static ngx_quic_stream_t *ngx_quic_get_stream(ngx_connection_t *c, uint64_t id);
8695
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
21 static ngx_int_t ngx_quic_reject_stream(ngx_connection_t *c, uint64_t id);
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
22 static void ngx_quic_init_stream_handler(ngx_event_t *ev);
8648
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
23 static void ngx_quic_init_streams_handler(ngx_connection_t *c);
8990
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
24 static ngx_int_t ngx_quic_do_init_streams(ngx_connection_t *c);
8410
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,
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
26 uint64_t id);
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
27 static void ngx_quic_empty_handler(ngx_event_t *ev);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
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);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
34 static ngx_int_t ngx_quic_stream_flush(ngx_quic_stream_t *qs);
8410
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);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
36 static ngx_int_t ngx_quic_close_stream(ngx_quic_stream_t *qs);
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
37 static ngx_int_t ngx_quic_can_shutdown(ngx_connection_t *c);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
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: 8850
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: 8850
diff changeset
40 static ngx_int_t ngx_quic_update_max_stream_data(ngx_quic_stream_t *qs);
8698
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
41 static ngx_int_t ngx_quic_update_max_data(ngx_connection_t *c);
8828
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
42 static void ngx_quic_set_event(ngx_event_t *ev);
8410
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;
9012
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
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: 9008
diff changeset
50 ngx_quic_stream_t *qs;
8410
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
8823
6434160b4b78 QUIC: allowed main QUIC connection for some operations.
Roman Arutyunyan <arut@nginx.com>
parents: 8794
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: 8794
diff changeset
54 qc = ngx_quic_get_connection(pc);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
56 if (qc->closing) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
57 return NULL;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
58 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
59
8410
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
9012
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
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: 9008
diff changeset
105 if (qs == NULL) {
8410
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
9012
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
109 sc = qs->connection;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
110
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
111 sc->write->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
112 sc->write->ready = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
113
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
114 if (bidi) {
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
115 sc->read->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
116 }
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
117
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
118 return sc;
8410
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 {
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
176 ngx_pool_t *pool;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
177 ngx_queue_t *q;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 ngx_rbtree_t *tree;
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
179 ngx_connection_t *sc;
8410
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
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
183 while (!ngx_queue_empty(&qc->streams.uninitialized)) {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
184 q = ngx_queue_head(&qc->streams.uninitialized);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
185 ngx_queue_remove(q);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
186
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
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: 8545
diff changeset
188 pool = qs->connection->pool;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
189
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
190 ngx_close_connection(qs->connection);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
191 ngx_destroy_pool(pool);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
192 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
193
8410
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
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
200 node = ngx_rbtree_min(tree->root, tree->sentinel);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
201
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
202 while (node) {
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 qs = (ngx_quic_stream_t *) node;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
204 node = ngx_rbtree_next(tree, node);
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
205 sc = qs->connection;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
207 qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_RECVD;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
208 qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
209
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
210 if (sc == NULL) {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
211 ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
212 continue;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
213 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
214
9008
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
215 sc->read->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
216 sc->write->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
217
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
218 ngx_quic_set_event(sc->read);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
219 ngx_quic_set_event(sc->write);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
221 sc->close = 1;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
222 sc->read->handler(sc->read);
8410
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
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
225 if (tree->root == tree->sentinel) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
226 return NGX_OK;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
227 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
228
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
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: 8982
diff changeset
230 "quic connection has active streams");
8410
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 {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
239 return ngx_quic_do_reset_stream(c->quic, err);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
240 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
241
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
242
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
243 static ngx_int_t
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
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: 8850
diff changeset
245 {
8410
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
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
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: 8823
diff changeset
251 || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_SENT
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
252 || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_RECVD)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
253 {
8637
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8623
diff changeset
254 return NGX_OK;
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8623
diff changeset
255 }
13cb758e6ac0 QUIC: reset stream only once.
Roman Arutyunyan <arut@nginx.com>
parents: 8623
diff changeset
256
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
257 qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
258 qs->send_final_size = qs->send_offset;
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
259
9008
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
260 if (qs->connection) {
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
261 qs->connection->write->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
262 }
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
263
8410
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
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
267 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
268 "quic stream id:0x%xL reset", qs->id);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
269
8410
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;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
279 frame->u.reset_stream.final_size = qs->send_offset;
8410
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
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
283 ngx_quic_free_buffer(pc, &qs->send);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
284
8410
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
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
289 ngx_int_t
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
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: 8648
diff changeset
291 {
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
292 if (how == NGX_RDWR_SHUTDOWN || how == NGX_WRITE_SHUTDOWN) {
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
293 if (ngx_quic_shutdown_stream_send(c) != NGX_OK) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
294 return NGX_ERROR;
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
295 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
296 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
297
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
298 if (how == NGX_RDWR_SHUTDOWN || how == NGX_READ_SHUTDOWN) {
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
299 if (ngx_quic_shutdown_stream_recv(c) != NGX_OK) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
300 return NGX_ERROR;
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
301 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
302 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
303
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
304 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
305 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
306
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
307
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
308 static ngx_int_t
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
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: 8726
diff changeset
310 {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
311 ngx_quic_stream_t *qs;
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
312
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
313 qs = c->quic;
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
314
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
315 if (qs->send_state != NGX_QUIC_STREAM_SEND_READY
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
316 && qs->send_state != NGX_QUIC_STREAM_SEND_SEND)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
317 {
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
318 return NGX_OK;
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
319 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
320
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
321 qs->send_state = NGX_QUIC_STREAM_SEND_SEND;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
322 qs->send_final_size = c->sent;
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
323
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
324 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, qs->parent->log, 0,
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
325 "quic stream id:0x%xL send shutdown", qs->id);
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
326
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
327 return ngx_quic_stream_flush(qs);
8679
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
328 }
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
329
b4c7853b0488 QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents: 8648
diff changeset
330
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
331 static ngx_int_t
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
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: 8726
diff changeset
333 {
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
334 ngx_connection_t *pc;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
335 ngx_quic_frame_t *frame;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
336 ngx_quic_stream_t *qs;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
337 ngx_quic_connection_t *qc;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
338
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
339 qs = c->quic;
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
340
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
341 if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
342 && qs->recv_state != NGX_QUIC_STREAM_RECV_SIZE_KNOWN)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
343 {
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
344 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
345 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
346
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
347 pc = qs->parent;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
348 qc = ngx_quic_get_connection(pc);
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
349
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
350 if (qc->conf->stream_close_code == 0) {
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
351 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
352 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
353
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
354 frame = ngx_quic_alloc_frame(pc);
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
355 if (frame == NULL) {
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
356 return NGX_ERROR;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
357 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
358
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
359 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
8727
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
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: 8726
diff changeset
361
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
362 frame->level = ssl_encryption_application;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
363 frame->type = NGX_QUIC_FT_STOP_SENDING;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
364 frame->u.stop_sending.id = qs->id;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
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: 8726
diff changeset
366
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
367 ngx_quic_queue_frame(qc, frame);
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
368
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
369 return NGX_OK;
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
370 }
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
371
23880e4ad3e2 QUIC: write and full stream shutdown support.
Roman Arutyunyan <arut@nginx.com>
parents: 8726
diff changeset
372
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 static ngx_quic_stream_t *
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
374 ngx_quic_get_stream(ngx_connection_t *c, uint64_t id)
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 uint64_t min_id;
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
377 ngx_event_t *rev;
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
378 ngx_quic_stream_t *qs;
8410
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
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
381 qc = ngx_quic_get_connection(c);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
382
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
383 qs = ngx_quic_find_stream(&qc->streams.tree, id);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
385 if (qs) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
386 return qs;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
387 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388
8694
832723a49026 QUIC: stop processing new client streams at the closing state.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8679
diff changeset
389 if (qc->shutdown || qc->closing) {
8410
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
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
393 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
394 "quic stream id:0x%xL is missing", id);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
395
8410
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 /*
8498
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8492
diff changeset
445 * RFC 9000, 2.1. Stream Types and Identifiers
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 *
8498
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8492
diff changeset
447 * successive streams of each type are created with numerically increasing
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8492
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: 8492
diff changeset
449 * streams of that type with lower-numbered stream IDs also being opened.
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
452 #if (NGX_SUPPRESS_WARN)
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
453 qs = NULL;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
454 #endif
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
455
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
456 for ( /* void */ ; min_id <= id; min_id += 0x04) {
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
458 qs = ngx_quic_create_stream(c, min_id);
8695
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
459
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
460 if (qs == NULL) {
8695
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
diff changeset
462 return NULL;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
463 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
464
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
465 continue;
8410
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
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
468 ngx_queue_insert_tail(&qc->streams.uninitialized, &qs->queue);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
470 rev = qs->connection->read;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
471 rev->handler = ngx_quic_init_stream_handler;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
472
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
473 if (qc->streams.initialized) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
474 ngx_post_event(rev, &ngx_posted_events);
9067
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
475
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
476 if (qc->push.posted) {
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
477 /*
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
478 * The posted stream can produce output immediately.
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
479 * By postponing the push event, we coalesce the stream
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
480 * output with queued frames in one UDP datagram.
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
481 */
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
482
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
483 ngx_delete_posted_event(&qc->push);
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
484 ngx_post_event(&qc->push, &ngx_posted_events);
f68fdb017141 QUIC: optimized sending stream response.
Roman Arutyunyan <arut@nginx.com>
parents: 9025
diff changeset
485 }
8410
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
8695
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
489 if (qs == NULL) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
490 return NGX_QUIC_STREAM_GONE;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
491 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
492
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
493 return qs;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
494 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
495
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
496
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
497 static ngx_int_t
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
diff changeset
499 {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
500 uint64_t code;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
501 ngx_quic_frame_t *frame;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
502 ngx_quic_connection_t *qc;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
503
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
504 qc = ngx_quic_get_connection(c);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
505
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
506 code = (id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
507 ? qc->conf->stream_reject_code_uni
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
508 : qc->conf->stream_reject_code_bidi;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
509
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
510 if (code == 0) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
511 return NGX_DECLINED;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
512 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
513
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
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: 8694
diff changeset
516
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
517 frame = ngx_quic_alloc_frame(c);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
518 if (frame == NULL) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
519 return NGX_ERROR;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
520 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
521
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
522 frame->level = ssl_encryption_application;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
diff changeset
524 frame->u.reset_stream.id = id;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
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: 8694
diff changeset
527
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
528 ngx_quic_queue_frame(qc, frame);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
529
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
530 frame = ngx_quic_alloc_frame(c);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
531 if (frame == NULL) {
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
532 return NGX_ERROR;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
533 }
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
534
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
535 frame->level = ssl_encryption_application;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
diff changeset
537 frame->u.stop_sending.id = id;
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
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: 8694
diff changeset
539
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
540 ngx_quic_queue_frame(qc, frame);
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
541
41caf5410110 QUIC: reject streams which we could not create.
Roman Arutyunyan <arut@nginx.com>
parents: 8694
diff changeset
542 return NGX_OK;
8410
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
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
546 static void
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
547 ngx_quic_init_stream_handler(ngx_event_t *ev)
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
548 {
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
549 ngx_connection_t *c;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
550 ngx_quic_stream_t *qs;
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
551
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
552 c = ev->data;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
553 qs = c->quic;
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
554
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
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: 8545
diff changeset
556
9012
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
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: 9008
diff changeset
558 c->write->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
559 c->write->ready = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
560 }
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
561
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
562 c->read->active = 1;
03897c45798e QUIC: defer setting the active flag for client stream events.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9008
diff changeset
563
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
564 ngx_queue_remove(&qs->queue);
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
565
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
566 c->listening->handler(c);
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
567 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
568
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
569
8648
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
570 ngx_int_t
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
571 ngx_quic_init_streams(ngx_connection_t *c)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
572 {
8648
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
573 ngx_int_t rc;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
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: 8638
diff changeset
575
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
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: 8638
diff changeset
577
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
578 if (qc->streams.initialized) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
579 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
580 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
581
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
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: 8638
diff changeset
583
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
584 if (rc == NGX_ERROR) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
585 return NGX_ERROR;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
586 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
587
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
588 if (rc == NGX_AGAIN) {
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
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: 8638
diff changeset
590 return NGX_OK;
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
591 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
592
8990
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
593 return ngx_quic_do_init_streams(c);
8648
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
594 }
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
595
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
596
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
diff changeset
597 static void
66b4ff373dd9 QUIC: refactored OCSP validation in preparation for 0-RTT support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8638
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: 8638
diff changeset
599 {
8990
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
600 if (ngx_quic_do_init_streams(c) != NGX_OK) {
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
601 ngx_quic_close_connection(c, NGX_ERROR);
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
602 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
603 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
604
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
605
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
606 static ngx_int_t
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
607 ngx_quic_do_init_streams(ngx_connection_t *c)
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
608 {
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
609 ngx_queue_t *q;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
610 ngx_quic_stream_t *qs;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
611 ngx_quic_connection_t *qc;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
612
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
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: 8545
diff changeset
614
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
615 qc = ngx_quic_get_connection(c);
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
616
8990
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
617 if (qc->conf->init) {
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
618 if (qc->conf->init(c) != NGX_OK) {
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
619 return NGX_ERROR;
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
620 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
621 }
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
622
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
623 for (q = ngx_queue_head(&qc->streams.uninitialized);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
624 q != ngx_queue_sentinel(&qc->streams.uninitialized);
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
625 q = ngx_queue_next(q))
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
626 {
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
627 qs = ngx_queue_data(q, ngx_quic_stream_t, queue);
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
628 ngx_post_event(qs->connection->read, &ngx_posted_events);
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
629 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
630
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
631 qc->streams.initialized = 1;
8990
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
632
b0c2234aaa9f QUIC: application init() callback.
Roman Arutyunyan <arut@nginx.com>
parents: 8985
diff changeset
633 return NGX_OK;
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
634 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
635
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
636
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
637 static ngx_quic_stream_t *
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
638 ngx_quic_create_stream(ngx_connection_t *c, uint64_t id)
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
639 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
640 ngx_log_t *log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641 ngx_pool_t *pool;
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
642 ngx_uint_t reusable;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
643 ngx_queue_t *q;
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
644 ngx_connection_t *sc;
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
645 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646 ngx_pool_cleanup_t *cln;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
647 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
648
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
649 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
650 "quic stream id:0x%xL create", id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
651
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
652 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
654 if (!ngx_queue_empty(&qc->streams.free)) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
655 q = ngx_queue_head(&qc->streams.free);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
656 qs = ngx_queue_data(q, ngx_quic_stream_t, queue);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
657 ngx_queue_remove(&qs->queue);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
658
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
659 } else {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
660 /*
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
661 * the number of streams is limited by transport
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
662 * parameters and application requirements
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
663 */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
664
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
665 qs = ngx_palloc(c->pool, sizeof(ngx_quic_stream_t));
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
666 if (qs == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
667 return NULL;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
668 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
669 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
670
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
671 ngx_memzero(qs, sizeof(ngx_quic_stream_t));
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
672
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
673 qs->node.key = id;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
674 qs->parent = c;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
675 qs->id = id;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
676 qs->send_final_size = (uint64_t) -1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
677 qs->recv_final_size = (uint64_t) -1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
678
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
679 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
680 if (pool == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
681 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
682 return NULL;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
683 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685 log = ngx_palloc(pool, sizeof(ngx_log_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
686 if (log == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
687 ngx_destroy_pool(pool);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
688 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 return NULL;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692 *log = *c->log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693 pool->log = log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
694
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
695 reusable = c->reusable;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
696 ngx_reusable_connection(c, 0);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
697
8622
a2cef164a924 QUIC: simplified stream fd initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8617
diff changeset
698 sc = ngx_get_connection(c->fd, log);
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
699 if (sc == NULL) {
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700 ngx_destroy_pool(pool);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
701 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
702 ngx_reusable_connection(c, reusable);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
706 qs->connection = sc;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
708 sc->quic = qs;
8597
486c6a9be111 QUIC: store QUIC connection fd in stream fake connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8596
diff changeset
709 sc->shared = 1;
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
710 sc->type = SOCK_STREAM;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
711 sc->pool = pool;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
712 sc->ssl = c->ssl;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
713 sc->sockaddr = c->sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
714 sc->listening = c->listening;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
715 sc->addr_text = c->addr_text;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
716 sc->local_sockaddr = c->local_sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
717 sc->local_socklen = c->local_socklen;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
718 sc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
9006
e3760b9b7c8e HTTP/3: fixed $connection_time.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8990
diff changeset
719 sc->start_time = c->start_time;
8623
630ecd703805 QUIC: set NGX_TCP_NODELAY_DISABLED for fake stream connections.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8622
diff changeset
720 sc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
721
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
722 sc->recv = ngx_quic_stream_recv;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
723 sc->send = ngx_quic_stream_send;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
724 sc->send_chain = ngx_quic_stream_send_chain;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
725
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
726 sc->read->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
727 sc->write->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
728
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
729 sc->read->handler = ngx_quic_empty_handler;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
730 sc->write->handler = ngx_quic_empty_handler;
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
731
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
732 log->connection = sc->number;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
733
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
734 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
736 qs->send_max_data = qc->ctp.initial_max_stream_data_uni;
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
737 qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_READ;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
738 qs->send_state = NGX_QUIC_STREAM_SEND_READY;
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
739
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
740 } else {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
741 qs->recv_max_data = qc->tp.initial_max_stream_data_uni;
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
742 qs->recv_state = NGX_QUIC_STREAM_RECV_RECV;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
743 qs->send_state = NGX_QUIC_STREAM_SEND_DATA_RECVD;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
744 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
745
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
746 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
747 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
748 qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_remote;
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
749 qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_local;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
750
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
751 } else {
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
752 qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_local;
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
753 qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_remote;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
754 }
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
755
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
756 qs->recv_state = NGX_QUIC_STREAM_RECV_RECV;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
757 qs->send_state = NGX_QUIC_STREAM_SEND_READY;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
760 qs->recv_window = qs->recv_max_data;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
761
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
762 cln = ngx_pool_cleanup_add(pool, 0);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
763 if (cln == NULL) {
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
764 ngx_close_connection(sc);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
765 ngx_destroy_pool(pool);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
766 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
767 ngx_reusable_connection(c, reusable);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
768 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
769 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
770
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
771 cln->handler = ngx_quic_stream_cleanup_handler;
8420
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8416
diff changeset
772 cln->data = sc;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
773
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
774 ngx_rbtree_insert(&qc->streams.tree, &qs->node);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
775
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
776 return qs;
8410
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
780 void
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
781 ngx_quic_cancelable_stream(ngx_connection_t *c)
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
782 {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
783 ngx_connection_t *pc;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
784 ngx_quic_stream_t *qs;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
785 ngx_quic_connection_t *qc;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
786
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
787 qs = c->quic;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
788 pc = qs->parent;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
789 qc = ngx_quic_get_connection(pc);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
790
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
791 if (!qs->cancelable) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
792 qs->cancelable = 1;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
793
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
794 if (ngx_quic_can_shutdown(pc) == NGX_OK) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
795 ngx_reusable_connection(pc, 1);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
796
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
797 if (qc->shutdown) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
798 ngx_quic_shutdown_quic(pc);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
799 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
800 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
801 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
802 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
803
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
804
8552
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
805 static void
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
806 ngx_quic_empty_handler(ngx_event_t *ev)
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
807 {
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
808 }
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
809
fe919fd63b0b QUIC: client certificate validation with OCSP.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8545
diff changeset
810
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
812 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
813 {
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
814 ssize_t len;
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
815 ngx_buf_t *b;
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
816 ngx_chain_t *cl, *in;
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
817 ngx_event_t *rev;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
818 ngx_connection_t *pc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
819 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
820
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
821 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
822 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
823 rev = c->read;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
824
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
825 if (qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_RECVD
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
826 || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
827 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
828 qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_READ;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
832 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
833 "quic stream id:0x%xL recv buf:%uz", qs->id, size);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
834
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
835 if (size == 0) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
836 return 0;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
839 in = ngx_quic_read_buffer(pc, &qs->recv, size);
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
840 if (in == NGX_CHAIN_ERROR) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
841 return NGX_ERROR;
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
842 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
844 len = 0;
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
845
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
846 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: 8759
diff changeset
847 b = cl->buf;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
848 len += b->last - b->pos;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
849 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: 8759
diff changeset
850 }
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
851
8761
19e063e955bf QUIC: renamed buffer-related functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
852 ngx_quic_free_chain(pc, in);
8439
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8421
diff changeset
853
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
854 if (len == 0) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
855 rev->ready = 0;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
856
8847
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8828
diff changeset
857 if (qs->recv_state == NGX_QUIC_STREAM_RECV_DATA_RECVD
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
858 && qs->recv_offset == qs->recv_final_size)
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
859 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
860 qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_READ;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
861 }
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
862
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
863 if (qs->recv_state == NGX_QUIC_STREAM_RECV_DATA_READ) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
864 rev->eof = 1;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
865 return 0;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
866 }
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
867
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
868 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
869 "quic stream id:0x%xL recv() not ready", qs->id);
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
870 return NGX_AGAIN;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
871 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
872
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
873 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
874 "quic stream id:0x%xL recv len:%z", qs->id, len);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
876 if (ngx_quic_update_flow(qs, qs->recv_offset + len) != NGX_OK) {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
877 return NGX_ERROR;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
878 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
880 return len;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
881 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
882
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
883
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
884 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
885 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
886 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
887 ngx_buf_t b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
888 ngx_chain_t cl;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
889
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
890 ngx_memzero(&b, sizeof(ngx_buf_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
891
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
892 b.memory = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
893 b.pos = buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
894 b.last = buf + size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
895
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
896 cl.buf = &b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
897 cl.next = NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
899 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
900 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
901 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
902
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
903 if (b.pos == buf) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
904 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
906
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907 return b.pos - buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911 static ngx_chain_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912 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
913 {
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
914 uint64_t n, flow;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
918 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
923 wev = c->write;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
924
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
925 if (qs->send_state != NGX_QUIC_STREAM_SEND_READY
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
926 && qs->send_state != NGX_QUIC_STREAM_SEND_SEND)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
927 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
928 wev->error = 1;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929 return NGX_CHAIN_ERROR;
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
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
932 qs->send_state = NGX_QUIC_STREAM_SEND_SEND;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
933
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
934 flow = qs->acked + qc->conf->stream_buffer_size - qs->sent;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
935
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936 if (flow == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937 wev->ready = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
939 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
941 if (limit == 0 || limit > (off_t) flow) {
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
942 limit = flow;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
945 n = qs->send.size;
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
946
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
947 in = ngx_quic_write_buffer(pc, &qs->send, in, limit, qs->sent);
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
948 if (in == NGX_CHAIN_ERROR) {
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
949 return NGX_CHAIN_ERROR;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
950 }
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
951
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
952 n = qs->send.size - n;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
953 c->sent += n;
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
954 qs->sent += n;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955 qc->streams.sent += n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
957 if (flow == n) {
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
958 wev->ready = 0;
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
959 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
962 "quic send_chain sent:%uL", n);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
964 if (ngx_quic_stream_flush(qs) != NGX_OK) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
965 return NGX_CHAIN_ERROR;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
966 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
967
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
969 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
972 static ngx_int_t
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
973 ngx_quic_stream_flush(ngx_quic_stream_t *qs)
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
974 {
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
975 off_t limit, len;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
976 ngx_uint_t last;
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
977 ngx_chain_t *out;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
978 ngx_quic_frame_t *frame;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
979 ngx_connection_t *pc;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
980 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
981
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
982 if (qs->send_state != NGX_QUIC_STREAM_SEND_SEND) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
983 return NGX_OK;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
984 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
986 pc = qs->parent;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
987 qc = ngx_quic_get_connection(pc);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
988
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
989 if (qc->streams.send_max_data == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
990 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
991 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
993 limit = ngx_min(qc->streams.send_max_data - qc->streams.send_offset,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
994 qs->send_max_data - qs->send_offset);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
995
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
996 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
997 "quic stream id:0x%xL flush limit:%O", qs->id, limit);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
998
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
999 len = qs->send.offset;
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1000
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1001 out = ngx_quic_read_buffer(pc, &qs->send, limit);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1002 if (out == NGX_CHAIN_ERROR) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1003 return NGX_ERROR;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1005
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1006 len = qs->send.offset - len;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1007 last = 0;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1008
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1009 if (qs->send_final_size != (uint64_t) -1
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1010 && qs->send_final_size == qs->send.offset)
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1011 {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1012 qs->send_state = NGX_QUIC_STREAM_SEND_DATA_SENT;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1013 last = 1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1014 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1015
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1016 if (len == 0 && !last) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1017 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1018 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1019
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1020 frame = ngx_quic_alloc_frame(pc);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1021 if (frame == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1022 return NGX_ERROR;
8410
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
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1025 frame->level = ssl_encryption_application;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1026 frame->type = NGX_QUIC_FT_STREAM;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1027 frame->data = out;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1028
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1029 frame->u.stream.off = 1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1030 frame->u.stream.len = 1;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1031 frame->u.stream.fin = last;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1032
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1033 frame->u.stream.stream_id = qs->id;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1034 frame->u.stream.offset = qs->send_offset;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1035 frame->u.stream.length = len;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1036
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1037 ngx_quic_queue_frame(qc, frame);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1038
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1039 qs->send_offset += len;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1040 qc->streams.send_offset += len;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1041
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1042 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0,
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1043 "quic stream id:0x%xL flush len:%O last:%ui",
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1044 qs->id, len, last);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1045
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1046 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1047 return ngx_quic_close_stream(qs);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1048 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1049
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1050 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1051 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1052
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1053
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1054 static void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 ngx_quic_stream_cleanup_handler(void *data)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1056 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1057 ngx_connection_t *c = data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1058
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1059 ngx_quic_stream_t *qs;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1060
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1061 qs = c->quic;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1062
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1063 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, qs->parent->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1064 "quic stream id:0x%xL cleanup", qs->id);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1065
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1066 if (ngx_quic_shutdown_stream(c, NGX_RDWR_SHUTDOWN) != NGX_OK) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1067 ngx_quic_close_connection(c, NGX_ERROR);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1068 return;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1069 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1070
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1071 qs->connection = NULL;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1072
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1073 if (ngx_quic_close_stream(qs) != NGX_OK) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1074 ngx_quic_close_connection(c, NGX_ERROR);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1075 return;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1076 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1077 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1078
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1079
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1080 static ngx_int_t
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1081 ngx_quic_close_stream(ngx_quic_stream_t *qs)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1082 {
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1088 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1090 if (!qc->closing) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1091 /* make sure everything is sent and final size is received */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1092
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1093 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: 8983
diff changeset
1094 return NGX_OK;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1095 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1096
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1097 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: 8983
diff changeset
1098 && qs->send_state != NGX_QUIC_STREAM_SEND_RESET_RECVD)
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1099 {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1100 return NGX_OK;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1101 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1102 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1103
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1104 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1105 "quic stream id:0x%xL close", qs->id);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1106
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1107 ngx_quic_free_buffer(pc, &qs->send);
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1108 ngx_quic_free_buffer(pc, &qs->recv);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1109
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1110 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1111 ngx_queue_insert_tail(&qc->streams.free, &qs->queue);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113 if (qc->closing) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114 /* schedule handler call to continue ngx_quic_close_connection() */
8982
aaca8e111959 QUIC: post close event for connection close.
Roman Arutyunyan <arut@nginx.com>
parents: 8973
diff changeset
1115 ngx_post_event(&qc->close, &ngx_posted_events);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1116 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118
8985
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1119 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: 8984
diff changeset
1120 ngx_reusable_connection(pc, 1);
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1121 }
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1122
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1123 if (qc->shutdown) {
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1124 ngx_quic_shutdown_quic(pc);
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1125 return NGX_OK;
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1126 }
740d7d6e8ff0 QUIC: do not send MAX_STREAMS in shutdown state.
Roman Arutyunyan <arut@nginx.com>
parents: 8984
diff changeset
1127
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1128 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
1129 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130 if (frame == NULL) {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1131 return NGX_ERROR;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1133
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1134 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1135 frame->type = NGX_QUIC_FT_MAX_STREAMS;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1136
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1137 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1138 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
1139 frame->u.max_streams.bidi = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1140
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1142 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
1143 frame->u.max_streams.bidi = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1145
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1149 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1151
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1152
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1153 static ngx_int_t
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1154 ngx_quic_can_shutdown(ngx_connection_t *c)
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1155 {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1156 ngx_rbtree_t *tree;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1157 ngx_rbtree_node_t *node;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1158 ngx_quic_stream_t *qs;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1159 ngx_quic_connection_t *qc;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1160
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1161 qc = ngx_quic_get_connection(c);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1162
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1163 tree = &qc->streams.tree;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1164
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1165 if (tree->root != tree->sentinel) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1166 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1167 node;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1168 node = ngx_rbtree_next(tree, node))
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1169 {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1170 qs = (ngx_quic_stream_t *) node;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1171
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1172 if (!qs->cancelable) {
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1173 return NGX_DECLINED;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1174 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1175 }
9025
12b756caaf16 QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9012
diff changeset
1176 }
8983
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1177
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1178 return NGX_OK;
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1179 }
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1180
37d5dddabaea QUIC: reusable mode for main connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8982
diff changeset
1181
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1183 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
1184 ngx_quic_frame_t *frame)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1185 {
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1186 uint64_t last;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1187 ngx_quic_stream_t *qs;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1188 ngx_quic_connection_t *qc;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1189 ngx_quic_stream_frame_t *f;
8410
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 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192 f = &frame->u.stream;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1193
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1194 if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1195 && (f->stream_id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1196 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1197 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1198 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1199 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1200
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1201 /* no overflow since both values are 62-bit */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1202 last = f->offset + f->length;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1203
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1204 qs = ngx_quic_get_stream(c, f->stream_id);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1206 if (qs == NULL) {
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1207 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1208 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1209
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1210 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1211 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1212 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1213
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1214 if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1215 && qs->recv_state != NGX_QUIC_STREAM_RECV_SIZE_KNOWN)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1216 {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1217 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1218 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1219
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1220 if (ngx_quic_control_flow(qs, last) != NGX_OK) {
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1221 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1223
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1224 if (qs->recv_final_size != (uint64_t) -1 && last > qs->recv_final_size) {
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1225 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1226 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1227 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1228
8788
47f45a98f892 QUIC: fixed handling STREAM FIN.
Roman Arutyunyan <arut@nginx.com>
parents: 8765
diff changeset
1229 if (last < qs->recv_offset) {
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1230 return NGX_OK;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1231 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1232
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1233 if (f->fin) {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1234 if (qs->recv_final_size != (uint64_t) -1 && qs->recv_final_size != last)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1235 {
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1236 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1237 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1238 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1239
8443
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1240 if (qs->recv_last > last) {
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1241 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1242 return NGX_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1243 }
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1244
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1245 qs->recv_final_size = last;
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1246 qs->recv_state = NGX_QUIC_STREAM_RECV_SIZE_KNOWN;
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1247 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1248
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1249 if (ngx_quic_write_buffer(c, &qs->recv, frame->data, f->length, f->offset)
8760
6ccf3867959a QUIC: refactored ngx_quic_order_bufs() and ngx_quic_split_bufs().
Roman Arutyunyan <arut@nginx.com>
parents: 8759
diff changeset
1250 == NGX_CHAIN_ERROR)
8444
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1251 {
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1252 return NGX_ERROR;
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1253 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1254
8847
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8828
diff changeset
1255 if (qs->recv_state == NGX_QUIC_STREAM_RECV_SIZE_KNOWN
8856
f9c788f3f5cc QUIC: ngx_quic_buffer_t object.
Roman Arutyunyan <arut@nginx.com>
parents: 8855
diff changeset
1256 && qs->recv.size == qs->recv_final_size)
8847
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8828
diff changeset
1257 {
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8828
diff changeset
1258 qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_RECVD;
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8828
diff changeset
1259 }
6c1dfd072859 QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents: 8828
diff changeset
1260
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1261 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1262 return ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1263 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1264
8973
c6580dce98a8 QUIC: fixed triggering stream read event (ticket #2409).
Roman Arutyunyan <arut@nginx.com>
parents: 8857
diff changeset
1265 if (f->offset <= qs->recv_offset) {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1266 ngx_quic_set_event(qs->connection->read);
8444
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1267 }
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1268
7d32c3c93678 QUIC: call stream read handler on new data arrival.
Roman Arutyunyan <arut@nginx.com>
parents: 8443
diff changeset
1269 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1270 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1271
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1272
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1273 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1274 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
1275 ngx_quic_max_data_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1276 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1277 ngx_rbtree_t *tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1278 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1279 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1280 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1281
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1282 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1283 tree = &qc->streams.tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1284
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1285 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
1286 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1287 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1288
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1289 if (tree->root == tree->sentinel
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1290 || qc->streams.send_offset < qc->streams.send_max_data)
8596
1f7f98638dc2 QUIC: fixed null pointer dereference in MAX_DATA handler.
Mariano Di Martino <mariano.dimartino@uhasselt.be>
parents: 8553
diff changeset
1291 {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1292 /* not blocked on MAX_DATA */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1293 qc->streams.send_max_data = f->max_data;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1294 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1295 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1296
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1297 qc->streams.send_max_data = f->max_data;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1298 node = ngx_rbtree_min(tree->root, tree->sentinel);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1299
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1300 while (node && qc->streams.send_offset < qc->streams.send_max_data) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1301
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1302 qs = (ngx_quic_stream_t *) node;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1303 node = ngx_rbtree_next(tree, node);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1304
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1305 if (ngx_quic_stream_flush(qs) != NGX_OK) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1306 return NGX_ERROR;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1307 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1308 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1309
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1310 return NGX_OK;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1314 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1315 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
1316 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
1317 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1318 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1319 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1320
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 ngx_int_t
8698
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1323 ngx_quic_handle_data_blocked_frame(ngx_connection_t *c,
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1324 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: 8697
diff changeset
1325 {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1326 return ngx_quic_update_max_data(c);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1327 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1328
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1329
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1330 ngx_int_t
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1331 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
1332 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
1333 {
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1334 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1335 ngx_quic_connection_t *qc;
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 = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1338
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1339 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1340 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1341 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1342 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1343 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1344 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1345
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1346 qs = ngx_quic_get_stream(c, f->id);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1347
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1348 if (qs == NULL) {
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1349 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1350 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1351
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1352 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1353 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1354 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1355
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1356 return ngx_quic_update_max_stream_data(qs);
8410
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
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 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1361 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
1362 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
1363 {
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1364 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1365 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1366
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1367 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1368
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1369 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1370 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1371 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1372 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1373 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1374 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1375
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1376 qs = ngx_quic_get_stream(c, f->id);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1377
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1378 if (qs == NULL) {
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1379 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1380 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1381
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1382 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1383 return NGX_OK;
8410
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
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1386 if (f->limit <= qs->send_max_data) {
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1387 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1388 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1389
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1390 if (qs->send_offset < qs->send_max_data) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1391 /* not blocked on MAX_STREAM_DATA */
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1392 qs->send_max_data = f->limit;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1393 return NGX_OK;
8410
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
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1396 qs->send_max_data = f->limit;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1397
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1398 return ngx_quic_stream_flush(qs);
8410
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1401
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1402 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1403 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
1404 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
1405 {
9008
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
1406 ngx_event_t *rev;
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1407 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1408 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1409
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1410 qc = ngx_quic_get_connection(c);
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 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1413 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
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 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1416 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1417 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1418
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1419 qs = ngx_quic_get_stream(c, f->id);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1420
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1421 if (qs == NULL) {
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1422 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1423 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1424
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1425 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1426 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1427 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1428
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1429 if (qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_RECVD
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1430 || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1431 {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1432 return NGX_OK;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1433 }
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1434
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1435 qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_RECVD;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1436
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1437 if (ngx_quic_control_flow(qs, f->final_size) != NGX_OK) {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1438 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1439 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1440
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1441 if (qs->recv_final_size != (uint64_t) -1
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1442 && qs->recv_final_size != f->final_size)
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1443 {
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1444 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1445 return NGX_ERROR;
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1446 }
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1447
8443
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1448 if (qs->recv_last > f->final_size) {
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1449 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1450 return NGX_ERROR;
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1451 }
60c6e8d8d3ae QUIC: make sure stream data size is lower than final size.
Roman Arutyunyan <arut@nginx.com>
parents: 8442
diff changeset
1452
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1453 qs->recv_final_size = f->final_size;
8442
b3f6ad181df4 QUIC: refactored CRYPTO and STREAM buffer ordering.
Roman Arutyunyan <arut@nginx.com>
parents: 8439
diff changeset
1454
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1455 if (ngx_quic_update_flow(qs, qs->recv_final_size) != NGX_OK) {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1456 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1457 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1458
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1459 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1460 return ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1461 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1462
9008
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
1463 rev = qs->connection->read;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
1464 rev->error = 1;
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
1465
2ee6f9729739 QUIC: set stream error flag on reset.
Roman Arutyunyan <arut@nginx.com>
parents: 9007
diff changeset
1466 ngx_quic_set_event(rev);
8410
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 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1469 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1470
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1471
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1472 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1473 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
1474 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
1475 {
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1476 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1477 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1478
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1479 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1480
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1481 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1482 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1483 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1484 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1485 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1486 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1487
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1488 qs = ngx_quic_get_stream(c, f->id);
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1489
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1490 if (qs == NULL) {
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1491 return NGX_ERROR;
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1492 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1493
8726
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1494 if (qs == NGX_QUIC_STREAM_GONE) {
0692355a3519 QUIC: simplified stream initialization.
Roman Arutyunyan <arut@nginx.com>
parents: 8725
diff changeset
1495 return NGX_OK;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1496 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1497
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1498 if (ngx_quic_do_reset_stream(qs, f->error_code) != NGX_OK) {
8638
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8637
diff changeset
1499 return NGX_ERROR;
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8637
diff changeset
1500 }
1ead7d64e993 QUIC: send RESET_STREAM in response to STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8637
diff changeset
1501
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1502 if (qs->connection == NULL) {
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1503 return ngx_quic_close_stream(qs);
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1504 }
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1505
8828
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1506 ngx_quic_set_event(qs->connection->write);
8410
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_max_streams_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_max_streams_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1515 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1516 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1517
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1518 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1519
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1520 if (f->bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1521 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
1522 qc->streams.server_max_streams_bidi = f->limit;
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 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
1525 "quic max_streams_bidi:%uL", f->limit);
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1528 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1529 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
1530 qc->streams.server_max_streams_uni = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1531
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1532 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
1533 "quic max_streams_uni:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1534 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1535 }
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 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1538 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1539
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1540
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1541 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1542 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
1543 {
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1544 uint64_t acked;
8421
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8420
diff changeset
1545 ngx_quic_stream_t *qs;
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1546 ngx_quic_connection_t *qc;
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 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1549
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1550 switch (f->type) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1551
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1552 case NGX_QUIC_FT_RESET_STREAM:
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1553
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1554 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: 8983
diff changeset
1555 if (qs == NULL) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1556 return;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1557 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1558
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1559 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: 8983
diff changeset
1560
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1561 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: 8983
diff changeset
1562 "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: 8983
diff changeset
1563 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: 8983
diff changeset
1564
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1565 break;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1566
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1567 case NGX_QUIC_FT_STREAM:
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1568
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1569 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: 8983
diff changeset
1570 if (qs == NULL) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1571 return;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1572 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1573
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1574 acked = qs->acked;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1575 qs->acked += f->u.stream.length;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1576
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1577 if (f->u.stream.fin) {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1578 qs->fin_acked = 1;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1579 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1580
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1581 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: 8983
diff changeset
1582 && qs->acked == qs->sent && qs->fin_acked)
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1583 {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1584 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: 8983
diff changeset
1585 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1586
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1587 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: 8983
diff changeset
1588 "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: 8983
diff changeset
1589 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: 8983
diff changeset
1590 qs->sent - qs->acked);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1591
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1592 if (qs->connection
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1593 && 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: 8983
diff changeset
1594 && f->u.stream.length > 0)
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1595 {
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1596 ngx_quic_set_event(qs->connection->write);
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1597 }
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1598
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1599 break;
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1600
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1601 default:
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1602 return;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1603 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1604
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1605 if (qs->connection == NULL) {
8984
2e51cf3ffd90 QUIC: defer stream removal until all its data is acked.
Roman Arutyunyan <arut@nginx.com>
parents: 8983
diff changeset
1606 ngx_quic_close_stream(qs);
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1607 }
8410
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1608 }
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1609
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1610
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1611 static ngx_int_t
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1612 ngx_quic_control_flow(ngx_quic_stream_t *qs, uint64_t last)
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1613 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1614 uint64_t len;
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1615 ngx_connection_t *pc;
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1616 ngx_quic_connection_t *qc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1617
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1618 pc = qs->parent;
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1619 qc = ngx_quic_get_connection(pc);
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1620
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1621 if (last <= qs->recv_last) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1622 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1623 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1624
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1625 len = last - qs->recv_last;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1626
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1627 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1628 "quic stream id:0x%xL flow control msd:%uL/%uL md:%uL/%uL",
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1629 qs->id, last, qs->recv_max_data, qc->streams.recv_last + len,
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1630 qc->streams.recv_max_data);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1631
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1632 qs->recv_last += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1633
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1634 if (qs->recv_state == NGX_QUIC_STREAM_RECV_RECV
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1635 && qs->recv_last > qs->recv_max_data)
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1636 {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1637 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1638 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1639 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1640
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1641 qc->streams.recv_last += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1642
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1643 if (qc->streams.recv_last > qc->streams.recv_max_data) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1644 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1645 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1646 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1647
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1648 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1649 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1650
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1651
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1652 static ngx_int_t
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1653 ngx_quic_update_flow(ngx_quic_stream_t *qs, uint64_t last)
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1654 {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1655 uint64_t len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1656 ngx_connection_t *pc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1657 ngx_quic_connection_t *qc;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1658
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1659 pc = qs->parent;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1660 qc = ngx_quic_get_connection(pc);
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1661
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1662 if (last <= qs->recv_offset) {
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1663 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1664 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1665
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1666 len = last - qs->recv_offset;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1667
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1668 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1669 "quic stream id:0x%xL flow update %uL", qs->id, last);
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1670
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1671 qs->recv_offset += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1672
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1673 if (qs->recv_max_data <= qs->recv_offset + qs->recv_window / 2) {
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1674 if (ngx_quic_update_max_stream_data(qs) != NGX_OK) {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1675 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1676 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1677 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1678
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1679 qc->streams.recv_offset += len;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1680
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1681 if (qc->streams.recv_max_data
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1682 <= qc->streams.recv_offset + qc->streams.recv_window / 2)
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1683 {
8698
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1684 if (ngx_quic_update_max_data(pc) != NGX_OK) {
8492
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1685 return NGX_ERROR;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1686 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1687 }
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1688
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1689 return NGX_OK;
af33d1ef1c3c QUIC: stream flow control refactored.
Roman Arutyunyan <arut@nginx.com>
parents: 8444
diff changeset
1690 }
8617
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8597
diff changeset
1691
9ae239d2547d QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents: 8597
diff changeset
1692
8697
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1693 static ngx_int_t
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1694 ngx_quic_update_max_stream_data(ngx_quic_stream_t *qs)
8697
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1695 {
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1696 uint64_t recv_max_data;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1697 ngx_connection_t *pc;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1698 ngx_quic_frame_t *frame;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1699 ngx_quic_connection_t *qc;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1700
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1701 pc = qs->parent;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1702 qc = ngx_quic_get_connection(pc);
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1703
8825
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1704 if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV) {
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1705 return NGX_OK;
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1706 }
b42a041d23a2 QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents: 8823
diff changeset
1707
8697
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1708 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: 8695
diff changeset
1709
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1710 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: 8695
diff changeset
1711 return NGX_OK;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1712 }
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1713
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1714 qs->recv_max_data = recv_max_data;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1715
8855
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1716 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0,
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1717 "quic stream id:0x%xL flow update msd:%uL",
a5aebd51e4c7 QUIC: stream lingering.
Roman Arutyunyan <arut@nginx.com>
parents: 8850
diff changeset
1718 qs->id, qs->recv_max_data);
8697
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1719
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1720 frame = ngx_quic_alloc_frame(pc);
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1721 if (frame == NULL) {
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1722 return NGX_ERROR;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1723 }
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1724
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1725 frame->level = ssl_encryption_application;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1726 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: 8695
diff changeset
1727 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: 8695
diff changeset
1728 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: 8695
diff changeset
1729
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1730 ngx_quic_queue_frame(qc, frame);
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1731
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1732 return NGX_OK;
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1733 }
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1734
e8cbbfabe547 QUIC: update stream flow control credit on STREAM_DATA_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8695
diff changeset
1735
8698
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1736 static ngx_int_t
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1737 ngx_quic_update_max_data(ngx_connection_t *c)
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1738 {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1739 uint64_t recv_max_data;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1740 ngx_quic_frame_t *frame;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1741 ngx_quic_connection_t *qc;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1742
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1743 qc = ngx_quic_get_connection(c);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1744
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1745 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: 8697
diff changeset
1746
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1747 if (qc->streams.recv_max_data == recv_max_data) {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1748 return NGX_OK;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1749 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1750
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1751 qc->streams.recv_max_data = recv_max_data;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1752
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1753 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1754 "quic flow update md:%uL", qc->streams.recv_max_data);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1755
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1756 frame = ngx_quic_alloc_frame(c);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1757 if (frame == NULL) {
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1758 return NGX_ERROR;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1759 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1760
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1761 frame->level = ssl_encryption_application;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1762 frame->type = NGX_QUIC_FT_MAX_DATA;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1763 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: 8697
diff changeset
1764
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1765 ngx_quic_queue_frame(qc, frame);
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1766
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1767 return NGX_OK;
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1768 }
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1769
d041b8d6ab0b QUIC: handle DATA_BLOCKED frame from client.
Roman Arutyunyan <arut@nginx.com>
parents: 8697
diff changeset
1770
8828
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1771 static void
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1772 ngx_quic_set_event(ngx_event_t *ev)
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1773 {
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1774 ev->ready = 1;
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1775
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1776 if (ev->active) {
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1777 ngx_post_event(ev, &ngx_posted_events);
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1778 }
7626aa7a2156 QUIC: stream event setting function.
Roman Arutyunyan <arut@nginx.com>
parents: 8825
diff changeset
1779 }