annotate src/event/ngx_event_quic.c @ 8333:167d32476737 quic

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