annotate src/event/ngx_event_quic.c @ 8338:0f9e9786b90d quic

Added primitive flow control mechanisms. + MAX_STREAM_DATA frame is sent when recv() is performed on stream The new value is a sum of total bytes received by stream + free space in a buffer; The sending of MAX_STREM_DATA frame in response to STREAM_DATA_BLOCKED frame is adjusted to follow the same logic as above. + MAX_DATA frame is sent when total amount of received data is 2x of current limit. The limit is doubled. + Default values of transport parameters are adjusted to more meaningful values: initial stream limits are set to quic buffer size instead of unrealistically small 255. initial max data is decreased to 16 buffer sizes, in an assumption that this is enough for a relatively short connection, instead of randomly chosen big number. All this allows to initiate a stable flow of streams that does not block on stream/connection limits (tested with FF 77.0a1 and 100K requests)
author Vladimir Homutov <vl@nginx.com>
date Wed, 15 Apr 2020 18:54:03 +0300
parents ab443e80d9e4
children aba84d9ab256
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
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
51 uint64_t total_received;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
52 uint64_t max_data;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
53 } ngx_quic_streams_t;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
54
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
55
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
56 /*
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
57 * 12.3. Packet Numbers
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
58 *
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
59 * 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
60 * 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
61 * 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
62 * are also Initial packets.
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
63 */
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
64 typedef struct {
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
65 ngx_quic_secret_t client_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
66 ngx_quic_secret_t server_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
67
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
68 uint64_t pnum;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
69 uint64_t largest_ack; /* number received from peer */
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
70
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
71 ngx_queue_t frames;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
72 ngx_queue_t sent;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
73 } ngx_quic_send_ctx_t;
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
74
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
75
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
76 struct ngx_quic_connection_s {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
77 ngx_str_t scid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
78 ngx_str_t dcid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
79 ngx_str_t token;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
80
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
81 ngx_uint_t client_tp_done;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
82 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
83 ngx_quic_tp_t ctp;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
84
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
85 ngx_quic_state_t state;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
86
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
87 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
88 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
89 ngx_quic_secrets_t next_key;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
90 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
91
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
92 ngx_ssl_t *ssl;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
93
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
94 ngx_event_t push;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
95 ngx_event_t retry;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
96 ngx_queue_t free_frames;
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
97
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
98 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
99 ngx_uint_t nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
100 #endif
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
101
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
102 ngx_quic_streams_t streams;
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
103 ngx_uint_t max_data;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
104
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
105 uint64_t cur_streams;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
106 uint64_t max_streams;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
107
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
108 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
109 unsigned closing:1;
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
110 unsigned key_phase:1;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
111 };
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
112
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
113
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
114 typedef ngx_int_t (*ngx_quic_frame_handler_pt)(ngx_connection_t *c,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
115 ngx_quic_frame_t *frame);
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
116
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
117
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
118 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
119 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
120 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
121 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
122 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
123 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
124 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
125 #else
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
126 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
127 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
128 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
129 #endif
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
130
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
131 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
132 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
133 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
134 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
135 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
136
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
137
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
138 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
139 ngx_quic_tp_t *tp, ngx_quic_header_t *pkt,
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
140 ngx_connection_handler_pt handler);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
141 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
142 static void ngx_quic_input_handler(ngx_event_t *rev);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
143 static void ngx_quic_close_connection(ngx_connection_t *c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
144
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
145 static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
146 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
147 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
148 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
149 ngx_quic_header_t *pkt);
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
150 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
151 ngx_quic_header_t *pkt);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
152 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
153 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
154 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
155 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
156
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
157 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
158 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
159 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
160 ngx_quic_send_ctx_t *ctx, uint64_t min, uint64_t max);
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
161
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
162 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
163 ngx_quic_frames_stream_t *fs, ngx_quic_frame_t *frame,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
164 ngx_quic_frame_handler_pt handler);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
165 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
166 ngx_quic_frame_t *f, uint64_t offset_in);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
167 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
168 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
169
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
170 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
171 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
172 static ngx_int_t ngx_quic_crypto_input(ngx_connection_t *c,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
173 ngx_quic_frame_t *frame);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
174 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
175 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
176 static ngx_int_t ngx_quic_stream_input(ngx_connection_t *c,
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
177 ngx_quic_frame_t *frame);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
178
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
179 static ngx_int_t ngx_quic_handle_max_streams(ngx_connection_t *c);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
180 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
181 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
182 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
183 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
184
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
185 static void ngx_quic_queue_frame(ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
186 ngx_quic_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
187
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
188 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
189 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
190 ngx_quic_send_ctx_t *ctx);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
191 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
192 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
193
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
194 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
195 ngx_quic_send_ctx_t *ctx);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
196 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
197 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
198 ngx_quic_send_ctx_t *ctx, ngx_msec_t *waitp);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
199 static void ngx_quic_push_handler(ngx_event_t *ev);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
200
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
201 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
202 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
203 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
204 uint64_t id);
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
205 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
206 uint64_t id, size_t rcvbuf_size);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
207 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
208 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
209 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
210 size_t size);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
211 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
212 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
213 ngx_chain_t *in, off_t limit);
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
214 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
215 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
216
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
217
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
218 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
219 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
220 ngx_quic_set_read_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
221 ngx_quic_set_write_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
222 #else
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
223 ngx_quic_set_encryption_secrets,
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
224 #endif
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
225 ngx_quic_add_handshake_data,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
226 ngx_quic_flush_flight,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
227 ngx_quic_send_alert,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
228 };
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
229
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
230
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
231 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
232
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
233 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
234 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
235 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
236 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
237 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
238 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
239 ngx_quic_secrets_t *keys;
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
240
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
241 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
242
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
243 ngx_quic_hexdump(c->log, "level:%d read secret",
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
244 rsecret, secret_len, level);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
245
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
246 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
247
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
248 if (level == ssl_encryption_early_data) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
249 c->quic->state = NGX_QUIC_ST_EARLY_DATA;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
250 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
251
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
252 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
253 rsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
254 &keys->client);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
255 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
256
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
257
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
258 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
259 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
260 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
261 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
262 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
263 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
264 ngx_quic_secrets_t *keys;
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
265
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
266 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
267
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
268 ngx_quic_hexdump(c->log, "level:%d write secret",
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
269 wsecret, secret_len, level);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
270
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
271 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
272
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
273 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
274 wsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
275 &keys->server);
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
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
278 #else
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
279
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
280 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
281 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
282 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
283 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
284 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
285 ngx_int_t rc;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
286 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
287 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
288
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
289 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
290
8222
bec4cd55361e Fixed a typo with OpenSSL.
Vladimir Homutov <vl@nginx.com>
parents: 8221
diff changeset
291 ngx_quic_hexdump(c->log, "level:%d read", rsecret, secret_len, level);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
292
8327
0ae50d90658a Fixed build with OpenSSL using old callbacks API.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8326
diff changeset
293 keys = &c->quic->keys[level];
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
294
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
295 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
296 rsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
297 &keys->client);
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
298 if (rc != 1) {
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
299 return rc;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
300 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
301
8303
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
302 if (level == ssl_encryption_early_data) {
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
303 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
304 return 1;
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
305 }
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
306
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
307 ngx_quic_hexdump(c->log, "level:%d write", wsecret, secret_len, level);
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8302
diff changeset
308
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
309 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
310 wsecret, secret_len,
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
311 &keys->server);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
312 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
313
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
314 #endif
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
315
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
316
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
317 static int
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
318 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
319 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
320 {
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
321 u_char *p, *end;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
322 size_t client_params_len;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
323 const uint8_t *client_params;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
324 ngx_quic_frame_t *frame;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
325 ngx_connection_t *c;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
326 ngx_quic_connection_t *qc;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
327 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
328
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
329 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
330 qc = c->quic;
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
331
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
332 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
333 "ngx_quic_add_handshake_data");
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
334
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
335 /* XXX: obtain client parameters after the handshake? */
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
336 if (!qc->client_tp_done) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
337
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
338 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
339 &client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
340
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
341 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
342 "SSL_get_peer_quic_transport_params(): params_len %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
343 client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
344
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
345 if (client_params_len != 0) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
346 p = (u_char *) client_params;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
347 end = p + client_params_len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
348
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
349 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
350 != NGX_OK)
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
351 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
352 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
353 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
354
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
355 if (qc->ctp.max_idle_timeout > 0
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
356 && 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
357 {
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
358 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
359 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
360
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
361 qc->client_tp_done = 1;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
362 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
363 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
364
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
365 fs = &qc->crypto[level];
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
366
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
367 frame = ngx_quic_alloc_frame(c, len);
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
368 if (frame == NULL) {
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
369 return 0;
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
370 }
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
371
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
372 ngx_memcpy(frame->data, data, len);
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
373
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
374 frame->level = level;
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
375 frame->type = NGX_QUIC_FT_CRYPTO;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
376 frame->u.crypto.offset += fs->sent;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
377 frame->u.crypto.length = len;
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
378 frame->u.crypto.data = frame->data;
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
379
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
380 fs->sent += len;
8259
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
381
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
382 ngx_sprintf(frame->info, "crypto, generated by SSL len=%ui level=%d", len, level);
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
383
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
384 ngx_quic_queue_frame(qc, frame);
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
385
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
386 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
387 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
388
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
389
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
390 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
391 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
392 {
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
393 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
394
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
395 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
396
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
397 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "ngx_quic_flush_flight()");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
398
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
399 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
400 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
401
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
402
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
403 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
404 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
405 uint8_t alert)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
406 {
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
407 ngx_connection_t *c;
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
408 ngx_quic_frame_t *frame;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
409
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
410 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
411
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
412 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
413 "ngx_quic_send_alert(), lvl=%d, alert=%d",
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
414 (int) level, (int) alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
415
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
416 frame = ngx_quic_alloc_frame(c, 0);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
417 if (frame == NULL) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
418 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
419 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
420
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
421 frame->level = level;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
422 frame->type = NGX_QUIC_FT_CONNECTION_CLOSE;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
423 frame->u.close.error_code = 0x100 + alert;
8305
e35f824f644d Added missing debug description.
Vladimir Homutov <vl@nginx.com>
parents: 8304
diff changeset
424 ngx_sprintf(frame->info, "cc from send_alert level=%d", frame->level);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
425
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
426 ngx_quic_queue_frame(c->quic, frame);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
427
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
428 if (ngx_quic_output(c) != NGX_OK) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
429 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
430 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
431
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
432 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
433 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
434
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
435
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
436 void
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
437 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
438 ngx_connection_handler_pt handler)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
439 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
440 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
441 ngx_quic_header_t pkt;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
442
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
443 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
444
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
445 c->log->action = "QUIC initialization";
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
446
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
447 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
448
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
449 b = c->buffer;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
450
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
451 pkt.log = c->log;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
452 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
453 pkt.data = b->start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
454 pkt.len = b->last - b->start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
455
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
456 if (ngx_quic_new_connection(c, ssl, tp, &pkt, handler) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
457 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
458 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
459 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
460
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
461 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
462
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
463 c->read->handler = ngx_quic_input_handler;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
464
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
465 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
466 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
467
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
468
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
469 static ngx_int_t
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
470 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
471 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
472 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
473 ngx_uint_t i;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
474 ngx_quic_tp_t *ctp;
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
475 ngx_quic_secrets_t *keys;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
476 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
477 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
478
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
479 if (ngx_buf_size(pkt->raw) < 1200) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
480 ngx_log_error(NGX_LOG_INFO, c->log, 0, "too small UDP datagram");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
481 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
482 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
483
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
484 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
485 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
486 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
487
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
488 if (!ngx_quic_pkt_in(pkt->flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
489 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
490 "invalid initial packet: 0x%xi", pkt->flags);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
491 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
492 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
493
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
494 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
495 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
496 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
497
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
498 c->log->action = "creating new quic connection";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
499
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
500 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
501 if (qc == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
502 return NGX_ERROR;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
503 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
504
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
505 qc->state = NGX_QUIC_ST_INITIAL;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
506
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
507 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
508 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
509
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
510 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
511 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
512 ngx_queue_init(&qc->send_ctx[i].sent);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
513 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
514
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
515 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
516 ngx_queue_init(&qc->crypto[i].frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
517 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
518
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
519 ngx_queue_init(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
520
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
521 qc->retry.log = c->log;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
522 qc->retry.data = c;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
523 qc->retry.handler = ngx_quic_retransmit_handler;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
524 qc->retry.cancelable = 1;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
525
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
526 qc->push.log = c->log;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
527 qc->push.data = c;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
528 qc->push.handler = ngx_quic_push_handler;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
529 qc->push.cancelable = 1;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
530
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
531 c->quic = qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
532 qc->ssl = ssl;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
533 qc->tp = *tp;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
534 qc->streams.handler = handler;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
535
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
536 ctp = &qc->ctp;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
537 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
538 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
539 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
540
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
541 qc->streams.max_data = qc->tp.initial_max_data;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
542
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
543 qc->dcid.len = pkt->dcid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
544 qc->dcid.data = ngx_pnalloc(c->pool, pkt->dcid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
545 if (qc->dcid.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
546 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
547 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
548 ngx_memcpy(qc->dcid.data, pkt->dcid.data, qc->dcid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
549
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
550 qc->scid.len = pkt->scid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
551 qc->scid.data = ngx_pnalloc(c->pool, qc->scid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
552 if (qc->scid.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
553 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
554 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
555 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
556
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
557 qc->token.len = pkt->token.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
558 qc->token.data = ngx_pnalloc(c->pool, qc->token.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
559 if (qc->token.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
560 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
561 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
562 ngx_memcpy(qc->token.data, pkt->token.data, qc->token.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
563
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
564 keys = &c->quic->keys[ssl_encryption_initial];
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
565
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
566 if (ngx_quic_set_initial_secret(c->pool, &keys->client, &keys->server,
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
567 &qc->dcid)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
568 != NGX_OK)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
569 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
570 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
571 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
572
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
573 pkt->secret = &keys->client;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
574 pkt->level = ssl_encryption_initial;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
575 pkt->plaintext = buf;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
576
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
577 if (ngx_quic_decrypt(pkt, NULL) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
578 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
579 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
580
8320
6e1213ef469a Rejecting new connections with non-zero Initial packet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8319
diff changeset
581 if (pkt->pn != 0) {
6e1213ef469a Rejecting new connections with non-zero Initial packet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8319
diff changeset
582 ngx_log_error(NGX_LOG_INFO, c->log, 0,
6e1213ef469a Rejecting new connections with non-zero Initial packet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8319
diff changeset
583 "invalid initial packet number %L", pkt->pn);
6e1213ef469a Rejecting new connections with non-zero Initial packet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8319
diff changeset
584 return NGX_ERROR;
6e1213ef469a Rejecting new connections with non-zero Initial packet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8319
diff changeset
585 }
6e1213ef469a Rejecting new connections with non-zero Initial packet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8319
diff changeset
586
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
587 if (ngx_quic_init_connection(c) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
588 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
589 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
590
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
591 if (ngx_quic_payload_handler(c, pkt) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
592 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
593 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
594
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
595 /* pos is at header end, adjust by actual packet length */
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
596 pkt->raw->pos += pkt->len;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
597
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
598 return ngx_quic_input(c, pkt->raw);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
599 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
600
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
601
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
602 static ngx_int_t
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
603 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
604 {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
605 int n, sslerr;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
606 u_char *p;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
607 ssize_t len;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
608 ngx_ssl_conn_t *ssl_conn;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
609 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
610
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
611 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
612
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
613 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
614 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
615 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
616
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
617 ssl_conn = c->ssl->connection;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
618
8232
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
619 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
620 ngx_log_error(NGX_LOG_INFO, c->log, 0,
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
621 "SSL_set_quic_method() failed");
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
622 return NGX_ERROR;
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
623 }
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
624
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
625 #ifdef SSL_READ_EARLY_DATA_SUCCESS
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
626 if (SSL_CTX_get_max_early_data(qc->ssl->ctx)) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
627 SSL_set_quic_early_data_enabled(ssl_conn, 1);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
628 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
629 #endif
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
630
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
631 len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
632 /* always succeeds */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
633
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
634 p = ngx_pnalloc(c->pool, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
635 if (p == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
636 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
637 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
638
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
639 len = ngx_quic_create_transport_params(p, p + len, &qc->tp);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
640 if (len < 0) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
641 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
642 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
643
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
644 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
645 ngx_log_error(NGX_LOG_INFO, c->log, 0,
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
646 "SSL_set_quic_transport_params() failed");
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
647 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
648 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
649
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
650 qc->max_streams = qc->tp.initial_max_streams_bidi;
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
651 qc->state = NGX_QUIC_ST_HANDSHAKE;
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
652
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
653 n = SSL_do_handshake(ssl_conn);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
654
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
655 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
656
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
657 if (n == -1) {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
658 sslerr = SSL_get_error(ssl_conn, n);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
659
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
660 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d",
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
661 sslerr);
8300
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
662
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
663 if (sslerr != SSL_ERROR_WANT_READ) {
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
664 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
665 return NGX_ERROR;
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
666 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
667 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
668
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
669 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
670 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
671 (int) SSL_quic_read_level(ssl_conn),
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
672 (int) SSL_quic_write_level(ssl_conn));
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 return NGX_OK;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
675 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
676
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
677
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
678 static void
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
679 ngx_quic_input_handler(ngx_event_t *rev)
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
680 {
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
681 ssize_t n;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
682 ngx_buf_t b;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
683 ngx_connection_t *c;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
684 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
685 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
686
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
687 b.start = buf;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
688 b.end = buf + sizeof(buf);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
689 b.pos = b.last = b.start;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
690
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
691 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
692 qc = c->quic;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
693
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
694 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
695
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
696 if (qc->closing) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
697 ngx_quic_close_connection(c);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
698 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
699 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
700
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
701 if (rev->timedout) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
702 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
703 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
704 return;
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
705 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
706
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
707 if (c->close) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
708 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
709 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
710 }
8220
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8218
diff changeset
711
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
712 n = c->recv(c, b.start, b.end - b.start);
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 8214
diff changeset
713
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
714 if (n == NGX_AGAIN) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
715 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
716 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
717
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
718 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
719 c->read->eof = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
720 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
721 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
722 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
723
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
724 b.last += n;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
725
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
726 if (ngx_quic_input(c, &b) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
727 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
728 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
729 }
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
730
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
731 qc->send_timer_set = 0;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
732 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
733 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
734
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
735
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
736 static void
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
737 ngx_quic_close_connection(ngx_connection_t *c)
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
738 {
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
739 #if (NGX_DEBUG)
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
740 ngx_uint_t ns;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
741 #endif
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
742 ngx_uint_t i;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
743 ngx_pool_t *pool;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
744 ngx_event_t *rev;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
745 ngx_rbtree_t *tree;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
746 ngx_rbtree_node_t *node;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
747 ngx_quic_stream_t *qs;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
748 ngx_quic_connection_t *qc;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
749
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
750 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "close quic connection");
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
751
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
752 qc = c->quic;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
753
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
754 if (qc) {
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
755
8322
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
756 qc->closing = 1;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
757 tree = &qc->streams.tree;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
758
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
759 if (tree->root != tree->sentinel) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
760 if (c->read->timer_set) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
761 ngx_del_timer(c->read);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
762 }
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
763
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
764 #if (NGX_DEBUG)
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
765 ns = 0;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
766 #endif
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
767
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
768 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
769 node;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
770 node = ngx_rbtree_next(tree, node))
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
771 {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
772 qs = (ngx_quic_stream_t *) node;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
773
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
774 rev = qs->c->read;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
775 rev->ready = 1;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
776 rev->pending_eof = 1;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
777
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
778 ngx_post_event(rev, &ngx_posted_events);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
779
8322
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
780 if (rev->timer_set) {
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
781 ngx_del_timer(rev);
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
782 }
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
783
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
784 #if (NGX_DEBUG)
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
785 ns++;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
786 #endif
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
787 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
788
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
789 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
790 "quic connection has %ui active streams", ns);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
791
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
792 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
793 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
794
8336
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
795 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
796 ngx_quic_free_frames(c, &qc->crypto[i].frames);
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
797 }
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
798
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
799 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
800 ngx_quic_free_frames(c, &qc->send_ctx[i].frames);
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
801 ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
802 }
739f018225af Free remaining frames on connection close.
Vladimir Homutov <vl@nginx.com>
parents: 8335
diff changeset
803
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
804 if (qc->push.timer_set) {
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
805 ngx_del_timer(&qc->push);
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
806 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
807
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
808 if (qc->retry.timer_set) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
809 ngx_del_timer(&qc->retry);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
810 }
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
811 }
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
812
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
813 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
814 (void) ngx_ssl_shutdown(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
815 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
816
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
817 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
818 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
819 #endif
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
820
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
821 c->destroyed = 1;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
822
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
823 pool = c->pool;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
824
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
825 ngx_close_connection(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
826
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
827 ngx_destroy_pool(pool);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
828 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
829
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
830
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
831 static ngx_int_t
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
832 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
833 {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
834 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
835 ngx_int_t rc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
836 ngx_quic_header_t pkt;
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
837
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
838 p = b->pos;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
839
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
840 while (p < b->last) {
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
841 c->log->action = "processing quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
842
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
843 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
844 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
845 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
846 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
847 pkt.log = c->log;
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
848 pkt.flags = p[0];
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
849
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
850 if (pkt.flags == 0) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
851 /* XXX: no idea WTF is this, just ignore */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
852 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "FIREFOX: ZEROES");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
853 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
854 }
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
855
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
856 // TODO: check current state
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
857 if (ngx_quic_long_pkt(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
858
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
859 if (ngx_quic_pkt_in(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
860 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
861
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
862 } else if (ngx_quic_pkt_hs(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
863 rc = ngx_quic_handshake_input(c, &pkt);
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
864
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
865 } else if (ngx_quic_pkt_zrtt(pkt.flags)) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
866 rc = ngx_quic_early_input(c, &pkt);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
867
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
868 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
869 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
870 "BUG: unknown quic state");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
871 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
872 }
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
873
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
874 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
875 rc = ngx_quic_app_input(c, &pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
876 }
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
877
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
878 if (rc == NGX_ERROR) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
879 return NGX_ERROR;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
880 }
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
881
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
882 /* NGX_OK || NGX_DECLINED */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
883
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
884 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
885 * 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
886 * to decrypt packet.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
887 * 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
888 * retransmission:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
889 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
890 * 12.2. Coalescing Packets:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
891 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
892 * For example, if decryption fails (because the keys are
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
893 * not available or any other reason), the receiver MAY either
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
894 * discard or buffer the packet for later processing and MUST
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
895 * attempt to process the remaining packets.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
896 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
897
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
898 /* b->pos is at header end, adjust by actual packet length */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
899 p = b->pos + pkt.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
900 b->pos = p; /* reset b->pos to the next packet start */
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
901 }
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
902
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
903 return NGX_OK;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
904 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
905
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
906
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
907 static ngx_int_t
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
908 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
909 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
910 ngx_ssl_conn_t *ssl_conn;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
911 ngx_quic_secrets_t *keys;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
912 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
913
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
914 c->log->action = "processing initial quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
915
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
916 ssl_conn = c->ssl->connection;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
917
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
918 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
919 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
920 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
921
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
922 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
923 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
924 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
925
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
926 keys = &c->quic->keys[ssl_encryption_initial];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
927
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
928 pkt->secret = &keys->client;
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
929 pkt->level = ssl_encryption_initial;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
930 pkt->plaintext = buf;
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
931
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
932 if (ngx_quic_decrypt(pkt, ssl_conn) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
933 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
934 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
935
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
936 return ngx_quic_payload_handler(c, pkt);
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
937 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
938
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
939
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
940 static ngx_int_t
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
941 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
942 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
943 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
944 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
945 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
946
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
947 c->log->action = "processing handshake quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
948
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
949 qc = c->quic;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
950
8321
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
951 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
952
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
953 if (keys->client.key.len == 0) {
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
954 ngx_log_error(NGX_LOG_INFO, c->log, 0,
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
955 "no read keys yet, packet ignored");
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
956 return NGX_DECLINED;
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
957 }
e45719a9b148 Discarding Handshake packets if no Handshake keys yet.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8320
diff changeset
958
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
959 /* 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
960 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
961 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
962 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
963
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
964 if (pkt->dcid.len != qc->dcid.len) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
965 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcidl");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
966 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
967 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
968
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
969 if (ngx_memcmp(pkt->dcid.data, qc->dcid.data, qc->dcid.len) != 0) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
970 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcid");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
971 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
972 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
973
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
974 if (pkt->scid.len != qc->scid.len) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
975 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic scidl");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
976 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
977 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
978
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
979 if (ngx_memcmp(pkt->scid.data, qc->scid.data, qc->scid.len) != 0) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
980 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic scid");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
981 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
982 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
983
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
984 if (!ngx_quic_pkt_hs(pkt->flags)) {
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
985 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
986 "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
987 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
988 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
989
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
990 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
991 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
992 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
993
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
994 pkt->secret = &keys->client;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
995 pkt->level = ssl_encryption_handshake;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
996 pkt->plaintext = buf;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
997
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
998 if (ngx_quic_decrypt(pkt, c->ssl->connection) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
999 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1000 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1001
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1002 return ngx_quic_payload_handler(c, pkt);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1003 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1004
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1005
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1006 static ngx_int_t
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1007 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
1008 {
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1009 ngx_quic_secrets_t *keys;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1010 ngx_quic_connection_t *qc;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1011 static u_char buf[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1012
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1013 c->log->action = "processing early data quic packet";
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1014
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1015 qc = c->quic;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1016
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1017 /* extract cleartext data into pkt */
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1018 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1019 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1020 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1021
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1022 if (pkt->dcid.len != qc->dcid.len) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1023 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcidl");
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1024 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1025 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1026
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1027 if (ngx_memcmp(pkt->dcid.data, qc->dcid.data, qc->dcid.len) != 0) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1028 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcid");
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1029 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1030 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1031
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1032 if (pkt->scid.len != qc->scid.len) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1033 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic scidl");
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1034 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1035 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1036
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1037 if (ngx_memcmp(pkt->scid.data, qc->scid.data, qc->scid.len) != 0) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1038 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic scid");
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1039 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1040 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1041
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1042 if (!ngx_quic_pkt_zrtt(pkt->flags)) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1043 ngx_log_error(NGX_LOG_INFO, c->log, 0,
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1044 "invalid packet type: 0x%xi", pkt->flags);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1045 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1046 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1047
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1048 if (ngx_quic_parse_handshake_header(pkt) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1049 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1050 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1051
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1052 if (c->quic->state != NGX_QUIC_ST_EARLY_DATA) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1053 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected 0-RTT packet");
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1054 return NGX_OK;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1055 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1056
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1057 keys = &c->quic->keys[ssl_encryption_early_data];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1058
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1059 pkt->secret = &keys->client;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1060 pkt->level = ssl_encryption_early_data;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1061 pkt->plaintext = buf;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1062
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1063 if (ngx_quic_decrypt(pkt, c->ssl->connection) != NGX_OK) {
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1064 return NGX_ERROR;
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1065 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1066
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1067 return ngx_quic_payload_handler(c, pkt);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1068 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1069
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1070
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1071 static ngx_int_t
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1072 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
1073 {
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1074 ngx_int_t rc;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1075 ngx_quic_secrets_t *keys, *next, tmp;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1076 ngx_quic_connection_t *qc;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1077 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
1078
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1079 c->log->action = "processing application data quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1080
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1081 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1082
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1083 keys = &c->quic->keys[ssl_encryption_application];
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1084 next = &c->quic->next_key;
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1085
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1086 if (keys->client.key.len == 0) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1087 ngx_log_error(NGX_LOG_INFO, c->log, 0,
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1088 "no read keys yet, packet ignored");
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1089 return NGX_DECLINED;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1090 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1091
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
1092 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
1093 return NGX_ERROR;
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1094 }
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1095
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
1096 pkt->secret = &keys->client;
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1097 pkt->next = &next->client;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1098 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
1099 pkt->level = ssl_encryption_application;
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1100 pkt->plaintext = buf;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
1101
8288
ebd5c71b9f02 Got rid of memory allocation in decryption.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1102 if (ngx_quic_decrypt(pkt, c->ssl->connection) != NGX_OK) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
1103 return NGX_ERROR;
8185
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1104 }
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
1105
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1106 /* switch keys on Key Phase change */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1107
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1108 if (pkt->key_update) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1109 c->quic->key_phase ^= 1;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1110
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1111 tmp = *keys;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1112 *keys = *next;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1113 *next = tmp;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1114 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1115
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1116 rc = ngx_quic_payload_handler(c, pkt);
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1117
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1118 if (rc == NGX_ERROR) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1119 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1120 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1121
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1122 /* generate next keys */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1123
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1124 if (pkt->key_update) {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1125 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
1126 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1127 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1128 }
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1129
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1130 return rc;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1131 }
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1132
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1133
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1134 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1135 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
1136 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1137 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1138 ssize_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1139 ngx_uint_t ack_this, do_close;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1140 ngx_quic_frame_t frame, *ack_frame;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1141 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1142
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1143
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1144 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1145
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1146 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1147 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1148
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1149 ack_this = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1150 do_close = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1151
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1152 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1153
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1154 c->log->action = "parsing frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1155
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1156 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
1157
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1158 if (len == NGX_DECLINED) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1159 /* TODO: handle protocol violation:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1160 * such frame not allowed in this packet
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1161 */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1162 return NGX_ERROR;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1163 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1164
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1165 if (len < 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1166 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1167 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1168
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1169 c->log->action = "handling frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1170
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1171 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1172
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1173 switch (frame.type) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1174
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1175 case NGX_QUIC_FT_ACK:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1176 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
1177 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1178 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1179
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1180 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1181
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1182 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1183
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1184 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
1185 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1186 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1187
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1188 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1189 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1190
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1191 case NGX_QUIC_FT_PADDING:
8325
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1192 /* no action required */
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1193 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1194
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1195 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1196 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1197 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1198
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1199 case NGX_QUIC_FT_CONNECTION_CLOSE:
8258
80d7144b1c38 Closing connection on NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8252
diff changeset
1200 case NGX_QUIC_FT_CONNECTION_CLOSE2:
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1201 do_close = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1202 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1203
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1204 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1205 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1206 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1207 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1208 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1209 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1210 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1211 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1212
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1213 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
1214 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1215 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1216
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1217 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1218 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1219
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1220 case NGX_QUIC_FT_MAX_DATA:
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1221 c->quic->max_data = frame.u.max_data.max_data;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1222 ack_this = 1;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1223 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1224
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1225 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1226 case NGX_QUIC_FT_STREAMS_BLOCKED2:
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1227
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1228 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
1229 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1230 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1231 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1232 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1233 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1234
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1235 ack_this = 1;
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1236 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1237
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1238 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
1239
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1240 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
1241 &frame.u.stream_data_blocked)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1242 != NGX_OK)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1243 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1244 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1245 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1246
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1247 ack_this = 1;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1248 break;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1249
8325
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1250 case NGX_QUIC_FT_NEW_CONNECTION_ID:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1251 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1252 case NGX_QUIC_FT_NEW_TOKEN:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1253 case NGX_QUIC_FT_RESET_STREAM:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1254 case NGX_QUIC_FT_STOP_SENDING:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1255 case NGX_QUIC_FT_PATH_CHALLENGE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1256 case NGX_QUIC_FT_PATH_RESPONSE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1257
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1258 /* TODO: handle */
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1259 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1260 "frame handler not implemented");
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1261 ack_this = 1;
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1262 break;
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1263
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1264 default:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1265 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1266 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1267 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1268
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1269 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1270 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1271 "trailing garbage in payload: %ui bytes", end - p);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1272 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1273 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1274
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1275 if (do_close) {
8267
a8349cc72c64 Avoid using QUIC connection after CONNECTION_CLOSE.
Roman Arutyunyan <arut@nginx.com>
parents: 8266
diff changeset
1276 return NGX_DONE;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1277 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1278
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1279 if (ack_this == 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1280 /* do not ack packets with ACKs and PADDING */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1281 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1282 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1283
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1284 c->log->action = "generating acknowledgment";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1285
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1286 // packet processed, ACK it now if required
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1287 // TODO: if (ack_required) ... - currently just ack each packet
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1288
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
1289 ack_frame = ngx_quic_alloc_frame(c, 0);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1290 if (ack_frame == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1291 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1292 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1293
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
1294 ack_frame->level = (pkt->level == ssl_encryption_early_data)
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
1295 ? ssl_encryption_application
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
1296 : pkt->level;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
1297
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1298 ack_frame->type = NGX_QUIC_FT_ACK;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1299 ack_frame->u.ack.largest = pkt->pn;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1300 /* only ack immediate packet ]*/
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1301 ack_frame->u.ack.first_range = 0;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1302
8307
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 8306
diff changeset
1303 ngx_sprintf(ack_frame->info, "ACK for PN=%d from frame handler level=%d", pkt->pn, ack_frame->level);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1304 ngx_quic_queue_frame(qc, ack_frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1305
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1306 // TODO: call output() after processing some special frames?
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1307 return NGX_OK;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1308 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1309
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1310
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1311 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1312 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
1313 ngx_quic_ack_frame_t *ack)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1314 {
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1315 ssize_t n;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1316 u_char *pos, *end;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1317 uint64_t gap, range;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1318 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
1319 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
1320
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1321 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
1322
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1323 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1324 "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
1325
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1326 /*
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1327 * TODO: If any computed packet number is negative, an endpoint MUST
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1328 * generate a connection error of type FRAME_ENCODING_ERROR.
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1329 * (19.3.1)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1330 */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1331
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1332 if (ack->first_range > ack->largest) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1333 ngx_log_error(NGX_LOG_INFO, c->log, 0,
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1334 "invalid first range in ack frame");
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1335 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1336 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1337
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1338 min = ack->largest - ack->first_range;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1339 max = ack->largest;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1340
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1341 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
1342 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1343 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1344
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1345 /* 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
1346 if (ctx->largest_ack < max) {
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1347 ctx->largest_ack = max;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1348 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1349 "updated largest received: %ui", max);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1350 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1351
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1352 pos = ack->ranges_start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1353 end = ack->ranges_end;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1354
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1355 for (i = 0; i < ack->range_count; i++) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1356
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1357 n = ngx_quic_parse_ack_range(pkt, pos, end, &gap, &range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1358 if (n == NGX_ERROR) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1359 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1360 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1361 pos += n;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1362
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1363 if (gap >= min) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1364 ngx_log_error(NGX_LOG_INFO, c->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1365 "invalid range %ui in ack frame", i);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1366 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1367 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1368
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1369 max = min - 1 - gap;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1370
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1371 if (range > max + 1) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1372 ngx_log_error(NGX_LOG_INFO, c->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1373 "invalid range %ui in ack frame", i);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1374 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1375 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1376
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1377 min = max - range + 1;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1378
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1379 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
1380 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1381 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1382 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1383
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1384 return NGX_OK;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1385 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1386
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1387
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1388 static ngx_int_t
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1389 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
1390 uint64_t min, uint64_t max)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1391 {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1392 ngx_uint_t found;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1393 ngx_queue_t *q;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1394 ngx_quic_frame_t *f;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1395
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1396 found = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1397
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1398 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
1399
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1400 while (q != ngx_queue_sentinel(&ctx->sent)) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1401
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1402 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
1403
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1404 if (f->pnum >= min && f->pnum <= max) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1405 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1406 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1407 ngx_quic_free_frame(c, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1408 found = 1;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1409
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1410 } else {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1411 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1412 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1413 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1414
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1415 if (!found) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1416
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1417 if (max <= ctx->pnum) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1418 /* duplicate ACK or ACK for non-ack-eliciting frame */
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8325
diff changeset
1419 return NGX_OK;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1420 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1421
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1422 ngx_log_error(NGX_LOG_INFO, c->log, 0,
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1423 "ACK for the packet not in sent queue ");
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1424 // TODO: handle error properly: PROTOCOL VIOLATION?
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1425 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1426 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1427
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1428 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1429 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1430
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1431
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1432 static ngx_int_t
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1433 ngx_quic_handle_ordered_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
1434 ngx_quic_frame_t *frame, ngx_quic_frame_handler_pt handler)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1435 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1436 size_t full_len;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1437 ngx_int_t rc;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1438 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1439 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1440
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1441 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1442
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1443 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1444 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1445 "out-of-order frame: expecting %ui got %ui",
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1446 fs->received, f->offset);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1447
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1448 return ngx_quic_buffer_frame(c, fs, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1449 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1450
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1451 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1452
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1453 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1454 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1455 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1456 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1457 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1458 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1459
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1460 /* intersecting data range, frame modified */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1461 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1462
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1463 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1464
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1465 rc = handler(c, frame);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1466 if (rc == NGX_ERROR) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1467 return NGX_ERROR;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1468
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1469 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1470 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1471 return NGX_OK;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1472 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1473
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1474 /* rc == NGX_OK */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1475
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1476 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1477
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1478 /* 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
1479
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1480 do {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1481 q = ngx_queue_head(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1482 if (q == ngx_queue_sentinel(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1483 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1484 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1485
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1486 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1487 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1488
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1489 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1490 /* gap found, nothing more to do */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1491 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1492 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1493
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1494 full_len = f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1495
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1496 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1497
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1498 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1499 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1500 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1501 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1502 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1503 fs->total -= f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1504
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1505 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1506 "skipped buffered frame, total %ui", fs->total);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1507 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1508 continue;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1509 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1510
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1511 /* frame was adjusted, proceed to input */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1512 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1513
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1514 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1515
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1516 rc = handler(c, frame);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1517
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1518 if (rc == NGX_ERROR) {
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1519 return NGX_ERROR;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1520
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1521 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1522 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1523 return NGX_OK;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1524 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1525
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1526 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1527 fs->total -= full_len;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1528
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1529 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1530
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1531 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1532 "consumed buffered frame, total %ui", fs->total);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1533
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1534 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1535
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1536 } while (1);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1537
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1538 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1539 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1540
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1541
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1542 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1543 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
1544 uint64_t offset_in)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1545 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1546 size_t tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1547 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1548
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1549 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1550
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1551 tail = offset_in - f->offset;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1552
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1553 if (tail >= f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1554 /* range preceeding already received data or duplicate, ignore */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1555
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1556 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1557 "old or duplicate data in ordered frame, ignored");
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1558 return NGX_DONE;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1559 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1560
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1561 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1562 "adjusted ordered frame data start to expected offset");
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1563
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1564 /* intersecting range: adjust data size */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1565
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1566 f->offset += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1567 f->data += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1568 f->length -= tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1569
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1570 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1571 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1572
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1573
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1574 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1575 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
1576 ngx_quic_frame_t *frame)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1577 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1578 u_char *data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1579 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1580 ngx_quic_frame_t *dst, *item;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1581 ngx_quic_ordered_frame_t *f, *df;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1582
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1583 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "ngx_quic_buffer_frame");
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1584
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1585 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1586
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1587 /* frame start offset is in the future, buffer it */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1588
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1589 /* 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
1590 if (NGX_QUIC_MAX_BUFFERED - fs->total < f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1591 ngx_log_error(NGX_LOG_INFO, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1592 "ordered input buffer limit exceeded");
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1593 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1594 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1595
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1596 dst = ngx_quic_alloc_frame(c, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1597 if (dst == NULL) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1598 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1599 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1600
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1601 data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1602 ngx_memcpy(dst, frame, sizeof(ngx_quic_frame_t));
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1603 dst->data = data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1604
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1605 ngx_memcpy(dst->data, f->data, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1606
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1607 df = &dst->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1608 df->data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1609
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1610 fs->total += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1611
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1612 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1613 "ordered frame with unexpected offset: buffered, total %ui",
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1614 fs->total);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1615
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1616 /* TODO: do we need some timeout for this queue ? */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1617
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1618 if (ngx_queue_empty(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1619 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1620 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1621 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1622
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1623 for (q = ngx_queue_last(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1624 q != ngx_queue_sentinel(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1625 q = ngx_queue_prev(q))
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1626 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1627 item = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1628 f = &item->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1629
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1630 if (f->offset < df->offset) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1631 ngx_queue_insert_after(q, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1632 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1633 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1634 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1635
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1636 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1637
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1638 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1639 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1640
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1641
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1642 static ngx_int_t
8335
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1643 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
1644 ngx_quic_frame_t *frame)
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1645 {
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1646 ngx_quic_connection_t *qc;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1647 ngx_quic_frames_stream_t *fs;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1648
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1649 qc = c->quic;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1650 fs = &qc->crypto[pkt->level];
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1651
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1652 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_crypto_input);
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1653 }
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1654
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1655
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 8334
diff changeset
1656 static ngx_int_t
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1657 ngx_quic_crypto_input(ngx_connection_t *c, ngx_quic_frame_t *frame)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1658 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1659 int sslerr;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1660 ssize_t n;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1661 ngx_ssl_conn_t *ssl_conn;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1662 ngx_quic_crypto_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1663
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1664 f = &frame->u.crypto;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1665
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1666 ssl_conn = c->ssl->connection;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1667
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1668 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1669 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1670 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1671 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1672
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1673 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
1674 f->data, f->length))
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1675 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1676 ngx_ssl_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1677 "SSL_provide_quic_data() failed");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1678 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1679 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1680
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1681 n = SSL_do_handshake(ssl_conn);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1682
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1683 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
1684
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1685 if (n == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1686 sslerr = SSL_get_error(ssl_conn, n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1687
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1688 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
1689 sslerr);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1690
8300
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8299
diff changeset
1691 if (sslerr != SSL_ERROR_WANT_READ) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1692 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
1693 return NGX_ERROR;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1694 }
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1695
8302
76818c9cdd6f Sending HANDSHAKE_DONE just once with BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8301
diff changeset
1696 } else if (n == 1 && !SSL_in_init(ssl_conn)) {
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1697 c->quic->state = NGX_QUIC_ST_APPLICATION;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1698
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1699 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8299
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
1700 "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1701
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1702 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8299
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
1703 "handshake completed successfully");
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1704
8274
ee53bfd8f9ed Added QUIC version check for sending HANDSHAKE_DONE frame.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1705 #if (NGX_QUIC_DRAFT_VERSION >= 27)
ee53bfd8f9ed Added QUIC version check for sending HANDSHAKE_DONE frame.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1706 {
ee53bfd8f9ed Added QUIC version check for sending HANDSHAKE_DONE frame.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1707 ngx_quic_frame_t *frame;
ee53bfd8f9ed Added QUIC version check for sending HANDSHAKE_DONE frame.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1708
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
1709 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
1710 if (frame == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1711 return NGX_ERROR;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1712 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1713
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1714 /* 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
1715 frame->level = ssl_encryption_application;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1716 frame->type = NGX_QUIC_FT_HANDSHAKE_DONE;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8272
diff changeset
1717 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
1718 ngx_quic_queue_frame(c->quic, frame);
8274
ee53bfd8f9ed Added QUIC version check for sending HANDSHAKE_DONE frame.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1719 }
ee53bfd8f9ed Added QUIC version check for sending HANDSHAKE_DONE frame.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1720 #endif
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1721
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1722 /*
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1723 * Generating next keys before a key update is received.
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1724 * 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
1725 */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1726
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1727 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
1728 &c->quic->next_key)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1729 != NGX_OK)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1730 {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1731 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
1732 }
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1733 }
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1734
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1735 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1736 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1737 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1738 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1739
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1740 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1741 }
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 static ngx_int_t
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1745 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
1746 ngx_quic_frame_t *frame)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1747 {
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1748 size_t n;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1749 ngx_buf_t *b;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1750 ngx_event_t *rev;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1751 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1752 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1753 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1754 ngx_quic_frames_stream_t *fs;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1755
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1756 qc = c->quic;
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1757 f = &frame->u.stream;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1758
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1759 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1760
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1761 if (sn == NULL) {
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1762 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "stream is new");
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1763
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1764 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
1765 ? 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
1766 : 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
1767
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1768 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
1769 n = NGX_QUIC_STREAM_BUFSIZE;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1770 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1771
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1772 if (n < f->length) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1773 ngx_log_error(NGX_LOG_INFO, c->log, 0, "no space in stream buffer");
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1774 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1775 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1776
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1777 /*
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1778 * 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
1779 *
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1780 * 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
1781 *
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1782 * 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
1783 * 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
1784 * 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
1785 * opened.
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1786 */
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1787 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
1788 if (sn == NULL) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1789 return NGX_ERROR;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1790 }
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1791
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1792 rev = sn->c->read;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1793
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1794 if (f->offset == 0) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1795
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1796 b = sn->b;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1797 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
1798
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1799 sn->fs.received += f->length;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1800
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1801 rev->ready = 1;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1802
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1803 if (f->fin) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1804 rev->pending_eof = 1;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1805 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1806
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1807 } else {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1808 rev->ready = 0;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1809 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1810
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1811 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
1812 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
1813 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1815 qc->streams.handler(sn->c);
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1816
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1817 if (f->offset == 0) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1818 return NGX_OK;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1819 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1820
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1821 /* out-of-order stream: proceed to buffering */
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1822 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1823
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1824 fs = &sn->fs;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1825
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1826 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1827 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1828
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1829
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1830 static ngx_int_t
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1831 ngx_quic_stream_input(ngx_connection_t *c, ngx_quic_frame_t *frame)
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1832 {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1833 ngx_buf_t *b;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1834 ngx_event_t *rev;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1835 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1836 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1837 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1838
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1839 qc = c->quic;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1840
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1841 f = &frame->u.stream;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1842
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1843 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1844 if (sn == NULL) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1845 // TODO: possible?
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1846 // stream was deleted while in reordering queue ?
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1847 return NGX_ERROR;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1848 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1849
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1850 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "existing stream");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1851
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1852 b = sn->b;
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1853
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1854 if ((size_t) ((b->pos - b->start) + (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
1855 ngx_log_error(NGX_LOG_INFO, c->log, 0, "no space in stream buffer");
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1856 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1857 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1858
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1859 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
1860 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
1861 b->pos = b->start;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1862 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1863
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
1864 b->last = ngx_cpymem(b->last, f->data, f->length);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1865
8294
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
1866 rev = sn->c->read;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
1867 rev->ready = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
1868
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
1869 if (f->fin) {
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
1870 rev->pending_eof = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
1871 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1872
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1873 if (rev->active) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1874 rev->handler(rev);
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1875 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1876
8337
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 8336
diff changeset
1877 /* check if stream was destroyed by handler */
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1878 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
1879 return NGX_DONE;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1880 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1881
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1882 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1883 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1884
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1885
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1886 static ngx_int_t
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1887 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
1888 {
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1889 ngx_quic_frame_t *frame;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1890 ngx_quic_connection_t *qc;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1891
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1892 qc = c->quic;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1893 qc->cur_streams++;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1894
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1895 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
1896 return NGX_OK;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1897 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1898
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1899 frame = ngx_quic_alloc_frame(c, 0);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1900 if (frame == NULL) {
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1901 return NGX_ERROR;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1902 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1903
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1904 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
1905 NGX_QUIC_STREAMS_LIMIT);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1906
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1907 frame->level = ssl_encryption_application;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1908 frame->type = NGX_QUIC_FT_MAX_STREAMS;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1909 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
1910 frame->u.max_streams.bidi = 1;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1911
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1912 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
1913 (int) frame->u.max_streams.limit,
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1914 (int) frame->u.max_streams.bidi,
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1915 frame->level);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1916
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1917 ngx_quic_queue_frame(qc, frame);
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1918
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1919 return NGX_OK;
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1920 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1921
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1922
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1923 static ngx_int_t
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1924 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
1925 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
1926 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1927 ngx_quic_frame_t *frame;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1928
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
1929 frame = ngx_quic_alloc_frame(c, 0);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1930 if (frame == NULL) {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1931 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1932 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1933
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1934 frame->level = pkt->level;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1935 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
1936 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
1937 frame->u.max_streams.bidi = f->bidi;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1938
8314
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8312
diff changeset
1939 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
1940
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1941 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
1942 (int) frame->u.max_streams.limit,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1943 (int) frame->u.max_streams.bidi,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1944 frame->level);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1945
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1946 ngx_quic_queue_frame(c->quic, frame);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1947
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1948 return NGX_OK;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1949 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1950
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1951
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1952 static ngx_int_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1953 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
1954 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
1955 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
1956 size_t n;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
1957 ngx_buf_t *b;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
1958 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
1959 ngx_quic_stream_t *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
1960 ngx_quic_connection_t *qc;
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1961
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1962 qc = c->quic;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1963 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
1964
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1965 if (sn == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1966 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unknown stream id:%uL", f->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1967 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1968 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1969
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1970 b = sn->b;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
1971 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
1972
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
1973 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
1974 if (frame == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1975 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1976 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1977
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1978 frame->level = pkt->level;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1979 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
1980 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
1981 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
1982
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1983 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
1984 (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
1985 (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
1986 frame->level);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1987
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1988 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
1989
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1990 return NGX_OK;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1991 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1992
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1993
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1994 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1995 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
1996 {
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1997 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
1998
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
1999 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
2000
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2001 ngx_queue_insert_tail(&ctx->frames, &frame->queue);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2002
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2003 /* TODO: check PUSH flag on stream and call output */
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2004
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2005 if (!qc->push.timer_set && !qc->closing) {
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2006 ngx_add_timer(&qc->push, qc->tp.max_ack_delay);
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2007 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2008 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2009
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2010
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2011 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2012 ngx_quic_output(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2013 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2014 ngx_uint_t i;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2015 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2016
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
2017 c->log->action = "sending frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
2018
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2019 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2020
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2021 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
2022 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
2023 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2024 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2025 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2026
8322
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 8321
diff changeset
2027 if (!qc->send_timer_set && !qc->closing) {
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2028 qc->send_timer_set = 1;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2029 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
2030 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
2031
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2032 if (!qc->retry.timer_set && !qc->closing) {
8316
0dc0552335bd Removed unneccesary milliseconds conversion.
Vladimir Homutov <vl@nginx.com>
parents: 8315
diff changeset
2033 ngx_add_timer(&qc->retry, qc->tp.max_ack_delay);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2034 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2035
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2036 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2037 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2038
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2039
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2040 static ngx_int_t
8332
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2041 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
2042 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2043 size_t len, hlen, n;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2044 ngx_int_t rc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2045 ngx_queue_t *q, range;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2046 ngx_quic_frame_t *f;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2047 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2048
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2049 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2050
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2051 if (ngx_queue_empty(&ctx->frames)) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2052 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2053 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2054
8332
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2055 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
2056 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
2057
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8331
diff changeset
2058 /* 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
2059 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
2060 : NGX_QUIC_MAX_LONG_HEADER;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2061 hlen += EVP_GCM_TLS_TAG_LEN;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2062
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2063 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2064 len = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2065 ngx_queue_init(&range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2066
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2067 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2068 /* process group of frames that fits into packet */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2069 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
2070
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2071 n = ngx_quic_create_frame(NULL, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2072
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2073 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
2074 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2075 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2076
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2077 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2078
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2079 f->first = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2080
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2081 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2082 ngx_queue_insert_tail(&range, &f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2083
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2084 len += n;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2085
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2086 } while (q != ngx_queue_sentinel(&ctx->frames));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2087
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2088 rc = ngx_quic_send_frames(c, &range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2089
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2090 if (rc == NGX_OK) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2091 /*
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2092 * frames are moved into the sent queue
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2093 * to wait for ack/be retransmitted
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2094 */
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2095 ngx_queue_add(&ctx->sent, &range);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2096
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2097 } else if (rc == NGX_DONE) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2098
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2099 /* 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
2100 ngx_quic_free_frames(c, &range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2101
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2102 } else {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2103 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2104 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2105
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2106 } while (q != ngx_queue_sentinel(&ctx->frames));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2107
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2108 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2109 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2110
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2111
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2112 static void
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2113 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
2114 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2115 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2116 ngx_quic_frame_t *f;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2117
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2118 do {
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2119 q = ngx_queue_head(frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2120
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2121 if (q == ngx_queue_sentinel(frames)) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2122 break;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2123 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2124
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2125 ngx_queue_remove(q);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2126
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2127 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
2128
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2129 ngx_quic_free_frame(c, f);
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2130 } while (1);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2131 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2132
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2133
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2134 /* pack a group of frames [start; end) into memory p and send as single packet */
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2135 static ngx_int_t
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2136 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
2137 {
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2138 ssize_t len;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2139 u_char *p;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2140 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
2141 ngx_str_t out, res;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2142 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2143 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
2144 ngx_quic_header_t pkt;
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2145 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
2146 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
2147 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
2148 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
2149 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
2150 static u_char dst[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2151
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2152 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "ngx_quic_send_frames");
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2153
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2154 q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2155 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
2156
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2157 ctx = ngx_quic_get_send_ctx(c->quic, start->level);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2158
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2159 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2160
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2161 p = src;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2162 out.data = src;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2163
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2164 for (q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2165 q != ngx_queue_sentinel(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2166 q = ngx_queue_next(q))
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2167 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2168 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2169
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2170 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "frame: %s", f->info);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2171
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2172 len = ngx_quic_create_frame(p, f);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2173 if (len == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2174 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2175 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2176
8312
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 8311
diff changeset
2177 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
2178 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
2179 }
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 8311
diff changeset
2180
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2181 p += len;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2182 f->pnum = ctx->pnum;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2183 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2184
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2185 if (start->level == ssl_encryption_initial) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2186 /* 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
2187 * discarded when handshake start.
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2188 * Thus consider initial packets as non-ack-eliciting
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2189 */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2190 pkt.need_ack = 0;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2191 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2192
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2193 out.len = p - out.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2194
8301
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2195 while (out.len < 4) {
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2196 *p++ = NGX_QUIC_FT_PADDING;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2197 out.len++;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2198 }
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8300
diff changeset
2199
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2200 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2201 "packet ready: %ui bytes at level %d need_ack: %ui",
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2202 out.len, start->level, pkt.need_ack);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2203
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2204 qc = c->quic;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2205
8306
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2206 keys = &c->quic->keys[start->level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2207
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2208 pkt.secret = &keys->server;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 8305
diff changeset
2209
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2210 if (start->level == ssl_encryption_initial) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2211 pkt.flags = NGX_QUIC_PKT_INITIAL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2212 pkt.token = initial_token;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2213
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2214 } else if (start->level == ssl_encryption_handshake) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2215 pkt.flags = NGX_QUIC_PKT_HANDSHAKE;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2216
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2217 } else {
8319
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2218 // TODO: macro, set FIXED bit
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8316
diff changeset
2219 pkt.flags = 0x40 | (c->quic->key_phase ? NGX_QUIC_PKT_KPHASE : 0);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2220 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2221
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2222 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
2223
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2224 pkt.log = c->log;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2225 pkt.level = start->level;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2226 pkt.dcid = qc->dcid;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2227 pkt.scid = qc->scid;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2228 pkt.payload = out;
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8284
diff changeset
2229
8289
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8288
diff changeset
2230 res.data = dst;
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8284
diff changeset
2231
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8284
diff changeset
2232 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
2233 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2234 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2235
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2236 ngx_quic_hexdump0(c->log, "packet to send", res.data, res.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2237
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2238 len = c->send(c, res.data, res.len);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2239 if (len == NGX_ERROR || (size_t) len != res.len) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2240 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2241 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2242
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2243 /* 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
2244 ctx->pnum++;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2245
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2246 now = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2247 start->last = now;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2248
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2249 return pkt.need_ack ? NGX_OK : NGX_DONE;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2250 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2251
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2252
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2253 static void
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2254 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
2255 {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2256 uint64_t delta;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2257
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2258 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
2259 pkt->number = ctx->pnum;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2260
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2261 if (delta <= 0x7F) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2262 pkt->num_len = 1;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2263 pkt->trunc = ctx->pnum & 0xff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2264
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2265 } else if (delta <= 0x7FFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2266 pkt->num_len = 2;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2267 pkt->flags |= 0x1;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2268 pkt->trunc = ctx->pnum & 0xffff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2269
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2270 } else if (delta <= 0x7FFFFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2271 pkt->num_len = 3;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2272 pkt->flags |= 0x2;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2273 pkt->trunc = ctx->pnum & 0xffffff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2274
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2275 } else {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2276 pkt->num_len = 4;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2277 pkt->flags |= 0x3;
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2278 pkt->trunc = ctx->pnum & 0xffffffff;
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2279 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2280 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2281
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2282
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8314
diff changeset
2283 static void
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2284 ngx_quic_retransmit_handler(ngx_event_t *ev)
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2285 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2286 ngx_uint_t i;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2287 ngx_msec_t wait, nswait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2288 ngx_connection_t *c;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2289 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2290
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2291 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0,
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2292 "retransmit timer");
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2293
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2294 c = ev->data;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2295 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2296
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2297 wait = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2298
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2299 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
2300 if (ngx_quic_retransmit(c, &qc->send_ctx[i], &nswait) != NGX_OK) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2301 ngx_quic_close_connection(c);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2302 return;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2303 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2304
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2305 if (i == 0) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2306 wait = nswait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2307
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2308 } else if (nswait > 0 && nswait < wait) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2309 wait = nswait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2310 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2311 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2312
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2313 if (wait > 0) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2314 ngx_add_timer(&qc->retry, wait);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2315 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2316 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2317
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2318
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2319 static void
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2320 ngx_quic_push_handler(ngx_event_t *ev)
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2321 {
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2322 ngx_connection_t *c;
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2323
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2324 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "push timer");
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2325
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2326 c = ev->data;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2327
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2328 if (ngx_quic_output(c) != NGX_OK) {
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2329 ngx_quic_close_connection(c);
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2330 return;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2331 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2332 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2333
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
2334
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2335 static ngx_int_t
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2336 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
2337 ngx_msec_t *waitp)
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2338 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2339 uint64_t pn;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2340 ngx_msec_t now, wait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2341 ngx_queue_t *q, range;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2342 ngx_quic_frame_t *f, *start;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2343 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2344
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2345 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2346
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2347 now = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2348 wait = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2349
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2350 if (ngx_queue_empty(&ctx->sent)) {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2351 *waitp = 0;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2352 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2353 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2354
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2355 q = ngx_queue_head(&ctx->sent);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2356 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
2357 pn = start->pnum;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2358 f = start;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2359
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2360 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2361 ngx_queue_init(&range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2362
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2363 /* send frames with same packet number to the wire */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2364 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2365 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
2366
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2367 if (start->first + qc->tp.max_idle_timeout < now) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2368 ngx_log_error(NGX_LOG_ERR, c->log, 0,
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2369 "retransmission timeout");
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2370 return NGX_DECLINED;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2371 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2372
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2373 if (f->pnum != pn) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2374 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2375 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2376
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2377 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2378
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2379 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2380 ngx_queue_insert_tail(&range, &f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2381
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2382 } while (q != ngx_queue_sentinel(&ctx->sent));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2383
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2384 wait = start->last + qc->tp.max_ack_delay - now;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2385
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2386 if ((ngx_msec_int_t) wait > 0) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2387 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2388 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2389
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2390 /* 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
2391 if (ngx_quic_send_frames(c, &range) != NGX_OK) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2392 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2393 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2394
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2395 /* 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
2396 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
2397
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
2398 } while (q != ngx_queue_sentinel(&ctx->sent));
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2399
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2400 *waitp = wait;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2401
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2402 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2403 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2404
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2405
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2406 ngx_connection_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2407 ngx_quic_create_uni_stream(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2408 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2409 ngx_uint_t id;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2410 ngx_quic_stream_t *qs, *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2411 ngx_quic_connection_t *qc;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2412
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2413 qs = c->qs;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2414 qc = qs->parent->quic;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2415
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2416 id = (qc->streams.id_counter << 2)
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2417 | NGX_QUIC_STREAM_SERVER_INITIATED
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2418 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2419
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2420 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2421 "creating server uni stream #%ui id %ui",
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2422 qc->streams.id_counter, id);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2423
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2424 qc->streams.id_counter++;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2425
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2426 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
2427 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2428 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2429 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2430
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2431 return sn->c;
8225
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
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2434
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2435 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2436 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2437 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2438 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2439 ngx_rbtree_node_t **p;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2440 ngx_quic_stream_t *qn, *qnt;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2441
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2442 for ( ;; ) {
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2443 qn = (ngx_quic_stream_t *) node;
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2444 qnt = (ngx_quic_stream_t *) temp;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2445
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2446 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2447
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2448 if (*p == sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2449 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2450 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2451
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2452 temp = *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2453 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2454
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2455 *p = node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2456 node->parent = temp;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2457 node->left = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2458 node->right = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2459 ngx_rbt_red(node);
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
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2462
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2463 static ngx_quic_stream_t *
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2464 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
2465 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2466 ngx_rbtree_node_t *node, *sentinel;
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2467 ngx_quic_stream_t *qn;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2468
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2469 node = rbtree->root;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2470 sentinel = rbtree->sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2471
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2472 while (node != sentinel) {
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2473 qn = (ngx_quic_stream_t *) node;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2474
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2475 if (id == qn->id) {
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2476 return qn;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2477 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2478
8284
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 8282
diff changeset
2479 node = (id < qn->id) ? node->left : node->right;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2480 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2481
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2482 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2483 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2484
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2485
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2486 static ngx_quic_stream_t *
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2487 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
2488 {
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2489 ngx_log_t *log;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2490 ngx_pool_t *pool;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2491 ngx_quic_stream_t *sn;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2492 ngx_pool_cleanup_t *cln;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2493
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2494 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2495 if (pool == NULL) {
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2496 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2497 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2498
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2499 sn = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2500 if (sn == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2501 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2502 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2503 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2504
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2505 sn->node.key = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2506 sn->parent = c;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2507 sn->id = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2508
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2509 sn->b = ngx_create_temp_buf(pool, rcvbuf_size);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2510 if (sn->b == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2511 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2512 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2513 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2514
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2515 ngx_queue_init(&sn->fs.frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2516
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2517 log = ngx_palloc(pool, sizeof(ngx_log_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2518 if (log == NULL) {
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2519 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2520 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2521 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2522
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2523 *log = *c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2524 pool->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2525
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2526 sn->c = ngx_get_connection(-1, log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2527 if (sn->c == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2528 ngx_destroy_pool(pool);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2529 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2530 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2531
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2532 sn->c->qs = sn;
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2533 sn->c->pool = pool;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2534 sn->c->ssl = c->ssl;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2535 sn->c->sockaddr = c->sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2536 sn->c->listening = c->listening;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2537 sn->c->addr_text = c->addr_text;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2538 sn->c->local_sockaddr = c->local_sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2539 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
2540
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2541 sn->c->recv = ngx_quic_stream_recv;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2542 sn->c->send = ngx_quic_stream_send;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2543 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
2544
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2545 sn->c->read->log = c->log;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2546 sn->c->write->log = c->log;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2547
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2548 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
2549 if (cln == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2550 ngx_close_connection(sn->c);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2551 ngx_destroy_pool(pool);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2552 return NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2553 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2554
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2555 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
2556 cln->data = sn->c;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2557
8282
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2558 ngx_rbtree_insert(&c->quic->streams.tree, &sn->node);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 8281
diff changeset
2559
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2560 return sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2561 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2562
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
2563
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2564 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2565 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
2566 {
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2567 ssize_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2568 ngx_buf_t *b;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2569 ngx_event_t *rev;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2570 ngx_connection_t *pc;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2571 ngx_quic_frame_t *frame;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2572 ngx_quic_stream_t *qs;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2573 ngx_quic_connection_t *qc;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2574
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2575 qs = c->qs;
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2576 b = qs->b;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2577 pc = qs->parent;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2578 qc = pc->quic;
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2579 rev = c->read;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2580
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2581 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2582 "quic recv: eof:%d, avail:%z",
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2583 rev->pending_eof, b->last - b->pos);
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2584
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2585 if (b->pos == b->last) {
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2586 rev->ready = 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2587
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2588 if (rev->pending_eof) {
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2589 rev->eof = 1;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2590 return 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2591 }
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2592
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2593 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic recv() not ready");
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2594 return NGX_AGAIN;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2595 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2596
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2597 len = ngx_min(b->last - b->pos, (ssize_t) size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2598
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2599 ngx_memcpy(buf, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2600
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2601 b->pos += len;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2602 qc->streams.total_received += len;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2603
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2604 if (b->pos == b->last) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2605 b->pos = b->start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2606 b->last = b->start;
8294
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 8293
diff changeset
2607 rev->ready = rev->pending_eof;
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2608 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
2609
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2610 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8279
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8278
diff changeset
2611 "quic recv: %z of %uz", len, size);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2612
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2613 if (!rev->pending_eof) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2614 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2615 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2616 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2617 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2618
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2619 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2620 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2621 frame->u.max_stream_data.id = qs->id;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2622 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
2623 + (b->end - b->last);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2624
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2625 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
2626 (int) frame->u.max_stream_data.id,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2627 (int) frame->u.max_stream_data.limit,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2628 frame->level);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2629
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2630 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2631 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2632
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2633 if ((qc->streams.max_data / 2) < qc->streams.total_received) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2634
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2635 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2636
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2637 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2638 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2639 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2640
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2641 qc->streams.max_data *= 2;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2642
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2643 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2644 frame->type = NGX_QUIC_FT_MAX_DATA;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2645 frame->u.max_data.max_data = qc->streams.max_data;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2646
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2647 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
2648 (int) frame->u.max_data.max_data, frame->level);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2649
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2650 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2651
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2652 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2653 "quic recv: increased max data: %ui",
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2654 qc->streams.max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2655 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
2656
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2657 return len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2658 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2659
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2660
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2661 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2662 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
2663 {
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2664 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2665 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2666 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2667 ngx_quic_connection_t *qc;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2668
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2669 qs = c->qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2670 pc = qs->parent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2671 qc = pc->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2672
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2673 if (qc->closing) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2674 return NGX_ERROR;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2675 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2676
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2677 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send: %uz", size);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2678
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2679 frame = ngx_quic_alloc_frame(pc, size);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2680 if (frame == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2681 return 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2682 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2683
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2684 ngx_memcpy(frame->data, buf, size);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2685
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2686 frame->level = ssl_encryption_application;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2687 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2688 frame->u.stream.off = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2689 frame->u.stream.len = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2690 frame->u.stream.fin = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2692 frame->u.stream.type = frame->type;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2693 frame->u.stream.stream_id = qs->id;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2694 frame->u.stream.offset = c->sent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2695 frame->u.stream.length = size;
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2696 frame->u.stream.data = frame->data;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2697
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2698 c->sent += size;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2699
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2700 ngx_sprintf(frame->info, "stream %xi len=%ui level=%d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2701 qs->id, size, frame->level);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2702
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2703 ngx_quic_queue_frame(qc, frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2704
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2705 return size;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2706 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2707
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2708
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2709 static void
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2710 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
2711 {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2712 ngx_connection_t *c = data;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2713
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2714 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2715 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2716 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2717 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
2718
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2719 qs = c->qs;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2720 pc = qs->parent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2721 qc = pc->quic;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2722
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2723 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic stream cleanup");
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2724
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2725 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2726
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2727 if (qc->closing) {
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2728 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
2729 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2730 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2731
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2732 ngx_quic_free_frames(pc, &qs->fs.frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
2733
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2734 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
2735 /* 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
2736 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2737 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2738
8280
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2739 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send fin");
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2740
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2741 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
2742 if (frame == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2743 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2744 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2745
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2746 frame->level = ssl_encryption_application;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2747 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
2748 frame->u.stream.off = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2749 frame->u.stream.len = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2750 frame->u.stream.fin = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2751
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2752 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
2753 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
2754 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
2755 frame->u.stream.length = 0;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2756 frame->u.stream.data = NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2757
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2758 ngx_sprintf(frame->info, "stream %xi fin=1 level=%d", qs->id, frame->level);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2759
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2760 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
2761
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
2762 (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
2763 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2764
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
2765
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2766 static ngx_chain_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2767 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
2768 off_t limit)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2769 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2770 size_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2771 ssize_t n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2772 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2773
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2774 for ( /* void */; in; in = in->next) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2775 b = in->buf;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2776
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2777 if (!ngx_buf_in_memory(b)) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2778 continue;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2779 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2780
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2781 if (ngx_buf_size(b) == 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2782 continue;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2783 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2784
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2785 len = b->last - b->pos;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2786
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2787 n = ngx_quic_stream_send(c, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2788
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2789 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2790 return NGX_CHAIN_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2791 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2792
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2793 if (n == NGX_AGAIN) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2794 return in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2795 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2796
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2797 if (n != (ssize_t) len) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2798 b->pos += n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2799 return in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2800 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2801 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2802
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2803 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
2804 }
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2805
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2806
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2807 static ngx_quic_frame_t *
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2808 ngx_quic_alloc_frame(ngx_connection_t *c, size_t size)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2809 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2810 u_char *p;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2811 ngx_queue_t *q;
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2812 ngx_quic_frame_t *frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2813 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2814
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2815 if (size) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2816 p = ngx_alloc(size, c->log);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2817 if (p == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2818 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2819 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2820
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2821 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2822 p = NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2823 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2824
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2825 qc = c->quic;
8308
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 if (!ngx_queue_empty(&qc->free_frames)) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2828
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2829 q = ngx_queue_head(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2830 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
2831
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2832 ngx_queue_remove(&frame->queue);
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2833
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2834 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2835 "reuse quic frame n:%ui", qc->nframes);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2836
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2837 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2838 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2839 if (frame == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2840 ngx_free(p);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2841 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2842 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2843
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2844 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2845 ++qc->nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2846 #endif
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2847
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2848 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2849 "alloc quic frame n:%ui", qc->nframes);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2850 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2851
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2852 ngx_memzero(frame, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2853
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2854 frame->data = p;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2855
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2856 return frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2857 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2858
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2859
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2860 static void
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2861 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
2862 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2863 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2864
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2865 qc = c->quic;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2866
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2867 if (frame->data) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2868 ngx_free(frame->data);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2869 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2870
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
2871 ngx_queue_insert_head(&qc->free_frames, &frame->queue);
8286
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2872
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2873 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2874 "free quic frame n:%ui", qc->nframes);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
2875 }