annotate src/event/ngx_event_quic.c @ 8378:81a4f98a2556 quic

Cleaned up reordering code. The ordered frame handler is always called for the existing stream, as it is allocated from this stream. Instead of searching stream by id, pointer to the stream node is passed.
author Vladimir Homutov <vl@nginx.com>
date Fri, 08 May 2020 13:08:04 +0300
parents 2a94aaa70b33
children aecd8ec29c8e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
2 /*
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
3 * Copyright (C) Nginx, Inc.
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
4 */
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
5
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
6
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
9 #include <ngx_event.h>
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
10
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
11
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
12 /* 0-RTT and 1-RTT data exist in the same packet number space,
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
13 * so we have 3 packet number spaces:
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
14 *
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
15 * 0 - Initial
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
16 * 1 - Handshake
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
17 * 2 - 0-RTT and 1-RTT
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
18 */
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
19 #define ngx_quic_get_send_ctx(qc, level) \
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
20 ((level) == ssl_encryption_initial) ? &((qc)->send_ctx[0]) \
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
21 : (((level) == ssl_encryption_handshake) ? &((qc)->send_ctx[1]) \
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
22 : &((qc)->send_ctx[2]))
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
23
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
24 #define NGX_QUIC_SEND_CTX_LAST (NGX_QUIC_ENCRYPTION_LAST - 1)
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
25
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
26 #define NGX_QUIC_STREAMS_INC 16
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
27 #define NGX_QUIC_STREAMS_LIMIT (1ULL < 60)
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
28
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
29 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
30 * 7.4. Cryptographic Message Buffering
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
31 * Implementations MUST support buffering at least 4096 bytes of data
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
32 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
33 #define NGX_QUIC_MAX_BUFFERED 65535
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
34
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
35
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
36 typedef enum {
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
37 NGX_QUIC_ST_INITIAL, /* connection just created */
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
38 NGX_QUIC_ST_HANDSHAKE, /* handshake started */
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
39 NGX_QUIC_ST_EARLY_DATA, /* handshake in progress */
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
40 NGX_QUIC_ST_APPLICATION /* handshake complete */
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
41 } ngx_quic_state_t;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
42
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
43
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
44 typedef struct {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
45 ngx_rbtree_t tree;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
46 ngx_rbtree_node_t sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
47 ngx_connection_handler_pt handler;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
48
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
49 ngx_uint_t id_counter;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
50
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
51 uint64_t received;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
52 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
53 uint64_t recv_max_data;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
54 uint64_t send_max_data;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
55 } ngx_quic_streams_t;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
56
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
57
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
58 typedef struct {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
59 size_t in_flight;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
60 size_t window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
61 size_t ssthresh;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
62 ngx_msec_t recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
63 } ngx_quic_congestion_t;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
64
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
65
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
66 /*
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
67 * 12.3. Packet Numbers
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
68 *
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
69 * Conceptually, a packet number space is the context in which a packet
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
70 * can be processed and acknowledged. Initial packets can only be sent
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
71 * with Initial packet protection keys and acknowledged in packets which
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
72 * are also Initial packets.
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
73 */
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
74 typedef struct {
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
75 ngx_quic_secret_t client_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
76 ngx_quic_secret_t server_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
77
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
78 uint64_t pnum; /* packet number to send */
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
79 uint64_t largest_ack; /* number received from peer */
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
80 uint64_t largest_pn; /* number received from peer */
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
81
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
82 ngx_queue_t frames;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
83 ngx_queue_t sent;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
84 } ngx_quic_send_ctx_t;
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
85
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
86
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
87 struct ngx_quic_connection_s {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
88 ngx_str_t scid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
89 ngx_str_t dcid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
90 ngx_str_t token;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
91
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
92 ngx_uint_t client_tp_done;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
93 ngx_quic_tp_t tp;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
94 ngx_quic_tp_t ctp;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
95
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
96 ngx_quic_state_t state;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
97
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
98 ngx_quic_send_ctx_t send_ctx[NGX_QUIC_SEND_CTX_LAST];
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
99 ngx_quic_secrets_t keys[NGX_QUIC_ENCRYPTION_LAST];
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
100 ngx_quic_secrets_t next_key;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
101 ngx_quic_frames_stream_t crypto[NGX_QUIC_ENCRYPTION_LAST];
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
102
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
103 ngx_ssl_t *ssl;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
104
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
105 ngx_event_t push;
8369
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
106 ngx_event_t retransmit;
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
107 ngx_event_t close;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
108 ngx_queue_t free_frames;
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
109 ngx_msec_t last_cc;
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
110
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
111 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
112 ngx_uint_t nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
113 #endif
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
114
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
115 ngx_quic_streams_t streams;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
116 ngx_quic_congestion_t congestion;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
117
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
118 uint64_t cur_streams;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
119 uint64_t max_streams;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
120
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
121 unsigned send_timer_set:1;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
122 unsigned closing:1;
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
123 unsigned draining:1;
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
124 unsigned key_phase:1;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
125 };
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
126
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
127
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
128 typedef ngx_int_t (*ngx_quic_frame_handler_pt)(ngx_connection_t *c,
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
129 ngx_quic_frame_t *frame, void *data);
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
130
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
131
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
132 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
133 static int ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
134 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
135 const uint8_t *secret, size_t secret_len);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
136 static int ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
137 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
138 const uint8_t *secret, size_t secret_len);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
139 #else
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
140 static int ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
141 enum ssl_encryption_level_t level, const uint8_t *read_secret,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
142 const uint8_t *write_secret, size_t secret_len);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
143 #endif
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
144
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
145 static int ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
146 enum ssl_encryption_level_t level, const uint8_t *data, size_t len);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
147 static int ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
148 static int ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
149 enum ssl_encryption_level_t level, uint8_t alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
150
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
151
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
152 static ngx_int_t ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
153 ngx_quic_tp_t *tp, ngx_quic_header_t *pkt,
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
154 ngx_connection_handler_pt handler);
8368
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
155 static ngx_int_t ngx_quic_new_cid(ngx_pool_t *pool, ngx_str_t *sid);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
156 static ngx_int_t ngx_quic_init_connection(ngx_connection_t *c);
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
157 static void ngx_quic_input_handler(ngx_event_t *rev);
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
158
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
159 static void ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
160 static ngx_int_t ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
161 static void ngx_quic_close_timer_handler(ngx_event_t *ev);
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
162 static ngx_int_t ngx_quic_close_streams(ngx_connection_t *c,
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
163 ngx_quic_connection_t *qc);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
164
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
165 static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b);
8377
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
166 static ngx_inline u_char *ngx_quic_skip_zero_padding(ngx_buf_t *b);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
167 static ngx_int_t ngx_quic_initial_input(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
168 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
169 static ngx_int_t ngx_quic_handshake_input(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
170 ngx_quic_header_t *pkt);
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
171 static ngx_int_t ngx_quic_early_input(ngx_connection_t *c,
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
172 ngx_quic_header_t *pkt);
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
173 static ngx_int_t ngx_quic_check_peer(ngx_quic_connection_t *qc,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
174 ngx_quic_header_t *pkt);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
175 static ngx_int_t ngx_quic_app_input(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
176 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
177 static ngx_int_t ngx_quic_payload_handler(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
178 ngx_quic_header_t *pkt);
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
179 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_header_t *pkt);
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
180 static ngx_int_t ngx_quic_send_cc(ngx_connection_t *c,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
181 enum ssl_encryption_level_t level, ngx_uint_t err);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
182
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
183 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
184 ngx_quic_header_t *pkt, ngx_quic_ack_frame_t *f);
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
185 static ngx_int_t ngx_quic_handle_ack_frame_range(ngx_connection_t *c,
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
186 ngx_quic_send_ctx_t *ctx, uint64_t min, uint64_t max);
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
187 static void ngx_quic_handle_stream_ack(ngx_connection_t *c,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
188 ngx_quic_frame_t *f);
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
189
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
190 static ngx_int_t ngx_quic_handle_ordered_frame(ngx_connection_t *c,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
191 ngx_quic_frames_stream_t *fs, ngx_quic_frame_t *frame,
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
192 ngx_quic_frame_handler_pt handler, void *data);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
193 static ngx_int_t ngx_quic_adjust_frame_offset(ngx_connection_t *c,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
194 ngx_quic_frame_t *f, uint64_t offset_in);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
195 static ngx_int_t ngx_quic_buffer_frame(ngx_connection_t *c,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
196 ngx_quic_frames_stream_t *stream, ngx_quic_frame_t *f);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
197
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
198 static ngx_int_t ngx_quic_handle_crypto_frame(ngx_connection_t *c,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
199 ngx_quic_header_t *pkt, ngx_quic_frame_t *frame);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
200 static ngx_int_t ngx_quic_crypto_input(ngx_connection_t *c,
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
201 ngx_quic_frame_t *frame, void *data);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
202 static ngx_int_t ngx_quic_handle_stream_frame(ngx_connection_t *c,
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
203 ngx_quic_header_t *pkt, ngx_quic_frame_t *frame);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
204 static ngx_int_t ngx_quic_stream_input(ngx_connection_t *c,
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
205 ngx_quic_frame_t *frame, void *data);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
206
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
207 static ngx_int_t ngx_quic_handle_max_streams(ngx_connection_t *c);
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
208 static ngx_int_t ngx_quic_handle_max_data_frame(ngx_connection_t *c,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
209 ngx_quic_max_data_frame_t *f);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
210 static ngx_int_t ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
211 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f);
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
212 static ngx_int_t ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
213 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f);
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
214 static ngx_int_t ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
215 ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
216
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
217 static void ngx_quic_queue_frame(ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
218 ngx_quic_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
219
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
220 static ngx_int_t ngx_quic_output(ngx_connection_t *c);
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
221 static ngx_int_t ngx_quic_output_frames(ngx_connection_t *c,
8332
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
222 ngx_quic_send_ctx_t *ctx);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
223 static void ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
224 static ngx_int_t ngx_quic_send_frames(ngx_connection_t *c, ngx_queue_t *frames);
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
225
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
226 static void ngx_quic_set_packet_number(ngx_quic_header_t *pkt,
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
227 ngx_quic_send_ctx_t *ctx);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
228 static void ngx_quic_retransmit_handler(ngx_event_t *ev);
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
229 static ngx_int_t ngx_quic_retransmit(ngx_connection_t *c,
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
230 ngx_quic_send_ctx_t *ctx, ngx_msec_t *waitp);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
231 static void ngx_quic_push_handler(ngx_event_t *ev);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
232
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
233 static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
234 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
235 static ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree,
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
236 uint64_t id);
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
237 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c,
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
238 uint64_t id, size_t rcvbuf_size);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
239 static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
240 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
241 static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
242 size_t size);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
243 static void ngx_quic_stream_cleanup_handler(void *data);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
244 static ngx_chain_t *ngx_quic_stream_send_chain(ngx_connection_t *c,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
245 ngx_chain_t *in, off_t limit);
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
246 static ngx_quic_frame_t *ngx_quic_alloc_frame(ngx_connection_t *c, size_t size);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
247 static void ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
248
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
249 static void ngx_quic_congestion_ack(ngx_connection_t *c,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
250 ngx_quic_frame_t *frame);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
251 static void ngx_quic_congestion_lost(ngx_connection_t *c, ngx_msec_t sent);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
252
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
253
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
254 static SSL_QUIC_METHOD quic_method = {
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
255 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
256 ngx_quic_set_read_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
257 ngx_quic_set_write_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
258 #else
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
259 ngx_quic_set_encryption_secrets,
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
260 #endif
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
261 ngx_quic_add_handshake_data,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
262 ngx_quic_flush_flight,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
263 ngx_quic_send_alert,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
264 };
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
265
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
266
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
267 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
268
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
269 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
270 ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
271 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
272 const uint8_t *rsecret, size_t secret_len)
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
273 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
274 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
275 ngx_quic_secrets_t *keys;
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
276
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
277 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
278
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
279 #ifdef NGX_QUIC_DEBUG_CRYPTO
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
280 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
281 "quic ngx_quic_set_read_secret() level:%d", level);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
282 ngx_quic_hexdump(c->log, "quic read secret", rsecret, secret_len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
283 #endif
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
284
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
285 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
286
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
287 if (level == ssl_encryption_early_data) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
288 c->quic->state = NGX_QUIC_ST_EARLY_DATA;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
289 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
290
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
291 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
292 rsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
293 &keys->client);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
294 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
295
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
296
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
297 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
298 ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
299 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
300 const uint8_t *wsecret, size_t secret_len)
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
301 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
302 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
303 ngx_quic_secrets_t *keys;
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
304
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
305 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
306
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
307 #ifdef NGX_QUIC_DEBUG_CRYPTO
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
308 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
309 "quic ngx_quic_set_write_secret() level:%d", level);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
310 ngx_quic_hexdump(c->log, "quic write secret", wsecret, secret_len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
311 #endif
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
312
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
313 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
314
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
315 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
316 wsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
317 &keys->server);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
318 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
319
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
320 #else
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
321
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
322 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
323 ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
324 enum ssl_encryption_level_t level, const uint8_t *rsecret,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
325 const uint8_t *wsecret, size_t secret_len)
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
326 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
327 ngx_int_t rc;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
328 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
329 ngx_quic_secrets_t *keys;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
330
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
331 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
332
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
333 #ifdef NGX_QUIC_DEBUG_CRYPTO
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
334 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
335 "quic ngx_quic_set_encryption_secrets() level:%d", level);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
336 ngx_quic_hexdump(c->log, "quic read", rsecret, secret_len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
337 #endif
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
338
8327
0ae50d90658a Fixed build with OpenSSL using old callbacks API.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8326
diff changeset
339 keys = &c->quic->keys[level];
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
340
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
341 rc = ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
342 rsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
343 &keys->client);
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
344 if (rc != 1) {
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
345 return rc;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
346 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
347
8303
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
348 if (level == ssl_encryption_early_data) {
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
349 c->quic->state = NGX_QUIC_ST_EARLY_DATA;
8303
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
350 return 1;
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
351 }
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
352
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
353 #ifdef NGX_QUIC_DEBUG_CRYPTO
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
354 ngx_quic_hexdump(c->log, "quic write", wsecret, secret_len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
355 #endif
8303
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
356
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
357 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
358 wsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
359 &keys->server);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
360 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
361
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
362 #endif
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
363
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
364
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
365 static int
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
366 ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
367 enum ssl_encryption_level_t level, const uint8_t *data, size_t len)
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
368 {
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
369 u_char *p, *end;
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
370 size_t client_params_len, fsize, limit;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
371 const uint8_t *client_params;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
372 ngx_quic_frame_t *frame;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
373 ngx_connection_t *c;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
374 ngx_quic_connection_t *qc;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
375 ngx_quic_frames_stream_t *fs;
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
376
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
377 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
378 qc = c->quic;
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
379
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
380 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
381 "quic ngx_quic_add_handshake_data");
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
382
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
383 if (!qc->client_tp_done) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
384
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
385 SSL_get_peer_quic_transport_params(ssl_conn, &client_params,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
386 &client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
387
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
388 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
389 "quic SSL_get_peer_quic_transport_params():"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
390 " params_len %ui", client_params_len);
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
391
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
392 if (client_params_len != 0) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
393 p = (u_char *) client_params;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
394 end = p + client_params_len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
395
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
396 if (ngx_quic_parse_transport_params(p, end, &qc->ctp, c->log)
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
397 != NGX_OK)
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
398 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
399 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
400 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
401
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
402 if (qc->ctp.max_idle_timeout > 0
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
403 && qc->ctp.max_idle_timeout < qc->tp.max_idle_timeout)
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
404 {
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
405 qc->tp.max_idle_timeout = qc->ctp.max_idle_timeout;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
406 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
407
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
408 if (qc->ctp.max_packet_size < NGX_QUIC_MIN_INITIAL_SIZE
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
409 || qc->ctp.max_packet_size > NGX_QUIC_DEFAULT_MAX_PACKET_SIZE)
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
410 {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
411 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
412 "quic maximum packet size is invalid");
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
413 return NGX_ERROR;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
414 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
415
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
416 qc->client_tp_done = 1;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
417 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
418 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
419
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
420 /*
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
421 * we need to fit at least 1 frame into a packet, thus account head/tail;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
422 * 17 = 1 + 8x2 is max header for CRYPTO frame, with 1 byte for frame type
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
423 */
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
424 limit = qc->ctp.max_packet_size - NGX_QUIC_MAX_LONG_HEADER - 17
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
425 - EVP_GCM_TLS_TAG_LEN;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
426
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
427 fs = &qc->crypto[level];
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
428
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
429 p = (u_char *) data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
430 end = (u_char *) data + len;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
431
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
432 while (p < end) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
433
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
434 fsize = ngx_min(limit, (size_t) (end - p));
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
435
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
436 frame = ngx_quic_alloc_frame(c, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
437 if (frame == NULL) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
438 return 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
439 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
440
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
441 ngx_memcpy(frame->data, p, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
442
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
443 frame->level = level;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
444 frame->type = NGX_QUIC_FT_CRYPTO;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
445 frame->u.crypto.offset = fs->sent;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
446 frame->u.crypto.length = fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
447 frame->u.crypto.data = frame->data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
448
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
449 fs->sent += fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
450 p += fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
451
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
452 ngx_sprintf(frame->info, "crypto, generated by SSL len=%ui level=%d",
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
453 fsize, level);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
454
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
455 ngx_quic_queue_frame(qc, frame);
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
456 }
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
457
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
458 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
459 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
460
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
461
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
462 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
463 ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
464 {
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
465 #if (NGX_DEBUG)
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
466 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
467
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
468 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
469
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
470 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
471 "quic ngx_quic_flush_flight()");
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
472 #endif
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
473 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
474 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
475
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
476
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
477 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
478 ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
479 uint8_t alert)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
480 {
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
481 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
482
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
483 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
484
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
485 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
486 "quic ngx_quic_send_alert(), lvl=%d, alert=%d",
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
487 (int) level, (int) alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
488
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
489 if (c->quic == NULL) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
490 return 1;
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
491 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
492
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
493 if (ngx_quic_send_cc(c, level, 0x100 + alert) != NGX_OK) {
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
494 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
495 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
496
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
497 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
498 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
499
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
500
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
501 void
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
502 ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
503 ngx_connection_handler_pt handler)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
504 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
505 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
506 ngx_quic_header_t pkt;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
507
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
508 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
509
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
510 c->log->action = "QUIC initialization";
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
511
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
512 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
513
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
514 b = c->buffer;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
515
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
516 pkt.log = c->log;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
517 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
518 pkt.data = b->start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
519 pkt.len = b->last - b->start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
520
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
521 if (ngx_quic_new_connection(c, ssl, tp, &pkt, handler) != NGX_OK) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
522 ngx_quic_close_connection(c, NGX_ERROR);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
523 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
524 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
525
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
526 ngx_add_timer(c->read, c->quic->tp.max_idle_timeout);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
527
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
528 c->read->handler = ngx_quic_input_handler;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
529
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
530 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
531 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
532
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
533
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
534 static ngx_int_t
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
535 ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
536 ngx_quic_header_t *pkt, ngx_connection_handler_pt handler)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
537 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
538 ngx_uint_t i;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
539 ngx_quic_tp_t *ctp;
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
540 ngx_quic_secrets_t *keys;
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
541 ngx_quic_send_ctx_t *ctx;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
542 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
543 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
544
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
545 if (ngx_buf_size(pkt->raw) < NGX_QUIC_MIN_INITIAL_SIZE) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
546 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
547 "quic UDP datagram is too small for initial packet");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
548 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
549 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
550
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
551 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
552 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
553 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
554
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
555 if (!ngx_quic_pkt_in(pkt->flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
556 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
557 "quic invalid initial packet: 0x%xi", pkt->flags);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
558 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
559 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
560
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
561 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
562 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
563 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
564
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
565 c->log->action = "creating new quic connection";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
566
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
567 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
568 if (qc == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
569 return NGX_ERROR;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
570 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
571
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
572 qc->state = NGX_QUIC_ST_INITIAL;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
573
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
574 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
575 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
576
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
577 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
578 ngx_queue_init(&qc->send_ctx[i].frames);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
579 ngx_queue_init(&qc->send_ctx[i].sent);
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
580 qc->send_ctx[i].largest_pn = (uint64_t) -1;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
581 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
582
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
583 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
584 ngx_queue_init(&qc->crypto[i].frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
585 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
586
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
587 ngx_queue_init(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
588
8369
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
589 qc->retransmit.log = c->log;
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
590 qc->retransmit.data = c;
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
591 qc->retransmit.handler = ngx_quic_retransmit_handler;
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
592 qc->retransmit.cancelable = 1;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
593
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
594 qc->push.log = c->log;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
595 qc->push.data = c;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
596 qc->push.handler = ngx_quic_push_handler;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
597 qc->push.cancelable = 1;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
598
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
599 c->quic = qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
600 qc->ssl = ssl;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
601 qc->tp = *tp;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
602 qc->streams.handler = handler;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
603
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
604 ctp = &qc->ctp;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
605 ctp->max_packet_size = NGX_QUIC_DEFAULT_MAX_PACKET_SIZE;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
606 ctp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
607 ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
608
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
609 qc->streams.recv_max_data = qc->tp.initial_max_data;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
610
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
611 qc->congestion.window = ngx_min(10 * qc->tp.max_packet_size,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
612 ngx_max(2 * qc->tp.max_packet_size, 14720));
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
613 qc->congestion.ssthresh = NGX_MAX_SIZE_T_VALUE;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
614 qc->congestion.recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
615
8368
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
616 if (ngx_quic_new_cid(c->pool, &qc->dcid) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
617 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
618 }
8368
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
619
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
620 #ifdef NGX_QUIC_DEBUG_PACKETS
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
621 ngx_quic_hexdump(c->log, "quic server CID", qc->dcid.data, qc->dcid.len);
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
622 #endif
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
623
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
624 qc->scid.len = pkt->scid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
625 qc->scid.data = ngx_pnalloc(c->pool, qc->scid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
626 if (qc->scid.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
627 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
628 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
629 ngx_memcpy(qc->scid.data, pkt->scid.data, qc->scid.len);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
630
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
631 qc->token.len = pkt->token.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
632 qc->token.data = ngx_pnalloc(c->pool, qc->token.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
633 if (qc->token.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
634 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
635 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
636 ngx_memcpy(qc->token.data, pkt->token.data, qc->token.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
637
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
638 keys = &c->quic->keys[ssl_encryption_initial];
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
639
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
640 if (ngx_quic_set_initial_secret(c->pool, &keys->client, &keys->server,
8368
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
641 &pkt->dcid)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
642 != NGX_OK)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
643 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
644 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
645 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
646
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
647 pkt->secret = &keys->client;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
648 pkt->level = ssl_encryption_initial;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
649 pkt->plaintext = buf;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
650
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
651 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
652
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
653 if (ngx_quic_decrypt(pkt, NULL, &ctx->largest_pn) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
654 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
655 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
656
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
657 if (ngx_quic_init_connection(c) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
658 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
659 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
660
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
661 if (ngx_quic_payload_handler(c, pkt) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
662 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
663 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
664
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
665 /* pos is at header end, adjust by actual packet length */
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
666 pkt->raw->pos += pkt->len;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
667
8377
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
668 (void) ngx_quic_skip_zero_padding(pkt->raw);
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
669
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
670 return ngx_quic_input(c, pkt->raw);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
671 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
672
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
673
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
674 static ngx_int_t
8368
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
675 ngx_quic_new_cid(ngx_pool_t *pool, ngx_str_t *cid)
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
676 {
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
677 uint8_t len;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
678
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
679 if (RAND_bytes(&len, sizeof(len)) != 1) {
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
680 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
681 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
682
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
683 len = len % 10 + 10;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
684
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
685 cid->len = len;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
686 cid->data = ngx_pnalloc(pool, len);
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
687 if (cid->data == NULL) {
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
688 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
689 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
690
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
691 if (RAND_bytes(cid->data, len) != 1) {
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
692 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
693 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
694
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
695 return NGX_OK;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
696 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
697
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
698
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8367
diff changeset
699 static ngx_int_t
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
700 ngx_quic_init_connection(ngx_connection_t *c)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
701 {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
702 int n, sslerr;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
703 u_char *p;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
704 ssize_t len;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
705 ngx_ssl_conn_t *ssl_conn;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
706 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
707
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
708 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
709
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
710 if (ngx_ssl_create_connection(qc->ssl, c, NGX_SSL_BUFFER) != NGX_OK) {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
711 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
712 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
713
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
714 ssl_conn = c->ssl->connection;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
715
8232
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
716 if (SSL_set_quic_method(ssl_conn, &quic_method) == 0) {
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
717 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
718 "quic SSL_set_quic_method() failed");
8232
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
719 return NGX_ERROR;
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
720 }
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
721
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
722 #ifdef SSL_READ_EARLY_DATA_SUCCESS
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
723 if (SSL_CTX_get_max_early_data(qc->ssl->ctx)) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
724 SSL_set_quic_early_data_enabled(ssl_conn, 1);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
725 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
726 #endif
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
727
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
728 len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
729 /* always succeeds */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
730
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
731 p = ngx_pnalloc(c->pool, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
732 if (p == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
733 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
734 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
735
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
736 len = ngx_quic_create_transport_params(p, p + len, &qc->tp);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
737 if (len < 0) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
738 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
739 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
740
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
741 #ifdef NGX_QUIC_DEBUG_PACKETS
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
742 ngx_quic_hexdump(c->log, "quic transport parameters", p, len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
743 #endif
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
744
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
745 if (SSL_set_quic_transport_params(ssl_conn, p, len) == 0) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
746 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
747 "quic SSL_set_quic_transport_params() failed");
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
748 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
749 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
750
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
751 qc->max_streams = qc->tp.initial_max_streams_bidi;
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
752 qc->state = NGX_QUIC_ST_HANDSHAKE;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
753
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
754 n = SSL_do_handshake(ssl_conn);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
755
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
756 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
757 "quic SSL_do_handshake: %d", n);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
758
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
759 if (n == -1) {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
760 sslerr = SSL_get_error(ssl_conn, n);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
761
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
762 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
763 "quic SSL_get_error: %d", sslerr);
8300
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
764
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
765 if (sslerr != SSL_ERROR_WANT_READ) {
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
766 ngx_ssl_error(NGX_LOG_ERR, c->log, 0, "SSL_do_handshake() failed");
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
767 return NGX_ERROR;
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
768 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
769 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
770
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
771 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
772 "quic SSL_quic_read_level: %d, SSL_quic_write_level: %d",
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
773 (int) SSL_quic_read_level(ssl_conn),
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
774 (int) SSL_quic_write_level(ssl_conn));
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
775
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
776 return NGX_OK;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
777 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
778
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
779
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
780 static void
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
781 ngx_quic_input_handler(ngx_event_t *rev)
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
782 {
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
783 ssize_t n;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
784 ngx_buf_t b;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
785 ngx_connection_t *c;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
786 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
787 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
788
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
789 b.start = buf;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
790 b.end = buf + sizeof(buf);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
791 b.pos = b.last = b.start;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
792
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
793 c = rev->data;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
794 qc = c->quic;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
795
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
796 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler");
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
797
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
798 if (rev->timedout) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
799 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
800 "quic client timed out");
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
801 ngx_quic_close_connection(c, NGX_DONE);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
802 return;
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
803 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
804
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
805 if (c->close) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
806 ngx_quic_close_connection(c, NGX_ERROR);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
807 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
808 }
8220
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8218
diff changeset
809
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
810 n = c->recv(c, b.start, b.end - b.start);
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 8214
diff changeset
811
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
812 if (n == NGX_AGAIN) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
813 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
814 ngx_quic_close_connection(c, NGX_OK);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
815 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
816 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
817 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
818
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
819 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
820 c->read->eof = 1;
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
821 ngx_quic_close_connection(c, NGX_ERROR);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
822 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
823 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
824
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
825 b.last += n;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
826
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
827 if (ngx_quic_input(c, &b) != NGX_OK) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
828 ngx_quic_close_connection(c, NGX_ERROR);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
829 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
830 }
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
831
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
832 qc->send_timer_set = 0;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
833 ngx_add_timer(rev, qc->tp.max_idle_timeout);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
834 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
835
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
836
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
837 static void
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
838 ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc)
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
839 {
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
840 ngx_pool_t *pool;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
841
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
842 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
843 "quic ngx_quic_close_connection, rc: %i", rc);
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
844
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
845 if (!c->quic) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
846 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
847 "quic close connection early error");
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
848
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
849 } else if (ngx_quic_close_quic(c, rc) == NGX_AGAIN) {
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
850 return;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
851 }
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
852
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
853 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
854 (void) ngx_ssl_shutdown(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
855 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
856
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
857 if (c->read->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
858 ngx_del_timer(c->read);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
859 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
860
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
861 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
862 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
863 #endif
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
864
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
865 c->destroyed = 1;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
866
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
867 pool = c->pool;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
868
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
869 ngx_close_connection(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
870
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
871 ngx_destroy_pool(pool);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
872 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
873
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
874
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
875 static ngx_int_t
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
876 ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc)
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
877 {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
878 ngx_uint_t i;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
879 ngx_quic_connection_t *qc;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
880 enum ssl_encryption_level_t level;
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
881
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
882 qc = c->quic;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
883
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
884 if (!qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
885
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
886 if (rc == NGX_OK) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
887
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
888 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
889 * 10.3. Immediate Close
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
890 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
891 * An endpoint sends a CONNECTION_CLOSE frame (Section 19.19) to
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
892 * terminate the connection immediately.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
893 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
894 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
895 "quic immediate close, drain = %d", qc->draining);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
896
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
897 switch (qc->state) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
898 case NGX_QUIC_ST_INITIAL:
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
899 level = ssl_encryption_initial;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
900 break;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
901
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
902 case NGX_QUIC_ST_HANDSHAKE:
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
903 level = ssl_encryption_handshake;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
904 break;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
905
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
906 default: /* NGX_QUIC_ST_APPLICATION/EARLY_DATA */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
907 level = ssl_encryption_application;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
908 break;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
909 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
910
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
911 if (ngx_quic_send_cc(c, level, NGX_QUIC_ERR_NO_ERROR) == NGX_OK) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
912
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
913 qc->close.log = c->log;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
914 qc->close.data = c;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
915 qc->close.handler = ngx_quic_close_timer_handler;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
916 qc->close.cancelable = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
917
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
918 ngx_add_timer(&qc->close, 3 * NGX_QUIC_HARDCODED_PTO);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
919 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
920
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
921 } else if (rc == NGX_DONE) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
922
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
923 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
924 * 10.2. Idle Timeout
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
925 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
926 * If the idle timeout is enabled by either peer, a connection is
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
927 * silently closed and its state is discarded when it remains idle
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
928 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
929
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
930 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
931 "quic closing %s connection",
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
932 qc->draining ? "drained" : "idle");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
933
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
934 } else {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
935 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
936 "quic immediate close due to fatal error");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
937 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
938
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
939 qc->closing = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
940 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
941
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
942 if (rc == NGX_ERROR && qc->close.timer_set) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
943 /* do not wait for timer in case of fatal error */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
944 ngx_del_timer(&qc->close);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
945 }
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
946
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
947 if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
948 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
949 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
950
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
951 if (qc->close.timer_set) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
952 return NGX_AGAIN;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
953 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
954
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
955 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
956 ngx_quic_free_frames(c, &qc->crypto[i].frames);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
957 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
958
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
959 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
960 ngx_quic_free_frames(c, &qc->send_ctx[i].frames);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
961 ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
962 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
963
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
964 if (qc->push.timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
965 ngx_del_timer(&qc->push);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
966 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
967
8369
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
968 if (qc->retransmit.timer_set) {
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
969 ngx_del_timer(&qc->retransmit);
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
970 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
971
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
972 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
973 "quic part of connection is terminated");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
974
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
975 /* may be tested from SSL callback during SSL shutdown */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
976 c->quic = NULL;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
977
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
978 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
979 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
980
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
981
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
982 static void
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
983 ngx_quic_close_timer_handler(ngx_event_t *ev)
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
984 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
985 ngx_connection_t *c;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
986
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
987 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic close timer");
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
988
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
989 c = ev->data;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
990 ngx_quic_close_connection(c, NGX_DONE);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
991 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
992
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
993
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
994 static ngx_int_t
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
995 ngx_quic_close_streams(ngx_connection_t *c, ngx_quic_connection_t *qc)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
996 {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
997 ngx_event_t *rev;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
998 ngx_rbtree_t *tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
999 ngx_rbtree_node_t *node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1000 ngx_quic_stream_t *qs;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1001
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1002 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1003 ngx_uint_t ns;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1004 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1005
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1006 tree = &qc->streams.tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1007
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1008 if (tree->root == tree->sentinel) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1009 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1010 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1011
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1012 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1013 ns = 0;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1014 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1015
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1016 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1017 node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1018 node = ngx_rbtree_next(tree, node))
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1019 {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1020 qs = (ngx_quic_stream_t *) node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1021
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1022 rev = qs->c->read;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1023 rev->ready = 1;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1024 rev->pending_eof = 1;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1025
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1026 ngx_post_event(rev, &ngx_posted_events);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1027
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1028 if (rev->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1029 ngx_del_timer(rev);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1030 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1031
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1032 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1033 ns++;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1034 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1035 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1036
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1037 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1038 "quic connection has %ui active streams", ns);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1039
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1040 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1041 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1042
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1043
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
1044 static ngx_int_t
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1045 ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b)
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1046 {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1047 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1048 ngx_int_t rc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1049 ngx_quic_header_t pkt;
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1050
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1051 p = b->pos;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
1052
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1053 while (p < b->last) {
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1054 c->log->action = "processing quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1055
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1056 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1057 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1058 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1059 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1060 pkt.log = c->log;
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1061 pkt.flags = p[0];
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1062
8371
9d9531431c8c Removed outdated/incorrect comments and fixed style.
Vladimir Homutov <vl@nginx.com>
parents: 8370
diff changeset
1063 /* TODO: check current state */
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1064 if (ngx_quic_long_pkt(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1065
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1066 if (ngx_quic_pkt_in(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1067 rc = ngx_quic_initial_input(c, &pkt);
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1068
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1069 } else if (ngx_quic_pkt_hs(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1070 rc = ngx_quic_handshake_input(c, &pkt);
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1071
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1072 } else if (ngx_quic_pkt_zrtt(pkt.flags)) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1073 rc = ngx_quic_early_input(c, &pkt);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1074
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1075 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1076 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1077 "quic unknown long packet type");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1078 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1079 }
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1080
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1081 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1082 rc = ngx_quic_app_input(c, &pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1083 }
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1084
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1085 if (rc == NGX_ERROR) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1086 return NGX_ERROR;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1087 }
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1088
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1089 /* NGX_OK || NGX_DECLINED */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1090
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1091 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1092 * we get NGX_DECLINED when there are no keys [yet] available
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1093 * to decrypt packet.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1094 * Instead of queueing it, we ignore it and rely on the sender's
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1095 * retransmission:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1096 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1097 * 12.2. Coalescing Packets:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1098 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1099 * For example, if decryption fails (because the keys are
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1100 * not available or any other reason), the receiver MAY either
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1101 * discard or buffer the packet for later processing and MUST
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1102 * attempt to process the remaining packets.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1103 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1104
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1105 /* b->pos is at header end, adjust by actual packet length */
8377
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1106 b->pos += pkt.len;
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1107 p = ngx_quic_skip_zero_padding(b);
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1108 }
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1109
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1110 return NGX_OK;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1111 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1112
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1113
8377
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1114 /* firefox workaround: skip zero padding at the end of quic packet */
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1115 static ngx_inline u_char *
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1116 ngx_quic_skip_zero_padding(ngx_buf_t *b)
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1117 {
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1118 while (b->pos < b->last && *(b->pos) == 0) {
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1119 b->pos++;
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1120 }
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1121
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1122 return b->pos;
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1123 }
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1124
2a94aaa70b33 Cleaned up firefox workaround.
Vladimir Homutov <vl@nginx.com>
parents: 8371
diff changeset
1125
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1126 static ngx_int_t
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1127 ngx_quic_initial_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1128 {
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1129 ngx_ssl_conn_t *ssl_conn;
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1130 ngx_quic_secrets_t *keys;
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1131 ngx_quic_send_ctx_t *ctx;
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1132 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1133
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1134 c->log->action = "processing initial quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1135
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1136 ssl_conn = c->ssl->connection;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1137
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
1138 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1139 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1140 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1141
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
1142 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1143 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1144 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1145
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1146 keys = &c->quic->keys[ssl_encryption_initial];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1147
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1148 pkt->secret = &keys->client;
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1149 pkt->level = ssl_encryption_initial;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1150 pkt->plaintext = buf;
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1151
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1152 ctx = ngx_quic_get_send_ctx(c->quic, pkt->level);
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1153
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1154 if (ngx_quic_decrypt(pkt, ssl_conn, &ctx->largest_pn) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1155 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1156 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1157
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1158 return ngx_quic_payload_handler(c, pkt);
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1159 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1160
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1161
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1162 static ngx_int_t
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1163 ngx_quic_handshake_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1164 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1165 ngx_quic_secrets_t *keys;
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1166 ngx_quic_send_ctx_t *ctx;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1167 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1168 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1169
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1170 c->log->action = "processing handshake quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1171
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1172 qc = c->quic;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1173
8321
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1174 keys = &c->quic->keys[ssl_encryption_handshake];
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1175
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1176 if (keys->client.key.len == 0) {
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1177 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1178 "quic no read keys yet, packet ignored");
8321
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1179 return NGX_DECLINED;
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1180 }
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
1181
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1182 /* extract cleartext data into pkt */
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
1183 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1184 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1185 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1186
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1187 if (ngx_quic_check_peer(qc, pkt) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1188 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1189 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1190
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1191 if (!ngx_quic_pkt_hs(pkt->flags)) {
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1192 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1193 "quic invalid packet type: 0x%xi", pkt->flags);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1194 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1195 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1196
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
1197 if (ngx_quic_parse_handshake_header(pkt) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1198 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1199 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1200
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1201 pkt->secret = &keys->client;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1202 pkt->level = ssl_encryption_handshake;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1203 pkt->plaintext = buf;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1204
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1205 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1206
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1207 if (ngx_quic_decrypt(pkt, c->ssl->connection, &ctx->largest_pn) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1208 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1209 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1210
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1211 return ngx_quic_payload_handler(c, pkt);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1212 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1213
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1214
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1215 static ngx_int_t
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1216 ngx_quic_early_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1217 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1218 ngx_quic_secrets_t *keys;
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1219 ngx_quic_send_ctx_t *ctx;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1220 ngx_quic_connection_t *qc;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1221 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1222
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1223 c->log->action = "processing early data quic packet";
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1224
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1225 qc = c->quic;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1226
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1227 /* extract cleartext data into pkt */
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1228 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1229 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1230 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1231
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1232 if (ngx_quic_check_peer(qc, pkt) != NGX_OK) {
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1233 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1234 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1235
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1236 if (!ngx_quic_pkt_zrtt(pkt->flags)) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1237 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1238 "quic invalid packet type: 0x%xi", pkt->flags);
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1239 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1240 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1241
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1242 if (ngx_quic_parse_handshake_header(pkt) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1243 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1244 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1245
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1246 if (c->quic->state != NGX_QUIC_ST_EARLY_DATA) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1247 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic unexpected 0-RTT packet");
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1248 return NGX_OK;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1249 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1250
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1251 keys = &c->quic->keys[ssl_encryption_early_data];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1252
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1253 pkt->secret = &keys->client;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1254 pkt->level = ssl_encryption_early_data;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1255 pkt->plaintext = buf;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1256
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1257 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1258
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1259 if (ngx_quic_decrypt(pkt, c->ssl->connection, &ctx->largest_pn) != NGX_OK) {
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1260 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1261 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1262
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1263 return ngx_quic_payload_handler(c, pkt);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1264 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1265
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1266
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1267 static ngx_int_t
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1268 ngx_quic_check_peer(ngx_quic_connection_t *qc, ngx_quic_header_t *pkt)
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1269 {
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1270 if (pkt->dcid.len != qc->dcid.len) {
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1271 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic dcidl");
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1272 return NGX_ERROR;
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1273 }
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1274
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1275 if (ngx_memcmp(pkt->dcid.data, qc->dcid.data, qc->dcid.len) != 0) {
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1276 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic dcid");
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1277 return NGX_ERROR;
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1278 }
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1279
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1280 if (pkt->scid.len != qc->scid.len) {
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1281 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic scidl");
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1282 return NGX_ERROR;
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1283 }
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1284
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1285 if (ngx_memcmp(pkt->scid.data, qc->scid.data, qc->scid.len) != 0) {
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1286 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic scid");
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1287 return NGX_ERROR;
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1288 }
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1289
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1290 return NGX_OK;
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1291 }
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1292
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1293
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1294 static ngx_int_t
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1295 ngx_quic_app_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1296 {
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1297 ngx_int_t rc;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1298 ngx_quic_secrets_t *keys, *next, tmp;
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1299 ngx_quic_send_ctx_t *ctx;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1300 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1301 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1302
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1303 c->log->action = "processing application data quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1304
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1305 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1306
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1307 keys = &c->quic->keys[ssl_encryption_application];
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1308 next = &c->quic->next_key;
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1309
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1310 if (keys->client.key.len == 0) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1311 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1312 "quic no read keys yet, packet ignored");
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1313 return NGX_DECLINED;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1314 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1315
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
1316 if (ngx_quic_parse_short_header(pkt, &qc->dcid) != NGX_OK) {
8185
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1317 return NGX_ERROR;
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1318 }
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1319
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1320 pkt->secret = &keys->client;
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1321 pkt->next = &next->client;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1322 pkt->key_phase = c->quic->key_phase;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1323 pkt->level = ssl_encryption_application;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1324 pkt->plaintext = buf;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1325
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1326 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1327
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1328 if (ngx_quic_decrypt(pkt, c->ssl->connection, &ctx->largest_pn) != NGX_OK) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1329 return NGX_ERROR;
8185
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1330 }
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1331
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1332 /* switch keys on Key Phase change */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1333
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1334 if (pkt->key_update) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1335 c->quic->key_phase ^= 1;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1336
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1337 tmp = *keys;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1338 *keys = *next;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1339 *next = tmp;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1340 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1341
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1342 rc = ngx_quic_payload_handler(c, pkt);
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1343
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1344 if (rc == NGX_ERROR) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1345 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1346 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1347
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1348 /* generate next keys */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1349
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1350 if (pkt->key_update) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1351 if (ngx_quic_key_update(c, keys, next) != NGX_OK) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1352 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1353 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1354 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1355
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1356 return rc;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1357 }
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1358
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1359
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1360 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1361 ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1362 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1363 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1364 ssize_t len;
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1365 ngx_uint_t ack_sent, do_close;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1366 ngx_quic_frame_t frame;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1367 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1368
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1369 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1370
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1371 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1372 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1373 * 10.1 Closing and Draining Connection States
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1374 * ... delayed or reordered packets are properly discarded.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1375 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1376 * An endpoint retains only enough information to generate
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1377 * a packet containing a CONNECTION_CLOSE frame and to identify
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1378 * packets as belonging to the connection.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1379 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1380 return ngx_quic_send_cc(c, pkt->level, NGX_QUIC_ERR_NO_ERROR);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1381 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1382
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1383 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1384 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1385
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1386 ack_sent = 0;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1387 do_close = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1388
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1389 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1390
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1391 c->log->action = "parsing frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1392
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1393 len = ngx_quic_parse_frame(pkt, p, end, &frame);
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1394
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1395 if (len == NGX_DECLINED) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1396 /* TODO: handle protocol violation:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1397 * such frame not allowed in this packet
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1398 */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1399 return NGX_ERROR;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1400 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1401
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1402 if (len < 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1403 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1404 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1405
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1406 c->log->action = "handling frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1407
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1408 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1409
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1410 switch (frame.type) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1411
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1412 case NGX_QUIC_FT_ACK:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1413 if (ngx_quic_handle_ack_frame(c, pkt, &frame.u.ack) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1414 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1415 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1416
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1417 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1418
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1419 case NGX_QUIC_FT_PADDING:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1420 /* no action required */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1421 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1422
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1423 case NGX_QUIC_FT_CONNECTION_CLOSE:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1424 case NGX_QUIC_FT_CONNECTION_CLOSE2:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1425 do_close = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1426 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1427 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1428
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1429 /* got there with ack-eliciting packet */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1430
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1431 if (!ack_sent) {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1432 if (ngx_quic_send_ack(c, pkt) != NGX_OK) {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1433 return NGX_ERROR;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1434 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1435
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1436 ack_sent = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1437 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1438
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1439 switch (frame.type) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1440
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1441 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1442
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1443 if (ngx_quic_handle_crypto_frame(c, pkt, &frame) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1444 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1445 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1446
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1447 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1448
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1449 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1450 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1451
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1452 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1453 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1454 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1455 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1456 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1457 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1458 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1459 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1460
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1461 if (ngx_quic_handle_stream_frame(c, pkt, &frame) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1462 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1463 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1464
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1465 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1466
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1467 case NGX_QUIC_FT_MAX_DATA:
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1468
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1469 if (ngx_quic_handle_max_data_frame(c, &frame.u.max_data) != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1470 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1471 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1472 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1473
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1474 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1475
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1476 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1477 case NGX_QUIC_FT_STREAMS_BLOCKED2:
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1478
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1479 if (ngx_quic_handle_streams_blocked_frame(c, pkt,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1480 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1481 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1482 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1483 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1484 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1485
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1486 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1487
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1488 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1489
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1490 if (ngx_quic_handle_stream_data_blocked_frame(c, pkt,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1491 &frame.u.stream_data_blocked)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1492 != NGX_OK)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1493 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1494 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1495 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1496
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1497 break;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1498
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1499 case NGX_QUIC_FT_MAX_STREAM_DATA:
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1500
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1501 if (ngx_quic_handle_max_stream_data_frame(c, pkt,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1502 &frame.u.max_stream_data)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1503 != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1504 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1505 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1506 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1507
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1508 break;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1509
8325
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1510 case NGX_QUIC_FT_NEW_CONNECTION_ID:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1511 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1512 case NGX_QUIC_FT_NEW_TOKEN:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1513 case NGX_QUIC_FT_RESET_STREAM:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1514 case NGX_QUIC_FT_STOP_SENDING:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1515 case NGX_QUIC_FT_PATH_CHALLENGE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1516 case NGX_QUIC_FT_PATH_RESPONSE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1517
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1518 /* TODO: handle */
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1519 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1520 "quic frame handler not implemented");
8325
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1521 break;
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1522
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1523 default:
8346
4e4485793418 Added MAX_STREAM_DATA stub handler.
Vladimir Homutov <vl@nginx.com>
parents: 8345
diff changeset
1524 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1525 "quic missing frame handler");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1526 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1527 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1528 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1529
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1530 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1531 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1532 "quic trailing garbage in payload: %ui bytes", end - p);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1533 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1534 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1535
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1536 if (do_close) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1537 qc->draining = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1538 ngx_quic_close_connection(c, NGX_OK);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1539 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1540
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1541 return NGX_OK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1542 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1543
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1544
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1545 static ngx_int_t
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1546 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_header_t *pkt)
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1547 {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1548 ngx_quic_frame_t *frame;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1549
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1550 c->log->action = "generating acknowledgment";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1551
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1552 /* every ACK-eliciting packet is acknowledged, TODO ACK Ranges */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1553
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1554 frame = ngx_quic_alloc_frame(c, 0);
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1555 if (frame == NULL) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1556 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1557 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1558
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1559 frame->level = (pkt->level == ssl_encryption_early_data)
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1560 ? ssl_encryption_application
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1561 : pkt->level;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1562
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1563 frame->type = NGX_QUIC_FT_ACK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1564 frame->u.ack.largest = pkt->pn;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1565
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1566 ngx_sprintf(frame->info, "ACK for PN=%d from frame handler level=%d",
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1567 pkt->pn, frame->level);
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1568 ngx_quic_queue_frame(c->quic, frame);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1569
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1570 return NGX_OK;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1571 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1572
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1573
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1574 static ngx_int_t
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1575 ngx_quic_send_cc(ngx_connection_t *c, enum ssl_encryption_level_t level,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1576 ngx_uint_t err)
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1577 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1578 ngx_quic_frame_t *frame;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1579 ngx_quic_connection_t *qc;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1580
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1581 qc = c->quic;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1582
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1583 if (qc->draining) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1584 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1585 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1586
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1587 if (qc->closing
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1588 && ngx_current_msec - qc->last_cc < NGX_QUIC_CC_MIN_INTERVAL)
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1589 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1590 /* dot not send CC too often */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1591 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1592 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1593
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1594 frame = ngx_quic_alloc_frame(c, 0);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1595 if (frame == NULL) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1596 return NGX_ERROR;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1597 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1598
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1599 frame->level = level;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1600 frame->type = NGX_QUIC_FT_CONNECTION_CLOSE;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1601 frame->u.close.error_code = err;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1602 ngx_sprintf(frame->info, "cc from send_cc err=%ui level=%d", err,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1603 frame->level);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1604
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1605 ngx_quic_queue_frame(c->quic, frame);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1606
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1607 qc->last_cc = ngx_current_msec;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1608
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1609 return ngx_quic_output(c);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1610 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1611
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1612
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1613 static ngx_int_t
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1614 ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1615 ngx_quic_ack_frame_t *ack)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1616 {
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1617 ssize_t n;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1618 u_char *pos, *end;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1619 uint64_t gap, range;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1620 ngx_uint_t i, min, max;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1621 ngx_quic_send_ctx_t *ctx;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1622
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1623 ctx = ngx_quic_get_send_ctx(c->quic, pkt->level);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1624
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1625 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1626 "quic ngx_quic_handle_ack_frame level %d", pkt->level);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1627
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1628 /*
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1629 * TODO: If any computed packet number is negative, an endpoint MUST
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1630 * generate a connection error of type FRAME_ENCODING_ERROR.
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1631 * (19.3.1)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1632 */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1633
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1634 if (ack->first_range > ack->largest) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1635 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1636 "quic invalid first range in ack frame");
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1637 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1638 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1639
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1640 min = ack->largest - ack->first_range;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1641 max = ack->largest;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1642
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1643 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max) != NGX_OK) {
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1644 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1645 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1646
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1647 /* 13.2.3. Receiver Tracking of ACK Frames */
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1648 if (ctx->largest_ack < max) {
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1649 ctx->largest_ack = max;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1650 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1651 "quic updated largest received ack: %ui", max);
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1652 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1653
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1654 pos = ack->ranges_start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1655 end = ack->ranges_end;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1656
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1657 for (i = 0; i < ack->range_count; i++) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1658
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1659 n = ngx_quic_parse_ack_range(pkt, pos, end, &gap, &range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1660 if (n == NGX_ERROR) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1661 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1662 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1663 pos += n;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1664
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1665 if (gap >= min) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1666 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1667 "quic invalid range %ui in ack frame", i);
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1668 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1669 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1670
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1671 max = min - 1 - gap;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1672
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1673 if (range > max + 1) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1674 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1675 "quic invalid range %ui in ack frame", i);
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1676 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1677 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1678
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1679 min = max - range + 1;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1680
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1681 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max) != NGX_OK) {
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1682 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1683 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1684 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1685
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1686 return NGX_OK;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1687 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1688
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1689
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1690 static ngx_int_t
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1691 ngx_quic_handle_ack_frame_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1692 uint64_t min, uint64_t max)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1693 {
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1694 ngx_uint_t found;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1695 ngx_queue_t *q;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1696 ngx_quic_frame_t *f;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1697 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1698
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1699 qc = c->quic;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1700
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1701 found = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1702
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1703 q = ngx_queue_head(&ctx->sent);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1704
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1705 while (q != ngx_queue_sentinel(&ctx->sent)) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1706
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1707 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1708
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1709 if (f->pnum >= min && f->pnum <= max) {
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1710 ngx_quic_congestion_ack(c, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1711
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1712 ngx_quic_handle_stream_ack(c, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1713
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1714 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1715 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1716 ngx_quic_free_frame(c, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1717 found = 1;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1718
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1719 } else {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1720 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1721 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1722 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1723
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1724 if (!found) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1725
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1726 if (max <= ctx->pnum) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1727 /* duplicate ACK or ACK for non-ack-eliciting frame */
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1728 return NGX_OK;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1729 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1730
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1731 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1732 "quic ACK for the packet not in sent queue ");
8371
9d9531431c8c Removed outdated/incorrect comments and fixed style.
Vladimir Homutov <vl@nginx.com>
parents: 8370
diff changeset
1733 /* TODO: handle error properly: PROTOCOL VIOLATION */
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1734 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1735 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1736
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1737 if (!qc->push.timer_set) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1738 ngx_post_event(&qc->push, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1739 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1740
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1741 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1742 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1743
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1744
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1745 static void
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1746 ngx_quic_handle_stream_ack(ngx_connection_t *c, ngx_quic_frame_t *f)
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1747 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1748 uint64_t sent, unacked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1749 ngx_event_t *wev;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1750 ngx_quic_stream_t *sn;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1751 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1752
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1753 if (f->type < NGX_QUIC_FT_STREAM0 || f->type > NGX_QUIC_FT_STREAM7) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1754 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1755 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1756
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1757 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1758
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1759 sn = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1760 if (sn == NULL) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1761 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1762 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1763
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1764 wev = sn->c->write;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1765 sent = sn->c->sent;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1766 unacked = sent - sn->acked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1767
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1768 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1769 wev->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1770 ngx_post_event(wev, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1771 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1772
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1773 sn->acked += f->u.stream.length;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1774
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1775 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, sn->c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1776 "quic stream ack %uL acked:%uL, unacked:%uL",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1777 f->u.stream.length, sn->acked, sent - sn->acked);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1778 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1779
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
1780
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1781 static ngx_int_t
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1782 ngx_quic_handle_ordered_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs,
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
1783 ngx_quic_frame_t *frame, ngx_quic_frame_handler_pt handler, void *data)
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1784 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1785 size_t full_len;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1786 ngx_int_t rc;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1787 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1788 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1789
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1790 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1791
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1792 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1793 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1794 "quic out-of-order frame: expecting %ui got %ui",
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1795 fs->received, f->offset);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1796
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1797 return ngx_quic_buffer_frame(c, fs, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1798 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1799
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1800 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1801
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1802 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1803 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1804 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1805 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1806 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1807 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1808
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1809 /* intersecting data range, frame modified */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1810 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1811
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1812 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1813
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
1814 rc = handler(c, frame, data);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1815 if (rc == NGX_ERROR) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1816 return NGX_ERROR;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1817
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1818 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1819 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1820 return NGX_OK;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1821 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1822
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1823 /* rc == NGX_OK */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1824
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1825 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1826
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1827 /* now check the queue if we can continue with buffered frames */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1828
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1829 do {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1830 q = ngx_queue_head(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1831 if (q == ngx_queue_sentinel(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1832 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1833 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1834
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1835 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1836 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1837
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1838 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1839 /* gap found, nothing more to do */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1840 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1841 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1842
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1843 full_len = f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1844
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1845 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1846
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1847 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1848 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1849 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1850 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1851 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1852 fs->total -= f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1853
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1854 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1855 "quic skipped buffered frame, total %ui",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1856 fs->total);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1857 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1858 continue;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1859 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1860
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1861 /* frame was adjusted, proceed to input */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1862 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1863
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1864 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1865
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
1866 rc = handler(c, frame, data);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1867
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1868 if (rc == NGX_ERROR) {
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1869 return NGX_ERROR;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1870
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1871 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1872 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1873 return NGX_OK;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1874 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1875
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1876 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1877 fs->total -= full_len;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1878
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1879 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1880
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1881 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1882 "quic consumed buffered frame, total %ui", fs->total);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1883
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1884 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1885
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1886 } while (1);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1887
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1888 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1889 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1890
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1891
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1892 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1893 ngx_quic_adjust_frame_offset(ngx_connection_t *c, ngx_quic_frame_t *frame,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1894 uint64_t offset_in)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1895 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1896 size_t tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1897 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1898
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1899 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1900
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1901 tail = offset_in - f->offset;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1902
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1903 if (tail >= f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1904 /* range preceeding already received data or duplicate, ignore */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1905
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1906 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1907 "quic old or duplicate data in ordered frame, ignored");
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1908 return NGX_DONE;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1909 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1910
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1911 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1912 "quic adjusted ordered frame data start to expected offset");
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1913
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1914 /* intersecting range: adjust data size */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1915
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1916 f->offset += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1917 f->data += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1918 f->length -= tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1919
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1920 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1921 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1922
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1923
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1924 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1925 ngx_quic_buffer_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1926 ngx_quic_frame_t *frame)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1927 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1928 u_char *data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1929 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1930 ngx_quic_frame_t *dst, *item;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1931 ngx_quic_ordered_frame_t *f, *df;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1932
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1933 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1934 "quic ngx_quic_buffer_frame");
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1935
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1936 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1937
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1938 /* frame start offset is in the future, buffer it */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1939
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1940 /* check limit on total size used by all buffered frames, not actual data */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1941 if (NGX_QUIC_MAX_BUFFERED - fs->total < f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1942 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1943 "quic ordered input buffer limit exceeded");
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1944 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1945 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1946
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1947 dst = ngx_quic_alloc_frame(c, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1948 if (dst == NULL) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1949 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1950 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1951
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1952 data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1953 ngx_memcpy(dst, frame, sizeof(ngx_quic_frame_t));
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1954 dst->data = data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1955
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1956 ngx_memcpy(dst->data, f->data, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1957
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1958 df = &dst->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1959 df->data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1960
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1961 fs->total += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1962
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1963 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1964 "quic ordered frame with unexpected offset:"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1965 " buffered, total %ui", fs->total);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1966
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1967 /* TODO: do we need some timeout for this queue ? */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1968
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1969 if (ngx_queue_empty(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1970 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1971 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1972 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1973
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1974 for (q = ngx_queue_last(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1975 q != ngx_queue_sentinel(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1976 q = ngx_queue_prev(q))
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1977 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1978 item = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1979 f = &item->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1980
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1981 if (f->offset < df->offset) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1982 ngx_queue_insert_after(q, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1983 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1984 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1985 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1986
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1987 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1988
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1989 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1990 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1991
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1992
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1993 static ngx_int_t
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1994 ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1995 ngx_quic_frame_t *frame)
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1996 {
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1997 ngx_quic_connection_t *qc;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1998 ngx_quic_frames_stream_t *fs;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1999
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2000 qc = c->quic;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2001 fs = &qc->crypto[pkt->level];
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2002
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2003 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_crypto_input,
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2004 NULL);
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2005 }
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2006
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2007
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
2008 static ngx_int_t
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2009 ngx_quic_crypto_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data)
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2010 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2011 int sslerr;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2012 ssize_t n;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2013 ngx_ssl_conn_t *ssl_conn;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2014 ngx_quic_crypto_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2015
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2016 f = &frame->u.crypto;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2017
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2018 ssl_conn = c->ssl->connection;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2019
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2020 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2021 "quic SSL_quic_read_level: %d, SSL_quic_write_level: %d",
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2022 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2023 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2024
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2025 if (!SSL_provide_quic_data(ssl_conn, SSL_quic_read_level(ssl_conn),
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
2026 f->data, f->length))
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2027 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2028 ngx_ssl_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2029 "SSL_provide_quic_data() failed");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2030 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2031 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2032
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2033 n = SSL_do_handshake(ssl_conn);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2034
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2035 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2036
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2037 if (n == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2038 sslerr = SSL_get_error(ssl_conn, n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2039
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2040 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2041 sslerr);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2042
8300
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
2043 if (sslerr != SSL_ERROR_WANT_READ) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2044 ngx_ssl_error(NGX_LOG_ERR, c->log, 0, "SSL_do_handshake() failed");
8300
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
2045 return NGX_ERROR;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2046 }
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
2047
8302
76818c9cdd6f Sending HANDSHAKE_DONE just once with BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8301
diff changeset
2048 } else if (n == 1 && !SSL_in_init(ssl_conn)) {
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
2049 c->quic->state = NGX_QUIC_ST_APPLICATION;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2050
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
2051 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8299
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
2052 "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2053
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
2054 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2055 "quic handshake completed successfully");
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2056
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2057 frame = ngx_quic_alloc_frame(c, 0);
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2058 if (frame == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2059 return NGX_ERROR;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2060 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2061
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2062 /* 12.4 Frames and frame types, figure 8 */
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2063 frame->level = ssl_encryption_application;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2064 frame->type = NGX_QUIC_FT_HANDSHAKE_DONE;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2065 ngx_sprintf(frame->info, "HANDSHAKE DONE on handshake completed");
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
2066 ngx_quic_queue_frame(c->quic, frame);
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2067
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2068 /*
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2069 * Generating next keys before a key update is received.
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2070 * See quic-tls 9.4 Header Protection Timing Side-Channels.
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2071 */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2072
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2073 if (ngx_quic_key_update(c, &c->quic->keys[ssl_encryption_application],
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2074 &c->quic->next_key)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2075 != NGX_OK)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2076 {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2077 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2078 }
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
2079 }
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
2080
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2081 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2082 "quic SSL_quic_read_level: %d, SSL_quic_write_level: %d",
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2083 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2084 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2085
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2086 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2087 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2088
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2089
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2090 static ngx_int_t
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2091 ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2092 ngx_quic_frame_t *frame)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2093 {
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2094 size_t n;
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2095 ngx_buf_t *b;
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2096 ngx_event_t *rev;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2097 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2098 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2099 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2100 ngx_quic_frames_stream_t *fs;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2101
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2102 qc = c->quic;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2103 f = &frame->u.stream;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2104
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2105 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2106
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2107 if (sn == NULL) {
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2108 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2109 "quic stream id 0x%xi is new", f->stream_id);
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2110
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2111 n = (f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2112 ? qc->tp.initial_max_stream_data_uni
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2113 : qc->tp.initial_max_stream_data_bidi_remote;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2114
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2115 if (n < NGX_QUIC_STREAM_BUFSIZE) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2116 n = NGX_QUIC_STREAM_BUFSIZE;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2117 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2118
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2119 if (n < f->length) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2120 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2121 "quic no space in stream buffer");
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2122 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2123 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2124
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2125 /*
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2126 * TODO: check IDs are increasing ? create all lower-numbered?
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2127 *
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2128 * 2.1. Stream Types and Identifiers
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2129 *
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2130 * Within each type, streams are created with numerically increasing
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2131 * stream IDs. A stream ID that is used out of order results in all
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2132 * streams of that type with lower-numbered stream IDs also being
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2133 * opened.
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2134 */
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2135 sn = ngx_quic_create_stream(c, f->stream_id, n);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2136 if (sn == NULL) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2137 return NGX_ERROR;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2138 }
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2139
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2140 rev = sn->c->read;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2141
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2142 if (f->offset == 0) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2143
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2144 b = sn->b;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2145 b->last = ngx_cpymem(b->last, f->data, f->length);
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2146
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2147 sn->fs.received += f->length;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2148
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2149 rev->ready = 1;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2150
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2151 if (f->fin) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2152 rev->pending_eof = 1;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2153 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2154
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2155 } else {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2156 rev->ready = 0;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2157 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2158
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2159 if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2160 ngx_quic_handle_max_streams(c);
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2161 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2162
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2163 qc->streams.handler(sn->c);
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2164
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2165 if (f->offset == 0) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2166 return NGX_OK;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2167 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2168
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2169 /* out-of-order stream: proceed to buffering */
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2170 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2171
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2172 fs = &sn->fs;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2173
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2174 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input,
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2175 sn);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2176 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2177
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2178
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2179 static ngx_int_t
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2180 ngx_quic_stream_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data)
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2181 {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2182 ngx_buf_t *b;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2183 ngx_event_t *rev;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2184 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2185 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2186 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2187
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2188 qc = c->quic;
8378
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 8377
diff changeset
2189 sn = data;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2190
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2191 f = &frame->u.stream;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2192
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2193 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic existing stream");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2194
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2195 b = sn->b;
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2196
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2197 if ((size_t) ((b->pos - b->start) + (b->end - b->last)) < f->length) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2198 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2199 "quic no space in stream buffer");
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2200 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2201 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2202
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2203 if ((size_t) (b->end - b->last) < f->length) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2204 b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2205 b->pos = b->start;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2206 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2207
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2208 b->last = ngx_cpymem(b->last, f->data, f->length);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2209
8294
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2210 rev = sn->c->read;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2211 rev->ready = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2212
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2213 if (f->fin) {
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2214 rev->pending_eof = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2215 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2216
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2217 if (rev->active) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2218 rev->handler(rev);
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2219 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2220
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
2221 /* check if stream was destroyed by handler */
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2222 if (ngx_quic_find_stream(&qc->streams.tree, f->stream_id) == NULL) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2223 return NGX_DONE;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2224 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2225
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2226 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2227 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2228
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2229
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2230 static ngx_int_t
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2231 ngx_quic_handle_max_streams(ngx_connection_t *c)
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2232 {
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2233 ngx_quic_frame_t *frame;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2234 ngx_quic_connection_t *qc;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2235
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2236 qc = c->quic;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2237 qc->cur_streams++;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2238
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2239 if (qc->cur_streams + NGX_QUIC_STREAMS_INC / 2 < qc->max_streams) {
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2240 return NGX_OK;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2241 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2242
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2243 frame = ngx_quic_alloc_frame(c, 0);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2244 if (frame == NULL) {
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2245 return NGX_ERROR;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2246 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2247
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2248 qc->max_streams = ngx_max(qc->max_streams + NGX_QUIC_STREAMS_INC,
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2249 NGX_QUIC_STREAMS_LIMIT);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2250
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2251 frame->level = ssl_encryption_application;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2252 frame->type = NGX_QUIC_FT_MAX_STREAMS;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2253 frame->u.max_streams.limit = qc->max_streams;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2254 frame->u.max_streams.bidi = 1;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2255
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2256 ngx_sprintf(frame->info, "MAX_STREAMS limit:%d bidi:%d level=%d",
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2257 (int) frame->u.max_streams.limit,
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2258 (int) frame->u.max_streams.bidi,
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2259 frame->level);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2260
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2261 ngx_quic_queue_frame(qc, frame);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2262
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2263 return NGX_OK;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2264 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2265
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2266
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2267 static ngx_int_t
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2268 ngx_quic_handle_max_data_frame(ngx_connection_t *c,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2269 ngx_quic_max_data_frame_t *f)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2270 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2271 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2272 ngx_rbtree_t *tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2273 ngx_rbtree_node_t *node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2274 ngx_quic_stream_t *qs;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2275 ngx_quic_connection_t *qc;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2276
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2277 qc = c->quic;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2278 tree = &qc->streams.tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2279
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2280 if (f->max_data <= qc->streams.send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2281 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2282 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2283
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2284 if (qc->streams.sent >= qc->streams.send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2285
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2286 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2287 node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2288 node = ngx_rbtree_next(tree, node))
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2289 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2290 qs = (ngx_quic_stream_t *) node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2291 wev = qs->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2292
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2293 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2294 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2295 ngx_post_event(wev, &ngx_posted_events);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2296 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2297 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2298 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2299
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2300 qc->streams.send_max_data = f->max_data;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2301
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2302 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2303 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2304
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2305
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2306 static ngx_int_t
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2307 ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2308 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2309 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2310 ngx_quic_frame_t *frame;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2311
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2312 frame = ngx_quic_alloc_frame(c, 0);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2313 if (frame == NULL) {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2314 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2315 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2316
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2317 frame->level = pkt->level;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2318 frame->type = NGX_QUIC_FT_MAX_STREAMS;
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2319 frame->u.max_streams.limit = ngx_max(f->limit * 2, NGX_QUIC_STREAMS_LIMIT);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2320 frame->u.max_streams.bidi = f->bidi;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2321
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2322 c->quic->max_streams = frame->u.max_streams.limit;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
2323
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2324 ngx_sprintf(frame->info, "MAX_STREAMS limit:%d bidi:%d level=%d",
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2325 (int) frame->u.max_streams.limit,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2326 (int) frame->u.max_streams.bidi,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2327 frame->level);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2328
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2329 ngx_quic_queue_frame(c->quic, frame);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2330
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2331 return NGX_OK;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2332 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2333
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
2334
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2335 static ngx_int_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2336 ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2337 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2338 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2339 size_t n;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2340 ngx_buf_t *b;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2341 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2342 ngx_quic_stream_t *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2343 ngx_quic_connection_t *qc;
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2344
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2345 qc = c->quic;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2346 sn = ngx_quic_find_stream(&qc->streams.tree, f->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2347
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2348 if (sn == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2349 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2350 "quic unknown stream id:%uL", f->id);
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2351 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2352 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2353
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2354 b = sn->b;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2355 n = sn->fs.received + (b->pos - b->start) + (b->end - b->last);
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2356
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2357 frame = ngx_quic_alloc_frame(c, 0);
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2358 if (frame == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2359 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2360 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2361
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2362 frame->level = pkt->level;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2363 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2364 frame->u.max_stream_data.id = f->id;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2365 frame->u.max_stream_data.limit = n;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2366
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2367 ngx_sprintf(frame->info, "MAX_STREAM_DATA id:%d limit:%d level=%d",
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2368 (int) frame->u.max_stream_data.id,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2369 (int) frame->u.max_stream_data.limit,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2370 frame->level);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2371
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2372 ngx_quic_queue_frame(c->quic, frame);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2373
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2374 return NGX_OK;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2375 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2376
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2377
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2378 static ngx_int_t
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2379 ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2380 ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2381 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2382 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2383 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2384 ngx_quic_stream_t *sn;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2385 ngx_quic_connection_t *qc;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2386
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2387 qc = c->quic;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2388 sn = ngx_quic_find_stream(&qc->streams.tree, f->id);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2389
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2390 if (sn == NULL) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2391 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unknown stream id:%uL", f->id);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2392 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2393 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2394
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2395 if (f->limit <= sn->send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2396 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2397 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2398
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2399 sent = sn->c->sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2400
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2401 if (sent >= sn->send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2402 wev = sn->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2403
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2404 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2405 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2406 ngx_post_event(wev, &ngx_posted_events);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2407 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2408 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2409
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2410 sn->send_max_data = f->limit;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2411
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2412 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2413 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2414
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2415
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2416 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2417 ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2418 {
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2419 ngx_quic_send_ctx_t *ctx;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2420
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2421 ctx = ngx_quic_get_send_ctx(qc, frame->level);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2422
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2423 ngx_queue_insert_tail(&ctx->frames, &frame->queue);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2424
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2425 /* TODO: check PUSH flag on stream and call output */
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2426
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2427 if (!qc->push.timer_set && !qc->closing) {
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2428 ngx_add_timer(&qc->push, qc->tp.max_ack_delay);
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2429 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2430 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2431
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2432
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2433 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2434 ngx_quic_output(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2435 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2436 ngx_uint_t i;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2437 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2438
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
2439 c->log->action = "sending frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
2440
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2441 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2442
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2443 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8332
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2444 if (ngx_quic_output_frames(c, &qc->send_ctx[i]) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2445 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2446 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2447 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2448
8322
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
2449 if (!qc->send_timer_set && !qc->closing) {
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2450 qc->send_timer_set = 1;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2451 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2452 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2453
8369
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
2454 if (!qc->retransmit.timer_set && !qc->closing) {
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
2455 ngx_add_timer(&qc->retransmit, qc->tp.max_ack_delay);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2456 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2457
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2458 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2459 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2460
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2461
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2462 static ngx_int_t
8332
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2463 ngx_quic_output_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2464 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2465 size_t len, hlen, n;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2466 ngx_int_t rc;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2467 ngx_uint_t need_ack;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2468 ngx_queue_t *q, range;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2469 ngx_quic_frame_t *f;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2470 ngx_quic_congestion_t *cg;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2471 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2472
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2473 qc = c->quic;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2474 cg = &qc->congestion;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2475
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2476 if (ngx_queue_empty(&ctx->frames)) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2477 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2478 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2479
8332
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2480 q = ngx_queue_head(&ctx->frames);
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2481 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2482
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2483 /* all frames in same send_ctx share same level */
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2484 hlen = (f->level == ssl_encryption_application) ? NGX_QUIC_MAX_SHORT_HEADER
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2485 : NGX_QUIC_MAX_LONG_HEADER;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2486 hlen += EVP_GCM_TLS_TAG_LEN;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2487
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2488 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2489 len = 0;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2490 need_ack = 0;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2491 ngx_queue_init(&range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2492
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2493 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2494 /* process group of frames that fits into packet */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2495 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2496
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2497 n = ngx_quic_create_frame(NULL, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2498
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2499 if (len && hlen + len + n > qc->ctp.max_packet_size) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2500 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2501 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2502
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2503 if (f->need_ack) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2504 need_ack = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2505 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2506
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2507 if (need_ack && cg->in_flight + len + n > cg->window) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2508 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2509 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2510
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2511 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2512
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2513 f->first = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2514
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2515 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2516 ngx_queue_insert_tail(&range, &f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2517
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2518 len += n;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2519
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2520 } while (q != ngx_queue_sentinel(&ctx->frames));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2521
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2522 if (ngx_queue_empty(&range)) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2523 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2524 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2525
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2526 rc = ngx_quic_send_frames(c, &range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2527
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2528 if (rc == NGX_OK) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2529 /*
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2530 * frames are moved into the sent queue
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2531 * to wait for ack/be retransmitted
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2532 */
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2533 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2534 /* if we are closing, any ack will be discarded */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2535 ngx_quic_free_frames(c, &range);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2536
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2537 } else {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2538 ngx_queue_add(&ctx->sent, &range);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2539 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2540
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2541 cg->in_flight += len;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2542
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2543 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2544 "quic congestion send if:%uz", cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2545
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2546 } else if (rc == NGX_DONE) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2547
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2548 /* no ack is expected for this frames, can free them */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2549 ngx_quic_free_frames(c, &range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2550
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2551 } else {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2552 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2553 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2554
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2555 } while (q != ngx_queue_sentinel(&ctx->frames));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2556
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2557 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2558 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2559
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2560
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2561 static void
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2562 ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames)
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2563 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2564 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2565 ngx_quic_frame_t *f;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2566
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2567 do {
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2568 q = ngx_queue_head(frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2569
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2570 if (q == ngx_queue_sentinel(frames)) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2571 break;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2572 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2573
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2574 ngx_queue_remove(q);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2575
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2576 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2577
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2578 ngx_quic_free_frame(c, f);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2579 } while (1);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2580 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2581
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2582
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2583 static ngx_int_t
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2584 ngx_quic_send_frames(ngx_connection_t *c, ngx_queue_t *frames)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2585 {
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2586 ssize_t len;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2587 u_char *p;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2588 ngx_msec_t now;
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2589 ngx_str_t out, res;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2590 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2591 ngx_quic_frame_t *f, *start;
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2592 ngx_quic_header_t pkt;
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2593 ngx_quic_secrets_t *keys;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2594 ngx_quic_send_ctx_t *ctx;
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2595 ngx_quic_connection_t *qc;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2596 static ngx_str_t initial_token = ngx_null_string;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2597 static u_char src[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2598 static u_char dst[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2599
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2600 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2601 "quic ngx_quic_send_frames");
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2602
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2603 q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2604 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2605
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2606 ctx = ngx_quic_get_send_ctx(c->quic, start->level);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2607
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2608 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2609
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2610 now = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2611
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2612 p = src;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2613 out.data = src;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2614
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2615 for (q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2616 q != ngx_queue_sentinel(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2617 q = ngx_queue_next(q))
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2618 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2619 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2620
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2621 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2622 "quic frame out: %s", f->info);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2623
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2624 len = ngx_quic_create_frame(p, f);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2625 if (len == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2626 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2627 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2628
8312
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 8311
diff changeset
2629 if (f->need_ack) {
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 8311
diff changeset
2630 pkt.need_ack = 1;
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 8311
diff changeset
2631 }
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 8311
diff changeset
2632
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2633 p += len;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2634 f->pnum = ctx->pnum;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2635 f->last = now;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2636 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2637
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2638 if (start->level == ssl_encryption_initial) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2639 /* ack will not be sent in initial packets due to initial keys being
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2640 * discarded when handshake start.
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2641 * Thus consider initial packets as non-ack-eliciting
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2642 */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2643 pkt.need_ack = 0;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2644 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2645
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2646 out.len = p - out.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2647
8301
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2648 while (out.len < 4) {
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2649 *p++ = NGX_QUIC_FT_PADDING;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2650 out.len++;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2651 }
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2652
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2653 qc = c->quic;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2654
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2655 keys = &c->quic->keys[start->level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2656
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2657 pkt.secret = &keys->server;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2658
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2659 pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2660
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2661 if (start->level == ssl_encryption_initial) {
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2662 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2663 pkt.token = initial_token;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2664
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2665 } else if (start->level == ssl_encryption_handshake) {
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2666 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2667
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2668 } else {
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2669 if (c->quic->key_phase) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2670 pkt.flags |= NGX_QUIC_PKT_KPHASE;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8369
diff changeset
2671 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2672 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2673
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2674 ngx_quic_set_packet_number(&pkt, ctx);
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2675
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2676 pkt.log = c->log;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2677 pkt.level = start->level;
8344
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8343
diff changeset
2678 pkt.dcid = qc->scid;
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8343
diff changeset
2679 pkt.scid = qc->dcid;
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2680 pkt.payload = out;
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8284
diff changeset
2681
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2682 res.data = dst;
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8284
diff changeset
2683
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2684 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2685 "quic packet ready: %ui bytes at level %d"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2686 " need_ack: %d number: %L encoded %d:0x%xD",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2687 out.len, start->level, pkt.need_ack, pkt.number,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2688 pkt.num_len, pkt.trunc);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2689
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8284
diff changeset
2690 if (ngx_quic_encrypt(&pkt, c->ssl->connection, &res) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2691 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2692 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2693
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2694 #ifdef NGX_QUIC_DEBUG_PACKETS
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
2695 ngx_quic_hexdump(c->log, "quic packet to send", res.data, res.len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2696 #endif
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2697
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2698 len = c->send(c, res.data, res.len);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2699 if (len == NGX_ERROR || (size_t) len != res.len) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2700 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2701 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2702
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2703 /* len == NGX_OK || NGX_AGAIN */
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2704 ctx->pnum++;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2705
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2706 return pkt.need_ack ? NGX_OK : NGX_DONE;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2707 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2708
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2709
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2710 static void
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2711 ngx_quic_set_packet_number(ngx_quic_header_t *pkt, ngx_quic_send_ctx_t *ctx)
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2712 {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2713 uint64_t delta;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2714
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2715 delta = ctx->pnum - ctx->largest_ack;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2716 pkt->number = ctx->pnum;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2717
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2718 if (delta <= 0x7F) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2719 pkt->num_len = 1;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2720 pkt->trunc = ctx->pnum & 0xff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2721
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2722 } else if (delta <= 0x7FFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2723 pkt->num_len = 2;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2724 pkt->flags |= 0x1;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2725 pkt->trunc = ctx->pnum & 0xffff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2726
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2727 } else if (delta <= 0x7FFFFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2728 pkt->num_len = 3;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2729 pkt->flags |= 0x2;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2730 pkt->trunc = ctx->pnum & 0xffffff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2731
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2732 } else {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2733 pkt->num_len = 4;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2734 pkt->flags |= 0x3;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2735 pkt->trunc = ctx->pnum & 0xffffffff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2736 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2737 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2738
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2739
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2740 static void
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2741 ngx_quic_retransmit_handler(ngx_event_t *ev)
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2742 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2743 ngx_uint_t i;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2744 ngx_msec_t wait, nswait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2745 ngx_connection_t *c;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2746 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2747
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2748 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2749 "quic retransmit timer");
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2750
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2751 c = ev->data;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2752 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2753
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2754 wait = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2755
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2756 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2757 if (ngx_quic_retransmit(c, &qc->send_ctx[i], &nswait) != NGX_OK) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2758 ngx_quic_close_connection(c, NGX_ERROR);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2759 return;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2760 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2761
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2762 if (i == 0) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2763 wait = nswait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2764
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2765 } else if (nswait > 0 && nswait < wait) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2766 wait = nswait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2767 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2768 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2769
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2770 if (wait > 0) {
8369
bddf704d62c1 Renamed retransmit event object in preparation for retry support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8368
diff changeset
2771 ngx_add_timer(&qc->retransmit, wait);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2772 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2773 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2775
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2776 static void
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2777 ngx_quic_push_handler(ngx_event_t *ev)
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2778 {
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2779 ngx_connection_t *c;
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2780
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2781 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic push timer");
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2782
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2783 c = ev->data;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2784
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2785 if (ngx_quic_output(c) != NGX_OK) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
2786 ngx_quic_close_connection(c, NGX_ERROR);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2787 return;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2788 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2789 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2790
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2791
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2792 static ngx_int_t
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2793 ngx_quic_retransmit(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2794 ngx_msec_t *waitp)
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2795 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2796 uint64_t pn;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2797 ngx_msec_t now, wait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2798 ngx_queue_t *q, range;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2799 ngx_quic_frame_t *f, *start;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2800 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2801
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2802 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2803
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2804 now = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2805 wait = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2806
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2807 if (ngx_queue_empty(&ctx->sent)) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2808 *waitp = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2809 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2810 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2811
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2812 q = ngx_queue_head(&ctx->sent);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2813
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2814 do {
8363
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2815 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2816
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2817 wait = start->last + qc->tp.max_ack_delay - now;
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2818
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2819 if ((ngx_msec_int_t) wait > 0) {
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2820 break;
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2821 }
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2822
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2823 pn = start->pnum;
d3395396ce51 Fixed packet retransmission.
Roman Arutyunyan <arut@nginx.com>
parents: 8362
diff changeset
2824
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2825 ngx_queue_init(&range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2826
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2827 /* send frames with same packet number to the wire */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2828 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2829 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2830
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2831 if (start->first + qc->tp.max_idle_timeout < now) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2832 ngx_log_error(NGX_LOG_ERR, c->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
2833 "quic retransmission timeout");
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2834 return NGX_DECLINED;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2835 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2836
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2837 if (f->pnum != pn) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2838 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2839 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2840
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2841 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2842
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2843 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2844 ngx_queue_insert_tail(&range, &f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2845
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2846 } while (q != ngx_queue_sentinel(&ctx->sent));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2847
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2848 ngx_quic_congestion_lost(c, start->last);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
2849
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2850 /* NGX_DONE is impossible here, such frames don't get into this queue */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2851 if (ngx_quic_send_frames(c, &range) != NGX_OK) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2852 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2853 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2854
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2855 /* move frames group to the end of queue */
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2856 ngx_queue_add(&ctx->sent, &range);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2857
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2858 } while (q != ngx_queue_sentinel(&ctx->sent));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2859
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2860 *waitp = wait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2861
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2862 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2863 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2864
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2865
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2866 ngx_connection_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2867 ngx_quic_create_uni_stream(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2868 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2869 ngx_uint_t id;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2870 ngx_quic_stream_t *qs, *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2871 ngx_quic_connection_t *qc;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2872
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2873 qs = c->qs;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2874 qc = qs->parent->quic;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2875
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2876 id = (qc->streams.id_counter << 2)
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2877 | NGX_QUIC_STREAM_SERVER_INITIATED
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2878 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2879
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2880 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
2881 "quic creating server uni stream #%ui id %ui",
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2882 qc->streams.id_counter, id);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2883
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2884 qc->streams.id_counter++;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2885
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2886 sn = ngx_quic_create_stream(qs->parent, id, 0);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2887 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2888 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2889 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2890
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2891 return sn->c;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2892 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2893
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2894
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2895 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2896 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2897 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2898 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2899 ngx_rbtree_node_t **p;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2900 ngx_quic_stream_t *qn, *qnt;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2901
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2902 for ( ;; ) {
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2903 qn = (ngx_quic_stream_t *) node;
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2904 qnt = (ngx_quic_stream_t *) temp;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2905
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2906 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2907
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2908 if (*p == sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2909 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2910 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2911
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2912 temp = *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2913 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2914
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2915 *p = node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2916 node->parent = temp;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2917 node->left = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2918 node->right = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2919 ngx_rbt_red(node);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2920 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2921
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2922
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2923 static ngx_quic_stream_t *
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2924 ngx_quic_find_stream(ngx_rbtree_t *rbtree, uint64_t id)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2925 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2926 ngx_rbtree_node_t *node, *sentinel;
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2927 ngx_quic_stream_t *qn;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2928
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2929 node = rbtree->root;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2930 sentinel = rbtree->sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2931
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2932 while (node != sentinel) {
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2933 qn = (ngx_quic_stream_t *) node;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2934
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2935 if (id == qn->id) {
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2936 return qn;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2937 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2938
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2939 node = (id < qn->id) ? node->left : node->right;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2940 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2941
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2942 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2943 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2944
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2945
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2946 static ngx_quic_stream_t *
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2947 ngx_quic_create_stream(ngx_connection_t *c, uint64_t id, size_t rcvbuf_size)
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2948 {
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2949 ngx_log_t *log;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2950 ngx_pool_t *pool;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2951 ngx_quic_stream_t *sn;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2952 ngx_pool_cleanup_t *cln;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2953 ngx_quic_connection_t *qc;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2954
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
2955 qc = c->quic;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2956
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2957 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2958 if (pool == NULL) {
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2959 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2960 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2961
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2962 sn = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2963 if (sn == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2964 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2965 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2966 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2967
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2968 sn->node.key = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2969 sn->parent = c;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2970 sn->id = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2971
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2972 sn->b = ngx_create_temp_buf(pool, rcvbuf_size);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2973 if (sn->b == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2974 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2975 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2976 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2977
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2978 ngx_queue_init(&sn->fs.frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2979
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2980 log = ngx_palloc(pool, sizeof(ngx_log_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2981 if (log == NULL) {
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2982 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2983 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2984 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2985
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2986 *log = *c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2987 pool->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2988
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2989 sn->c = ngx_get_connection(-1, log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2990 if (sn->c == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2991 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2992 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2993 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2994
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2995 sn->c->qs = sn;
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2996 sn->c->pool = pool;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2997 sn->c->ssl = c->ssl;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2998 sn->c->sockaddr = c->sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2999 sn->c->listening = c->listening;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3000 sn->c->addr_text = c->addr_text;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3001 sn->c->local_sockaddr = c->local_sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3002 sn->c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3003
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3004 sn->c->recv = ngx_quic_stream_recv;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3005 sn->c->send = ngx_quic_stream_send;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3006 sn->c->send_chain = ngx_quic_stream_send_chain;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3007
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3008 sn->c->read->log = c->log;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3009 sn->c->write->log = c->log;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3010
8362
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 8361
diff changeset
3011 log->connection = sn->c->number;
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 8361
diff changeset
3012
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3013 if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3014 || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3015 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3016 sn->c->write->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3017 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3018
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3019 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3020 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3021 sn->send_max_data = qc->ctp.initial_max_stream_data_uni;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3022 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3023
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3024 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3025 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3026 sn->send_max_data = qc->ctp.initial_max_stream_data_bidi_remote;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3027 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3028 sn->send_max_data = qc->ctp.initial_max_stream_data_bidi_local;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3029 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3030 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3031
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3032 cln = ngx_pool_cleanup_add(pool, 0);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3033 if (cln == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3034 ngx_close_connection(sn->c);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3035 ngx_destroy_pool(pool);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3036 return NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3037 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3038
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3039 cln->handler = ngx_quic_stream_cleanup_handler;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3040 cln->data = sn->c;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3041
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3042 ngx_rbtree_insert(&c->quic->streams.tree, &sn->node);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
3043
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3044 return sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3045 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3046
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
3047
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3048 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3049 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3050 {
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3051 ssize_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3052 ngx_buf_t *b;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3053 ngx_event_t *rev;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3054 ngx_connection_t *pc;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3055 ngx_quic_frame_t *frame;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3056 ngx_quic_stream_t *qs;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3057 ngx_quic_connection_t *qc;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3058
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3059 qs = c->qs;
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3060 b = qs->b;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3061 pc = qs->parent;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3062 qc = pc->quic;
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3063 rev = c->read;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3064
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3065 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3066 "quic stream id 0x%xi recv: eof:%d, avail:%z",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3067 qs->id, rev->pending_eof, b->last - b->pos);
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3068
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3069 if (b->pos == b->last) {
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3070 rev->ready = 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3071
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3072 if (rev->pending_eof) {
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3073 rev->eof = 1;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3074 return 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3075 }
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
3076
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3077 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3078 "quic stream id 0x%xi recv() not ready", qs->id);
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3079 return NGX_AGAIN;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3080 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3081
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3082 len = ngx_min(b->last - b->pos, (ssize_t) size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3083
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3084 ngx_memcpy(buf, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3085
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3086 b->pos += len;
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3087 qc->streams.received += len;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3088
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3089 if (b->pos == b->last) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3090 b->pos = b->start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3091 b->last = b->start;
8294
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
3092 rev->ready = rev->pending_eof;
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3093 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
3094
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3095 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3096 "quic stream id 0x%xi recv: %z of %uz", qs->id, len, size);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3097
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3098 if (!rev->pending_eof) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3099 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3100 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3101 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3102 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3103
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3104 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3105 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3106 frame->u.max_stream_data.id = qs->id;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3107 frame->u.max_stream_data.limit = qs->fs.received + (b->pos - b->start)
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3108 + (b->end - b->last);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3109
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3110 ngx_sprintf(frame->info, "MAX_STREAM_DATA id:%d limit:%d l=%d on recv",
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3111 (int) frame->u.max_stream_data.id,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3112 (int) frame->u.max_stream_data.limit,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3113 frame->level);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3114
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3115 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3116 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3117
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3118 if ((qc->streams.recv_max_data / 2) < qc->streams.received) {
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3119
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3120 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3121
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3122 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3123 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3124 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3125
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3126 qc->streams.recv_max_data *= 2;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3127
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3128 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3129 frame->type = NGX_QUIC_FT_MAX_DATA;
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3130 frame->u.max_data.max_data = qc->streams.recv_max_data;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3131
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3132 ngx_sprintf(frame->info, "MAX_DATA max_data:%d level=%d on recv",
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3133 (int) frame->u.max_data.max_data, frame->level);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3134
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3135 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3136
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3137 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3138 "quic stream id 0x%xi recv: increased max data: %ui",
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3139 qs->id, qc->streams.recv_max_data);
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3140 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
3141
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3142 return len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3143 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3144
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3145
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3146 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3147 ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3148 {
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3149 u_char *p, *end;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3150 size_t fsize, limit, n, len;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3151 uint64_t sent, unacked;
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3152 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3153 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3154 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3155 ngx_quic_connection_t *qc;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3156
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3157 qs = c->qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3158 pc = qs->parent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3159 qc = pc->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3160
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3161 if (qc->closing) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3162 return NGX_ERROR;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3163 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3164
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3165 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3166 "quic stream id 0x%xi send: %uz", qs->id, size);
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3167
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3168 /*
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3169 * we need to fit at least 1 frame into a packet, thus account head/tail;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3170 * 25 = 1 + 8x3 is max header for STREAM frame, with 1 byte for frame type
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3171 */
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3172 limit = qc->ctp.max_packet_size - NGX_QUIC_MAX_SHORT_HEADER - 25
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3173 - EVP_GCM_TLS_TAG_LEN;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3174
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3175 len = size;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3176 sent = c->sent;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3177 unacked = sent - qs->acked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3178
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3179 if (qc->streams.send_max_data == 0) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3180 qc->streams.send_max_data = qc->ctp.initial_max_data;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3181 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3182
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3183 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3184 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3185 "quic send hit buffer size");
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3186 len = 0;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3187
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3188 } else if (unacked + len > NGX_QUIC_STREAM_BUFSIZE) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3189 len = NGX_QUIC_STREAM_BUFSIZE - unacked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3190 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3191
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3192 if (qc->streams.sent >= qc->streams.send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3193 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3194 "quic send hit MAX_DATA");
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3195 len = 0;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3196
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3197 } else if (qc->streams.sent + len > qc->streams.send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3198 len = qc->streams.send_max_data - qc->streams.sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3199 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3200
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3201 if (sent >= qs->send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3202 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3203 "quic send hit MAX_STREAM_DATA");
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3204 len = 0;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3205
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3206 } else if (sent + len > qs->send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3207 len = qs->send_max_data - sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3208 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3209
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3210 p = (u_char *) buf;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3211 end = (u_char *) buf + len;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3212 n = 0;
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3213
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3214 while (p < end) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3215
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3216 fsize = ngx_min(limit, (size_t) (end - p));
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3217
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3218 frame = ngx_quic_alloc_frame(pc, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3219 if (frame == NULL) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3220 return 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3221 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3222
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3223 ngx_memcpy(frame->data, p, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3224
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3225 frame->level = ssl_encryption_application;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3226 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3227 frame->u.stream.off = 1;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3228 frame->u.stream.len = 1;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3229 frame->u.stream.fin = 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3230
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3231 frame->u.stream.type = frame->type;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3232 frame->u.stream.stream_id = qs->id;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3233 frame->u.stream.offset = c->sent;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3234 frame->u.stream.length = fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3235 frame->u.stream.data = frame->data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3236
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3237 c->sent += fsize;
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3238 qc->streams.sent += fsize;
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3239 p += fsize;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3240 n += fsize;
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3241
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3242 ngx_sprintf(frame->info, "stream 0x%xi len=%ui level=%d",
8345
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3243 qs->id, fsize, frame->level);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3244
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8344
diff changeset
3245 ngx_quic_queue_frame(qc, frame);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3246 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3247
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3248 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3249 "quic send %uz of %uz, sent:%O, unacked:%uL",
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
3250 n, size, c->sent, (uint64_t) c->sent - qs->acked);
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3251
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3252 if (n != size) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3253 c->write->ready = 0;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3254 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3255
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3256 if (n == 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3257 return NGX_AGAIN;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3258 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3259
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3260 return n;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3261 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3262
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3263
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3264 static void
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3265 ngx_quic_stream_cleanup_handler(void *data)
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3266 {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3267 ngx_connection_t *c = data;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3268
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3269 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3270 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3271 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3272 ngx_quic_connection_t *qc;
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3273
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3274 qs = c->qs;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3275 pc = qs->parent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3276 qc = pc->quic;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3277
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3278 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3279 "quic stream id 0x%xi cleanup", qs->id);
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3280
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3281 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
8348
d42b50d239f4 Fixed memory leak with reordered stream frames.
Vladimir Homutov <vl@nginx.com>
parents: 8346
diff changeset
3282 ngx_quic_free_frames(pc, &qs->fs.frames);
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3283
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3284 if (qc->closing) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
3285 /* schedule handler call to continue ngx_quic_close_connection() */
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3286 ngx_post_event(pc->read, &ngx_posted_events);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3287 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3288 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
3289
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
3290 if ((qs->id & 0x03) == NGX_QUIC_STREAM_UNIDIRECTIONAL) {
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3291 /* do not send fin for client unidirectional streams */
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3292 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3293 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3294
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3295 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3296 "quic stream id 0x%xi send fin", qs->id);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3297
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3298 frame = ngx_quic_alloc_frame(pc, 0);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3299 if (frame == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3300 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3301 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3302
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3303 frame->level = ssl_encryption_application;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3304 frame->type = NGX_QUIC_FT_STREAM7; /* OFF=1 LEN=1 FIN=1 */
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3305 frame->u.stream.off = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3306 frame->u.stream.len = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3307 frame->u.stream.fin = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3308
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3309 frame->u.stream.type = frame->type;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3310 frame->u.stream.stream_id = qs->id;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3311 frame->u.stream.offset = c->sent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3312 frame->u.stream.length = 0;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3313 frame->u.stream.data = NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3314
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3315 ngx_sprintf(frame->info, "stream 0x%xi fin=1 level=%d",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3316 qs->id, frame->level);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3317
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3318 ngx_quic_queue_frame(qc, frame);
8293
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
3319
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
3320 (void) ngx_quic_output(pc);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3321 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3322
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
3323
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3324 static ngx_chain_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3325 ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3326 off_t limit)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3327 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3328 size_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3329 ssize_t n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3330 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3331
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3332 for ( /* void */; in; in = in->next) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3333 b = in->buf;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3334
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3335 if (!ngx_buf_in_memory(b)) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3336 continue;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3337 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3338
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3339 if (ngx_buf_size(b) == 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3340 continue;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3341 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3342
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3343 len = b->last - b->pos;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3344
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3345 n = ngx_quic_stream_send(c, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3346
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3347 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3348 return NGX_CHAIN_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3349 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3350
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3351 if (n == NGX_AGAIN) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3352 return in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3353 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3354
8350
47dac6e0521a Fixed QUIC buffer consumption in send_chain().
Roman Arutyunyan <arut@nginx.com>
parents: 8348
diff changeset
3355 b->pos += n;
47dac6e0521a Fixed QUIC buffer consumption in send_chain().
Roman Arutyunyan <arut@nginx.com>
parents: 8348
diff changeset
3356
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3357 if (n != (ssize_t) len) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3358 return in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3359 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3360 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3361
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3362 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
3363 }
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3364
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3365
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3366 static ngx_quic_frame_t *
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3367 ngx_quic_alloc_frame(ngx_connection_t *c, size_t size)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3368 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3369 u_char *p;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3370 ngx_queue_t *q;
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3371 ngx_quic_frame_t *frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3372 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3373
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3374 if (size) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3375 p = ngx_alloc(size, c->log);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3376 if (p == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3377 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3378 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3379
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3380 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3381 p = NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3382 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3383
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3384 qc = c->quic;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3385
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3386 if (!ngx_queue_empty(&qc->free_frames)) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3387
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3388 q = ngx_queue_head(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3389 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3390
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3391 ngx_queue_remove(&frame->queue);
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3392
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3393 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3394 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3395 "quic reuse frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3396 #endif
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3397
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3398 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3399 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3400 if (frame == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3401 ngx_free(p);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3402 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3403 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3404
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3405 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3406 ++qc->nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3407 #endif
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3408
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3409 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3410 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3411 "quic alloc frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3412 #endif
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3413 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3414
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3415 ngx_memzero(frame, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3416
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3417 frame->data = p;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3418
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3419 return frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3420 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3421
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3422
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3423 static void
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3424 ngx_quic_congestion_ack(ngx_connection_t *c, ngx_quic_frame_t *f)
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3425 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3426 ssize_t n;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3427 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3428 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3429 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3430
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3431 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3432 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3433
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3434 n = ngx_quic_create_frame(NULL, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3435
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3436 cg->in_flight -= n;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3437
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3438 timer = f->last - cg->recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3439
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3440 if ((ngx_msec_int_t) timer <= 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3441 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3442 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3443
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3444 if (cg->window < cg->ssthresh) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3445 cg->window += n;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3446
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3447 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3448 "quic congestion slow start win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3449 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3450
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3451 } else {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3452 cg->window += qc->tp.max_packet_size * n / cg->window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3453
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3454 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3455 "quic congestion avoidance win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3456 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3457 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3458
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3459 /* prevent recovery_start from wrapping */
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3460
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3461 timer = cg->recovery_start - ngx_current_msec + qc->tp.max_idle_timeout * 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3462
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3463 if ((ngx_msec_int_t) timer < 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3464 cg->recovery_start = ngx_current_msec - qc->tp.max_idle_timeout * 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3465 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3466 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3467
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3468
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3469 static void
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3470 ngx_quic_congestion_lost(ngx_connection_t *c, ngx_msec_t sent)
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3471 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3472 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3473 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3474 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3475
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3476 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3477 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3478
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3479 timer = sent - cg->recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3480
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3481 if ((ngx_msec_int_t) timer <= 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3482 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3483 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3484
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3485 cg->recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3486 cg->window /= 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3487
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3488 if (cg->window < qc->tp.max_packet_size * 2) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3489 cg->window = qc->tp.max_packet_size * 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3490 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3491
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3492 cg->ssthresh = cg->window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3493
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3494 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3495 "quic congestion lost win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3496 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3497 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3498
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3499
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
3500 static void
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3501 ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3502 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3503 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3504
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3505 qc = c->quic;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3506
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3507 if (frame->data) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3508 ngx_free(frame->data);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3509 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3510
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
3511 ngx_queue_insert_head(&qc->free_frames, &frame->queue);
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3512
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3513 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3514 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3515 "quic free frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
3516 #endif
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3517 }