annotate src/event/ngx_event_quic.c @ 7835:2a6e91a1691d quic

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