annotate src/event/quic/ngx_event_quic_streams.c @ 8781:81d491f0dc8c quic

QUIC: unroll and inline ngx_quic_varint_len()/ngx_quic_build_int(). According to profiling, those two are among most frequently called, so inlining is generally useful, and unrolling should help with it. Further, this fixes undefined behaviour seen with invalid values. Inspired by Yu Liu.
author Sergey Kandaurov <pluknet@nginx.com>
date Sat, 22 May 2021 18:40:45 +0300
parents f52a2b77d406
children b3f6ad181df4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 #define NGX_QUIC_STREAM_GONE (void *) -1
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 static ngx_quic_stream_t *ngx_quic_create_client_stream(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 uint64_t id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c,
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
19 uint64_t id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 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
21 size_t size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 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
23 size_t size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 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
25 ngx_chain_t *in, off_t limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 static size_t ngx_quic_max_stream_flow(ngx_connection_t *c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 static void ngx_quic_stream_cleanup_handler(void *data);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 ngx_connection_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 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
32 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 uint64_t id;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
34 ngx_quic_stream_t *qs, *nqs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 qc = ngx_quic_get_connection(qs->parent);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 if (bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 if (qc->streams.server_streams_bidi
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 >= qc->streams.server_max_streams_bidi)
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 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
45 "quic too many server bidi streams:%uL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 qc->streams.server_streams_bidi);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 id = (qc->streams.server_streams_bidi << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 | NGX_QUIC_STREAM_SERVER_INITIATED;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 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
54 "quic creating server bidi stream"
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 " streams:%uL max:%uL id:0x%xL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 qc->streams.server_streams_bidi,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 qc->streams.server_max_streams_bidi, id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 qc->streams.server_streams_bidi++;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 if (qc->streams.server_streams_uni
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 >= qc->streams.server_max_streams_uni)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 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
66 "quic too many server uni streams:%uL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 qc->streams.server_streams_uni);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 return NULL;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 id = (qc->streams.server_streams_uni << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 | NGX_QUIC_STREAM_SERVER_INITIATED
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 "quic creating server uni stream"
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 " streams:%uL max:%uL id:0x%xL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 qc->streams.server_streams_uni,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 qc->streams.server_max_streams_uni, id);
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 qc->streams.server_streams_uni++;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
84 nqs = ngx_quic_create_stream(qs->parent, id);
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
85 if (nqs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
89 return nqs->connection;
8750
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 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
95 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
96 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 ngx_rbtree_node_t **p;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 ngx_quic_stream_t *qn, *qnt;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 for ( ;; ) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 qn = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 qnt = (ngx_quic_stream_t *) temp;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 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
105
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 if (*p == sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 break;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 temp = *p;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 *p = node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 node->parent = temp;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 node->left = sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 node->right = sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 ngx_rbt_red(node);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 ngx_quic_stream_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 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
123 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 ngx_rbtree_node_t *node, *sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 ngx_quic_stream_t *qn;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 node = rbtree->root;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 sentinel = rbtree->sentinel;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 while (node != sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 qn = (ngx_quic_stream_t *) node;
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 if (id == qn->id) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 return qn;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 node = (id < qn->id) ? node->left : node->right;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 return NULL;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 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
146 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 ngx_event_t *rev, *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 ngx_rbtree_t *tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 #if (NGX_DEBUG)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 ngx_uint_t ns;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 #endif
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 tree = &qc->streams.tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 if (tree->root == tree->sentinel) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 }
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 (NGX_DEBUG)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 ns = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 #endif
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 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 node = ngx_rbtree_next(tree, node))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 qs = (ngx_quic_stream_t *) node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
172 rev = qs->connection->read;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 rev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 rev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
176 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 wev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 ngx_post_event(rev, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 if (rev->timer_set) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 ngx_del_timer(rev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 #if (NGX_DEBUG)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 ns++;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 #endif
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 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
192 "quic connection has %ui active streams", ns);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 return NGX_AGAIN;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 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
200 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 frame->type = NGX_QUIC_FT_RESET_STREAM;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 frame->u.reset_stream.id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 frame->u.reset_stream.error_code = err;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 frame->u.reset_stream.final_size = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 ngx_quic_queue_frame(qc, frame);
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 wev = c->write;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 wev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230
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 static ngx_quic_stream_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 ngx_quic_create_client_stream(ngx_connection_t *c, uint64_t id)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 uint64_t min_id;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
236 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 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
240 "quic stream id:0x%xL is new", id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 if (qc->shutdown) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 if ((id >> 2) < qc->streams.server_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 if ((id >> 2) < qc->streams.client_streams_uni) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 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
264 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 min_id = (qc->streams.client_streams_uni << 2)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 qc->streams.client_streams_uni = (id >> 2) + 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 } else {
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 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 if ((id >> 2) < qc->streams.server_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 if ((id >> 2) < qc->streams.client_streams_bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 }
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 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
288 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292 min_id = (qc->streams.client_streams_bidi << 2);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 qc->streams.client_streams_bidi = (id >> 2) + 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 /*
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 * 2.1. Stream Types and Identifiers
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 * Within each type, streams are created with numerically increasing
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 * stream IDs. A stream ID that is used out of order results in all
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 * streams of that type with lower-numbered stream IDs also being
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 * opened.
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 for ( /* void */ ; min_id < id; min_id += 0x04) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
307 qs = ngx_quic_create_stream(c, min_id);
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
308 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
312 qs->connection->listening->handler(qs->connection);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 if (qc->shutdown) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 return NGX_QUIC_STREAM_GONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
319 return ngx_quic_create_stream(c, id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 static ngx_quic_stream_t *
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
324 ngx_quic_create_stream(ngx_connection_t *c, uint64_t id)
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 ngx_log_t *log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 ngx_pool_t *pool;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
328 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
329 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 ngx_pool_cleanup_t *cln;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 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
334 "quic stream id:0x%xL create", id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 if (pool == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
343 qs = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
344 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
349 qs->node.key = id;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
350 qs->parent = c;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
351 qs->id = id;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
353 qs->fs = ngx_pcalloc(pool, sizeof(ngx_quic_frames_stream_t));
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
354 if (qs->fs == NULL) {
8754
915c2f7092ed QUIC: ngx_quic_frames_stream_t made opaque.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8750
diff changeset
355 ngx_destroy_pool(pool);
915c2f7092ed QUIC: ngx_quic_frames_stream_t made opaque.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8750
diff changeset
356 return NULL;
915c2f7092ed QUIC: ngx_quic_frames_stream_t made opaque.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8750
diff changeset
357 }
915c2f7092ed QUIC: ngx_quic_frames_stream_t made opaque.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8750
diff changeset
358
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
359 ngx_queue_init(&qs->fs->frames);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 log = ngx_palloc(pool, sizeof(ngx_log_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 if (log == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 *log = *c->log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 pool->log = log;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
370 sc = ngx_get_connection(-1, log);
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
371 if (sc == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
376 qs->connection = sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
378 sc->quic = qs;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
379 sc->type = SOCK_STREAM;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
380 sc->pool = pool;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
381 sc->ssl = c->ssl;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
382 sc->sockaddr = c->sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
383 sc->listening = c->listening;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
384 sc->addr_text = c->addr_text;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
385 sc->local_sockaddr = c->local_sockaddr;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
386 sc->local_socklen = c->local_socklen;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
387 sc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
389 sc->recv = ngx_quic_stream_recv;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
390 sc->send = ngx_quic_stream_send;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
391 sc->send_chain = ngx_quic_stream_send_chain;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
393 sc->read->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
394 sc->write->log = log;
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
395
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
396 log->connection = sc->number;
8750
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_UNIDIRECTIONAL) == 0
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 {
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
401 sc->write->ready = 1;
8750
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
406 qs->send_max_data = qc->ctp.initial_max_stream_data_uni;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
407
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
408 } else {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
409 qs->recv_max_data = qc->tp.initial_max_stream_data_uni;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
414 qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_remote;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
415 qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_local;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
416
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 } else {
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
418 qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_local;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
419 qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_remote;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 }
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 cln = ngx_pool_cleanup_add(pool, 0);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 if (cln == NULL) {
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
425 ngx_close_connection(sc);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427 return NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 cln->handler = ngx_quic_stream_cleanup_handler;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
431 cln->data = sc;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
433 ngx_rbtree_insert(&qc->streams.tree, &qs->node);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
435 return qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 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
441 {
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
442 ssize_t len, n;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 ngx_buf_t *b;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
444 ngx_chain_t *cl, **ll;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 ngx_event_t *rev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 ngx_quic_connection_t *qc;
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 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 rev = c->read;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 if (rev->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
460 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
461 "quic stream recv id:0x%xL eof:%d",
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
462 qs->id, rev->pending_eof);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
464 if (qs->in == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 rev->ready = 0;
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 if (rev->pending_eof) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468 rev->eof = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 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
473 "quic stream id:0x%xL recv() not ready", qs->id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
477 len = 0;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
478 cl = qs->in;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
479
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
480 for (ll = &cl; *ll; ll = &(*ll)->next) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
481 b = (*ll)->buf;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
483 n = ngx_min(b->last - b->pos, (ssize_t) size);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
484 buf = ngx_cpymem(buf, b->pos, n);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
485
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
486 len += n;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
487 size -= n;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
488 b->pos += n;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
490 if (b->pos != b->last) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
491 break;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
492 }
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
493 }
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
495 qs->in = *ll;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
496 *ll = NULL;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
497
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
498 ngx_quic_free_bufs(pc, cl);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
499
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
500 qc->streams.received += len;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
501 qs->recv_max_data += len;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
502
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
503 if (qs->in == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 rev->ready = rev->pending_eof;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 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
508 "quic stream id:0x%xL recv len:%z of size:%uz",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 qs->id, len, size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511 if (!rev->pending_eof) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 frame->u.max_stream_data.id = qs->id;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
520 frame->u.max_stream_data.limit = qs->recv_max_data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525 if ((qc->streams.recv_max_data / 2) < qc->streams.received) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 qc->streams.recv_max_data *= 2;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 frame->type = NGX_QUIC_FT_MAX_DATA;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 frame->u.max_data.max_data = qc->streams.recv_max_data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542 "quic stream id:0x%xL recv: increased max_data:%uL",
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 qs->id, qc->streams.recv_max_data);
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 return len;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 static ssize_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 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
552 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 ngx_buf_t b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 ngx_chain_t cl;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 ngx_memzero(&b, sizeof(ngx_buf_t));
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 b.memory = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 b.pos = buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560 b.last = buf + size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 cl.buf = &b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563 cl.next = NULL;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 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
566 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569 if (b.pos == buf) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570 return NGX_AGAIN;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573 return b.pos - buf;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577 static ngx_chain_t *
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 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
579 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 size_t n, flow;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 ngx_chain_t *cl;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
591 wev = c->write;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593 if (wev->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594 return NGX_CHAIN_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
595 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
596
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597 flow = ngx_quic_max_stream_flow(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
598 if (flow == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
599 wev->ready = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603 n = (limit && (size_t) limit < flow) ? (size_t) limit : flow;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
605 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
606 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607 return NGX_CHAIN_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610 frame->data = ngx_quic_copy_chain(pc, in, n);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611 if (frame->data == NGX_CHAIN_ERROR) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 return NGX_CHAIN_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615 for (n = 0, cl = frame->data; cl; cl = cl->next) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 n += ngx_buf_size(cl->buf);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 while (in && ngx_buf_size(in->buf) == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620 in = in->next;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625 frame->u.stream.off = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
626 frame->u.stream.len = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 frame->u.stream.fin = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629 frame->u.stream.type = frame->type;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630 frame->u.stream.stream_id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 frame->u.stream.offset = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 frame->u.stream.length = n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
633
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
634 c->sent += n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
635 qc->streams.sent += n;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
636
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
637 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
638
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
639 wev->ready = (n < flow) ? 1 : 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
640
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641 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
642 "quic send_chain sent:%uz", n);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
643
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
644 return in;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
647
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
648 static size_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
649 ngx_quic_max_stream_flow(ngx_connection_t *c)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
650 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
651 size_t size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
652 uint64_t sent, unacked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
654 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
655
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
656 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657 qc = ngx_quic_get_connection(qs->parent);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
659 size = NGX_QUIC_STREAM_BUFSIZE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660 sent = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
661 unacked = sent - qs->acked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
662
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
663 if (qc->streams.send_max_data == 0) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
664 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
665 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
666
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
667 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
668 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
669 "quic send flow hit buffer size");
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
670 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
671 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
672
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
673 if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
674 size = NGX_QUIC_STREAM_BUFSIZE - unacked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
675 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
676
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
677 if (qc->streams.sent >= qc->streams.send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
678 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
679 "quic send flow hit MAX_DATA");
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
680 return 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
681 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
682
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
683 if (qc->streams.sent + size > qc->streams.send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684 size = qc->streams.send_max_data - qc->streams.sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
686
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
687 if (sent >= qs->send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
688 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 "quic send flow hit MAX_STREAM_DATA");
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690 return 0;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693 if (sent + size > qs->send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
694 size = qs->send_max_data - sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
695 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697 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
698 "quic send flow:%uz", size);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700 return size;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
701 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
702
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704 static void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705 ngx_quic_stream_cleanup_handler(void *data)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707 ngx_connection_t *c = data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
708
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
709 ngx_connection_t *pc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
710 ngx_quic_frame_t *frame;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
712 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
713
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
714 qs = c->quic;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
715 pc = qs->parent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
716 qc = ngx_quic_get_connection(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
717
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
718 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
719 "quic stream id:0x%xL cleanup", qs->id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
720
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
721 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
8754
915c2f7092ed QUIC: ngx_quic_frames_stream_t made opaque.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8750
diff changeset
722 ngx_quic_free_frames(pc, &qs->fs->frames);
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
723 ngx_quic_free_bufs(pc, qs->in);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
724
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
725 if (qc->closing) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
726 /* schedule handler call to continue ngx_quic_close_connection() */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
727 ngx_post_event(pc->read, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
728 return;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
729 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
730
8756
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
731 if (qc->error) {
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
732 goto done;
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
733 }
e29b7508b8b3 QUIC: avoid sending extra frames in case of error.
Vladimir Homutov <vl@nginx.com>
parents: 8755
diff changeset
734
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735 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
736 || (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
737 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
738 if (!c->read->pending_eof && !c->read->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
739 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
740 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
741 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
742 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
743
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
744 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
745 frame->type = NGX_QUIC_FT_STOP_SENDING;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
746 frame->u.stop_sending.id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
747 frame->u.stop_sending.error_code = 0x100; /* HTTP/3 no error */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
748
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
749 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
750 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
751 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
752
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
753 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
754 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
755 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
756 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
757 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
760 frame->type = NGX_QUIC_FT_MAX_STREAMS;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
761
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
762 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
763 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
764 frame->u.max_streams.bidi = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
765
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
766 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
767 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
768 frame->u.max_streams.bidi = 1;
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 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
772
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
773 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
774 /* do not send fin for client unidirectional streams */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
775 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
776 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779 if (c->write->error) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
780 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
781 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783 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
784 "quic stream id:0x%xL send fin", qs->id);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786 frame = ngx_quic_alloc_frame(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 goto done;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 frame->level = ssl_encryption_application;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792 frame->type = NGX_QUIC_FT_STREAM7; /* OFF=1 LEN=1 FIN=1 */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
793 frame->u.stream.off = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794 frame->u.stream.len = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 frame->u.stream.fin = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797 frame->u.stream.type = frame->type;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
798 frame->u.stream.stream_id = qs->id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799 frame->u.stream.offset = c->sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800 frame->u.stream.length = 0;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802 ngx_quic_queue_frame(qc, frame);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
803
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
804 done:
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
806 (void) ngx_quic_output(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
807
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808 if (qc->shutdown) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809 ngx_quic_shutdown_quic(pc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
810 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
812
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
813
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
814 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
815 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
816 ngx_quic_frame_t *frame)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
817 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
818 uint64_t last;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
819 ngx_pool_t *pool;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
820 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
821 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
822 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
823 ngx_quic_stream_frame_t *f;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
824 ngx_quic_frames_stream_t *fs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
825
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
826 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
827 f = &frame->u.stream;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
828
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829 if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830 && (f->stream_id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
832 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
833 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
834 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
835
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
836 /* no overflow since both values are 62-bit */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837 last = f->offset + f->length;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
839 qs = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
840
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
841 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
842 qs = ngx_quic_create_client_stream(c, f->stream_id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
844 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
845 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
846 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
847
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
848 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
849 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
850 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
851
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
852 sc = qs->connection;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
853 fs = qs->fs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
854
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
855 if (last > qs->recv_max_data) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
856 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
857 goto cleanup;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
858 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
859
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
860 if (ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input,
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
861 qs)
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
862 != NGX_OK)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
863 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
864 goto cleanup;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
865 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
866
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
867 sc->listening->handler(sc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
868
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
871
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
872 fs = qs->fs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
873
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
874 if (last > qs->recv_max_data) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
876 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
877 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
878
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input,
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
880 qs);
8750
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 cleanup:
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 pool = sc->pool;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
885
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
886 ngx_close_connection(sc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
887 ngx_destroy_pool(pool);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
888
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
889 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
890 }
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
893 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
894 ngx_quic_stream_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
895 {
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
896 ssize_t n;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
897 uint64_t id;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898 ngx_buf_t *b;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
899 ngx_event_t *rev;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
900 ngx_chain_t *cl, **ll;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
901 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
902 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
903 ngx_quic_stream_frame_t *f;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
904
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 qc = ngx_quic_get_connection(c);
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
906 qs = data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908 f = &frame->u.stream;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909 id = f->stream_id;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
910 cl = frame->data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
912 for (ll = &qs->in; *ll; ll = &(*ll)->next) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
913 if ((*ll)->next) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
914 continue;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
915 }
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
916
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
917 /* append to last buffer */
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
918
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
919 b = (*ll)->buf;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
921 while (cl && b->last != b->end) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
922 n = ngx_min(cl->buf->last - cl->buf->pos, b->end - b->last);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
923 b->last = ngx_cpymem(b->last, cl->buf->pos, n);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
924 cl->buf->pos += n;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
925
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
926 if (cl->buf->pos == cl->buf->last) {
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
927 cl = cl->next;
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
928 }
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
929 }
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
930 }
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
931
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
932 cl = ngx_quic_copy_chain(c, cl, 0);
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
933 if (cl == NGX_CHAIN_ERROR) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
937 *ll = cl;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
939 rev = qs->connection->read;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940 rev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942 if (f->fin) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943 rev->pending_eof = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
946 if (rev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 rev->handler(rev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
948 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
949
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
950 /* check if stream was destroyed by handler */
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
951 if (ngx_quic_find_stream(&qc->streams.tree, id) == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
952 return NGX_DONE;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
953 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
957
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
958
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
959 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960 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
961 ngx_quic_max_data_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
962 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
964 ngx_rbtree_t *tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
965 ngx_rbtree_node_t *node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
966 ngx_quic_stream_t *qs;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
967 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
969 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970 tree = &qc->streams.tree;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
972 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
973 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
974 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976 if (qc->streams.sent >= qc->streams.send_max_data) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
977
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
978 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
979 node;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
980 node = ngx_rbtree_next(tree, node))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
981 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
982 qs = (ngx_quic_stream_t *) node;
8760
baf9551b4a5b QUIC: renamed stream field from c to connection.
Roman Arutyunyan <arut@nginx.com>
parents: 8756
diff changeset
983 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
984
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985 if (wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
986 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987 ngx_post_event(wev, &ngx_posted_events);
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 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
990 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
991
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992 qc->streams.send_max_data = f->max_data;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
993
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
994 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
995 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
996
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
997
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
999 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
1000 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
1001 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1005
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1006 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1007 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
1008 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
1009 {
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1010 uint64_t limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1011 ngx_quic_frame_t *frame;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1012 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1013 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1014
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1016
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1017 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1018 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1019 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1020 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1021 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1022 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1023
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1024 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1025
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1026 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1027 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1028
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1029 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1030 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1031 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1032
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1033 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1034 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1035 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1036
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1037 limit = qs->recv_max_data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1038
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1039 qs->connection->listening->handler(qs->connection);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1040
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1041 } else {
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1042 limit = qs->recv_max_data;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1043 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1044
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1045 frame = ngx_quic_alloc_frame(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1046 if (frame == NULL) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1047 return NGX_ERROR;
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
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1050 frame->level = pkt->level;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1051 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1052 frame->u.max_stream_data.id = f->id;
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8761
diff changeset
1053 frame->u.max_stream_data.limit = limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1054
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 ngx_quic_queue_frame(qc, frame);
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 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1058 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1059
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1060
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1061 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1062 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
1063 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
1064 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1065 uint64_t sent;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1066 ngx_event_t *wev;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1067 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1068 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1069
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1070 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1071
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1072 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1073 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1074 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1075 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1076 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1077 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1078
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1079 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1081 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1082 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1084 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1088 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1090 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1091
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1092 if (f->limit > qs->send_max_data) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1093 qs->send_max_data = f->limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1095
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1096 qs->connection->listening->handler(qs->connection);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1097
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1098 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1099 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1100
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1101 if (f->limit <= qs->send_max_data) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1102 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1103 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1104
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1105 sent = qs->connection->sent;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1106
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1107 if (sent >= qs->send_max_data) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1108 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1109
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1110 if (wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1111 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112 ngx_post_event(wev, &ngx_posted_events);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1116 qs->send_max_data = f->limit;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1119 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1120
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1121
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1122 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1123 ngx_quic_handle_reset_stream_frame(ngx_connection_t *c,
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1124 ngx_quic_header_t *pkt, ngx_quic_reset_stream_frame_t *f)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1126 ngx_event_t *rev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1128 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1131 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1133 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1134 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1135 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1136 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1137 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1138 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1139
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1140 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1142 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1143 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1145 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1149 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1151 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1152
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1153 sc = qs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1154
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1155 rev = sc->read;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1156 rev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1157 rev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1158
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1159 sc->listening->handler(sc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1160
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1161 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1162 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1163
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1164 rev = qs->connection->read;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1165 rev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1166 rev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1167
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1168 if (rev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1169 rev->handler(rev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1171
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1172 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1173 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1174
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1176 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177 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
1178 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
1179 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1180 ngx_event_t *wev;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 ngx_connection_t *sc;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1182 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1183 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1184
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1185 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1188 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1189 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1191 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1193
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1194 qs = ngx_quic_find_stream(&qc->streams.tree, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1195
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1196 if (qs == NULL) {
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1197 qs = ngx_quic_create_client_stream(c, f->id);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1198
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1199 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1200 return NGX_ERROR;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1201 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1202
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1203 if (qs == NGX_QUIC_STREAM_GONE) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1204 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1206
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1207 sc = qs->connection;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1208
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1209 wev = sc->write;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1210 wev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1211 wev->ready = 1;
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 sc->listening->handler(sc);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1214
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1215 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1216 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1217
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1218 wev = qs->connection->write;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1219 wev->error = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1220 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1221
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222 if (wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1223 wev->handler(wev);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1224 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1225
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1226 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1227 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1228
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1229
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1230 ngx_int_t
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231 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
1232 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
1233 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1234 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1235
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1236 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1237
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1238 if (f->bidi) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1239 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
1240 qc->streams.server_max_streams_bidi = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1241
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1242 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
1243 "quic max_streams_bidi:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1244 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1245
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1246 } else {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1247 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
1248 qc->streams.server_max_streams_uni = f->limit;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1249
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1250 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
1251 "quic max_streams_uni:%uL", f->limit);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1252 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1253 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1254
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1255 return NGX_OK;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1256 }
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1257
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1258
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1259 void
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1260 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
1261 {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1262 uint64_t sent, unacked;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1263 ngx_event_t *wev;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1264 ngx_quic_stream_t *qs;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1265 ngx_quic_connection_t *qc;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1266
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1267 qc = ngx_quic_get_connection(c);
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1268
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1269 qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1270 if (qs == NULL) {
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1271 return;
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
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1274 wev = qs->connection->write;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1275 sent = qs->connection->sent;
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1276 unacked = sent - qs->acked;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1277
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1278 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1279 wev->ready = 1;
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1280 ngx_post_event(wev, &ngx_posted_events);
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
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1283 qs->acked += f->u.stream.length;
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1284
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1285 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, qs->connection->log, 0,
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1286 "quic stream ack len:%uL acked:%uL unacked:%uL",
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
1287 f->u.stream.length, qs->acked, sent - qs->acked);
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1288 }