annotate src/event/ngx_event_quic.c @ 8260:f388c0ad3477 quic

Added processing of client transport parameters. note: + parameters are available in SSL connection since they are obtained by ssl stack quote: During connection establishment, both endpoints make authenticated declarations of their transport parameters. These declarations are made unilaterally by each endpoint. and really, we send our parameters before we read client's. no handling of incoming parameters is made by this patch.
author Vladimir Homutov <vl@nginx.com>
date Sat, 21 Mar 2020 20:51:59 +0300
parents 9e9eab876964
children 1295b293d09a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
2 /*
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
3 * Copyright (C) Nginx, Inc.
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
4 */
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
5
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
6
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
9 #include <ngx_event.h>
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
10
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
11
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
12 typedef struct {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
13 ngx_rbtree_node_t node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
14 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
15 ngx_connection_t *c;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
16 ngx_quic_stream_t s;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
17 } ngx_quic_stream_node_t;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
18
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
19
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
20 typedef struct {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
21 ngx_rbtree_t tree;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
22 ngx_rbtree_node_t sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
23 ngx_msec_t timeout;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
24 ngx_connection_handler_pt handler;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
25
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
26 ngx_uint_t id_counter;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
27 } ngx_quic_streams_t;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
28
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
29
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
30 struct ngx_quic_connection_s {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
31 ngx_str_t scid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
32 ngx_str_t dcid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
33 ngx_str_t token;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
34
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
35 ngx_uint_t client_tp_done;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
36 ngx_quic_tp_t tp;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
37
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
38 /* current packet numbers for each namespace */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
39 ngx_uint_t initial_pn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
40 ngx_uint_t handshake_pn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
41 ngx_uint_t appdata_pn;
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
42
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
43 ngx_quic_secrets_t secrets;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
44 ngx_ssl_t *ssl;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
45 ngx_quic_frame_t *frames;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
46
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
47 ngx_quic_streams_t streams;
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
48 ngx_uint_t max_data;
8259
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
49
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
50 #define SSL_ECRYPTION_LAST ((ssl_encryption_application) + 1)
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
51 uint64_t crypto_offset[SSL_ECRYPTION_LAST];
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
52 };
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
53
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
54
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
55 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
56 static int ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
57 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
58 const uint8_t *secret, size_t secret_len);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
59 static int ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
60 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
61 const uint8_t *secret, size_t secret_len);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
62 #else
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
63 static int ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
64 enum ssl_encryption_level_t level, const uint8_t *read_secret,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
65 const uint8_t *write_secret, size_t secret_len);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
66 #endif
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
67
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
68 static int ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
69 enum ssl_encryption_level_t level, const uint8_t *data, size_t len);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
70 static int ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
71 static int ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
72 enum ssl_encryption_level_t level, uint8_t alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
73
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
74
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
75 static ngx_int_t ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
76 ngx_quic_tp_t *tp, ngx_quic_header_t *pkt);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
77 static ngx_int_t ngx_quic_init_connection(ngx_connection_t *c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
78 static void ngx_quic_handshake_handler(ngx_event_t *rev);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
79 static void ngx_quic_close_connection(ngx_connection_t *c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
80
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
81 static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
82 static ngx_int_t ngx_quic_initial_input(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
83 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
84 static ngx_int_t ngx_quic_handshake_input(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
85 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
86 static ngx_int_t ngx_quic_app_input(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
87 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
88 static ngx_int_t ngx_quic_payload_handler(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
89 ngx_quic_header_t *pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
90
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
91 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
92 ngx_quic_header_t *pkt, ngx_quic_ack_frame_t *f);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
93 static ngx_int_t ngx_quic_handle_crypto_frame(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
94 ngx_quic_header_t *pkt, ngx_quic_crypto_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
95 static ngx_int_t ngx_quic_handle_stream_frame(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
96 ngx_quic_header_t *pkt, ngx_quic_stream_frame_t *frame);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
97 static ngx_int_t ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
98 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
99
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
100 static void ngx_quic_queue_frame(ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
101 ngx_quic_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
102
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
103 static ngx_int_t ngx_quic_output(ngx_connection_t *c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
104 ngx_int_t ngx_quic_frames_send(ngx_connection_t *c, ngx_quic_frame_t *start,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
105 ngx_quic_frame_t *end, size_t total);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
106 static ngx_int_t ngx_quic_send_packet(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
107 ngx_quic_connection_t *qc, enum ssl_encryption_level_t level,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
108 ngx_str_t *payload);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
109
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
110
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
111 static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
112 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
113 static ngx_quic_stream_node_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
114 ngx_uint_t key);
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
115 static ngx_quic_stream_node_t *ngx_quic_create_stream(ngx_connection_t *c,
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
116 ngx_uint_t id);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
117 static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
118 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
119 static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
120 size_t size);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
121 static void ngx_quic_stream_cleanup_handler(void *data);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
122 static ngx_chain_t *ngx_quic_stream_send_chain(ngx_connection_t *c,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
123 ngx_chain_t *in, off_t limit);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
124
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
125
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
126 static SSL_QUIC_METHOD quic_method = {
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
127 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
128 ngx_quic_set_read_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
129 ngx_quic_set_write_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
130 #else
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
131 ngx_quic_set_encryption_secrets,
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
132 #endif
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
133 ngx_quic_add_handshake_data,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
134 ngx_quic_flush_flight,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
135 ngx_quic_send_alert,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
136 };
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
137
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
138
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
139 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
140
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
141 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
142 ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
143 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
144 const uint8_t *rsecret, size_t secret_len)
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
145 {
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
146 ngx_connection_t *c;
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
147
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
148 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
149
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
150 ngx_quic_hexdump(c->log, "level:%d read secret",
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
151 rsecret, secret_len, level);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
152
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
153 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
154 rsecret, secret_len,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
155 &c->quic->secrets.client);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
156 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
157
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
158
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
159 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
160 ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
161 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
162 const uint8_t *wsecret, size_t secret_len)
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
163 {
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
164 ngx_connection_t *c;
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
165
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
166 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
167
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
168 ngx_quic_hexdump(c->log, "level:%d write secret",
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
169 wsecret, secret_len, level);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
170
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
171 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
172 wsecret, secret_len,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
173 &c->quic->secrets.server);
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
174 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
175
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
176 #else
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
177
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
178 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
179 ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
180 enum ssl_encryption_level_t level, const uint8_t *rsecret,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
181 const uint8_t *wsecret, size_t secret_len)
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
182 {
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
183 ngx_int_t rc;
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
184 ngx_connection_t *c;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
185
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
186 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
187
8222
bec4cd55361e Fixed a typo with OpenSSL.
Vladimir Homutov <vl@nginx.com>
parents: 8221
diff changeset
188 ngx_quic_hexdump(c->log, "level:%d read", rsecret, secret_len, level);
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
189 ngx_quic_hexdump(c->log, "level:%d write", wsecret, secret_len, level);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
190
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
191 rc = ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
192 rsecret, secret_len,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
193 &c->quic->secrets.client);
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
194 if (rc != 1) {
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
195 return rc;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
196 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
197
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
198 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
199 wsecret, secret_len,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
200 &c->quic->secrets.server);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
201 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
202
8204
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
203 #endif
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8203
diff changeset
204
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
205
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
206 static int
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
207 ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
208 enum ssl_encryption_level_t level, const uint8_t *data, size_t len)
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
209 {
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
210 u_char *p, *end;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
211 size_t client_params_len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
212 const uint8_t *client_params;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
213 ngx_quic_tp_t ctp;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
214 ngx_quic_frame_t *frame;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
215 ngx_connection_t *c;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
216 ngx_quic_connection_t *qc;
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
217
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
218 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
219 qc = c->quic;
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
220
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
221 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
222 "ngx_quic_add_handshake_data");
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
223
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
224 /* XXX: obtain client parameters after the handshake? */
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
225 if (!qc->client_tp_done) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
226
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
227 SSL_get_peer_quic_transport_params(ssl_conn, &client_params,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
228 &client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
229
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
230 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
231 "SSL_get_peer_quic_transport_params(): params_len %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
232 client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
233
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
234 if (client_params_len != 0) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
235 p = (u_char *) client_params;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
236 end = p + client_params_len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
237
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
238 ngx_memzero(&ctp, sizeof(ngx_quic_tp_t));
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
239
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
240 if (ngx_quic_parse_transport_params(p, end, &ctp, c->log) != NGX_OK)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
241 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
242 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
243 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
244
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
245 /* TODO: save/use obtained client parameters: merge with ours? */
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
246
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
247 qc->client_tp_done = 1;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
248 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
249 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8259
diff changeset
250
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
251 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
252 if (frame == NULL) {
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
253 return 0;
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
254 }
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
255
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
256 p = ngx_pnalloc(c->pool, len);
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
257 if (p == NULL) {
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
258 return 0;
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
259 }
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
260
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
261 ngx_memcpy(p, data, len);
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
262
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
263 frame->level = level;
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
264 frame->type = NGX_QUIC_FT_CRYPTO;
8259
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
265 frame->u.crypto.offset += qc->crypto_offset[level];
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
266 frame->u.crypto.len = len;
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
267 frame->u.crypto.data = p;
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
268
8259
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
269 qc->crypto_offset[level] += len;
9e9eab876964 Fixed CRYPTO offset generation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8258
diff changeset
270
8186
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
271 ngx_sprintf(frame->info, "crypto, generated by SSL len=%ui level=%d", len, level);
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
272
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 8185
diff changeset
273 ngx_quic_queue_frame(qc, frame);
8184
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 8183
diff changeset
274
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
275 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
276 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
277
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
278
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
279 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
280 ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
281 {
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
282 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
283
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
284 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
285
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
286 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "ngx_quic_flush_flight()");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
287
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
288 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
289 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
290
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
291
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
292 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
293 ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
294 uint8_t alert)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
295 {
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
296 ngx_connection_t *c;
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
297 ngx_quic_frame_t *frame;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
298
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
299 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
300
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
301 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
302 "ngx_quic_send_alert(), lvl=%d, alert=%d",
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
303 (int) level, (int) alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
304
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
305 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
306 if (frame == NULL) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
307 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
308 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
309
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
310 frame->level = level;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
311 frame->type = NGX_QUIC_FT_CONNECTION_CLOSE;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
312 frame->u.close.error_code = 0x100 + alert;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
313
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
314 ngx_quic_queue_frame(c->quic, frame);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
315
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
316 if (ngx_quic_output(c) != NGX_OK) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
317 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
318 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8234
diff changeset
319
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
320 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
321 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
322
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
323
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
324 void
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
325 ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
326 ngx_msec_t timeout, ngx_connection_handler_pt handler)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
327 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
328 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
329 ngx_quic_header_t pkt;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
330
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
331 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic handshake");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
332
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
333 c->log->action = "QUIC handshaking";
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
334
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
335 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
336
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
337 b = c->buffer;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
338
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
339 pkt.log = c->log;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
340 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
341 pkt.data = b->start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
342 pkt.len = b->last - b->start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
343
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
344 if (ngx_quic_new_connection(c, ssl, tp, &pkt) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
345 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
346 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
347 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
348
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
349 // we don't need stream handler for initial packet processing
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
350 c->quic->streams.handler = handler;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
351 c->quic->streams.timeout = timeout;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
352
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
353 ngx_add_timer(c->read, timeout);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
354
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
355 c->read->handler = ngx_quic_handshake_handler;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
356
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
357 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
358 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
359
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
360
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
361 static ngx_int_t
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
362 ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
363 ngx_quic_header_t *pkt)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
364 {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
365 ngx_quic_connection_t *qc;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
366
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
367 if (ngx_buf_size(pkt->raw) < 1200) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
368 ngx_log_error(NGX_LOG_INFO, c->log, 0, "too small UDP datagram");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
369 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
370 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
371
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
372 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
373 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
374 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
375
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
376 if (!ngx_quic_pkt_in(pkt->flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
377 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
378 "invalid initial packet: 0x%xi", pkt->flags);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
379 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
380 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
381
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
382 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
383 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
384 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
385
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
386 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
387 if (qc == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
388 return NGX_ERROR;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
389 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
390
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
391 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
392 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
393
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
394 c->quic = qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
395 qc->ssl = ssl;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
396 qc->tp = *tp;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
397
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
398 qc->dcid.len = pkt->dcid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
399 qc->dcid.data = ngx_pnalloc(c->pool, pkt->dcid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
400 if (qc->dcid.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
401 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
402 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
403 ngx_memcpy(qc->dcid.data, pkt->dcid.data, qc->dcid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
404
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
405 qc->scid.len = pkt->scid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
406 qc->scid.data = ngx_pnalloc(c->pool, qc->scid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
407 if (qc->scid.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
408 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
409 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
410 ngx_memcpy(qc->scid.data, pkt->scid.data, qc->scid.len);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
411
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
412 qc->token.len = pkt->token.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
413 qc->token.data = ngx_pnalloc(c->pool, qc->token.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
414 if (qc->token.data == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
415 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
416 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
417 ngx_memcpy(qc->token.data, pkt->token.data, qc->token.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
418
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
419
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
420 if (ngx_quic_set_initial_secret(c->pool, &qc->secrets, &qc->dcid)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
421 != NGX_OK)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
422 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
423 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
424 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
425
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
426 pkt->secret = &qc->secrets.client.in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
427 pkt->level = ssl_encryption_initial;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
428
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
429 if (ngx_quic_decrypt(c->pool, NULL, pkt) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
430 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
431 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
432
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
433 if (ngx_quic_init_connection(c) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
434 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
435 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
436
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
437 return ngx_quic_payload_handler(c, pkt);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
438 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
439
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
440
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
441 static ngx_int_t
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
442 ngx_quic_init_connection(ngx_connection_t *c)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
443 {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
444 int n, sslerr;
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
445 u_char *p;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
446 ssize_t len;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
447 ngx_ssl_conn_t *ssl_conn;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
448 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
449
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
450 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
451
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
452 if (ngx_ssl_create_connection(qc->ssl, c, NGX_SSL_BUFFER) != NGX_OK) {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
453 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
454 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
455
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
456 ssl_conn = c->ssl->connection;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
457
8232
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
458 if (SSL_set_quic_method(ssl_conn, &quic_method) == 0) {
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
459 ngx_log_error(NGX_LOG_INFO, c->log, 0,
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
460 "SSL_set_quic_method() failed");
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
461 return NGX_ERROR;
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
462 }
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 8231
diff changeset
463
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
464 len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
465 /* always succeeds */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
466
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
467 p = ngx_pnalloc(c->pool, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
468 if (p == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
469 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
470 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
471
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
472 len = ngx_quic_create_transport_params(p, p + len, &qc->tp);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
473 if (len < 0) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
474 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
475 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
476
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8246
diff changeset
477 if (SSL_set_quic_transport_params(ssl_conn, p, len) == 0) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
478 ngx_log_error(NGX_LOG_INFO, c->log, 0,
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
479 "SSL_set_quic_transport_params() failed");
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
480 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
481 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
482
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
483 n = SSL_do_handshake(ssl_conn);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
484
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
485 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
486
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
487 if (n == -1) {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
488 sslerr = SSL_get_error(ssl_conn, n);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
489
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
490 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d",
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
491 sslerr);
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
492 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
493
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
494 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
495 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
496 (int) SSL_quic_read_level(ssl_conn),
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
497 (int) SSL_quic_write_level(ssl_conn));
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
498
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
499 return NGX_OK;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
500 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
501
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
502
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
503 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
504 ngx_quic_handshake_handler(ngx_event_t *rev)
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
505 {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
506 ssize_t n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
507 ngx_buf_t b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
508 ngx_connection_t *c;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
509
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
510 u_char buf[512];
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
511
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
512 b.start = buf;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
513 b.end = buf + 512;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
514 b.pos = b.last = b.start;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
515
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
516 c = rev->data;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
517
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
518 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic handshake handler");
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
519
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
520 if (rev->timedout) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
521 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
522 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
523 return;
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
524 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
525
8246
0d9bc77ae30d Reset QUIC timeout on every datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
526 ngx_add_timer(rev, c->quic->streams.timeout);
0d9bc77ae30d Reset QUIC timeout on every datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
527
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
528 if (c->close) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
529 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
530 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
531 }
8220
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8218
diff changeset
532
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
533 n = c->recv(c, b.start, b.end - b.start);
8215
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 8214
diff changeset
534
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
535 if (n == NGX_AGAIN) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
536 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
537 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
538
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
539 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
540 c->read->eof = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
541 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
542 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
543 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
544
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
545 b.last += n;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
546
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
547 if (ngx_quic_input(c, &b) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
548 ngx_quic_close_connection(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
549 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
550 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
551 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
552
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
553
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
554 static void
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
555 ngx_quic_close_connection(ngx_connection_t *c)
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
556 {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
557 ngx_pool_t *pool;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
558
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
559 /* XXX wait for all streams to close */
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
560
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
561 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
562 "close quic connection: %d", c->fd);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
563
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
564 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
565 (void) ngx_ssl_shutdown(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
566 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
567
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
568 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
569 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
570 #endif
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
571
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
572 c->destroyed = 1;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
573
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
574 pool = c->pool;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
575
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
576 ngx_close_connection(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
577
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
578 ngx_destroy_pool(pool);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
579 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
580
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
581
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
582 static ngx_int_t
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
583 ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b)
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
584 {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
585 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
586 ngx_int_t rc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
587 ngx_quic_header_t pkt;
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
588
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
589 if (c->quic == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
590 // XXX: possible?
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
591 ngx_log_error(NGX_LOG_INFO, c->log, 0, "BUG: no QUIC in connection");
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
592 return NGX_ERROR;
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
593 }
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
594
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
595 p = b->start;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
596
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
597 do {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
598 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
599 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
600 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
601 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
602 pkt.log = c->log;
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
603 pkt.flags = p[0];
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
604
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
605 if (pkt.flags == 0) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
606 /* XXX: no idea WTF is this, just ignore */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
607 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "FIREFOX: ZEROES");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
608 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
609 }
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
610
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
611 // TODO: check current state
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
612 if (ngx_quic_long_pkt(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
613
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
614 if (ngx_quic_pkt_in(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
615 rc = ngx_quic_initial_input(c, &pkt);
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
616
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
617 } else if (ngx_quic_pkt_hs(pkt.flags)) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
618 rc = ngx_quic_handshake_input(c, &pkt);
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
619
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
620 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
621 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
622 "BUG: unknown quic state");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
623 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
624 }
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
625
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
626 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
627 rc = ngx_quic_app_input(c, &pkt);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
628 }
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
629
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
630 if (rc == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
631 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
632 }
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
633
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
634 /* b->pos is at header end, adjust by actual packet length */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
635 p = b->pos + pkt.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
636 b->pos = p; /* reset b->pos to the next packet start */
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
637
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
638 } while (p < b->last);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
639
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
640 return NGX_OK;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
641 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
642
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
643
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
644 static ngx_int_t
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
645 ngx_quic_initial_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
646 {
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
647 ngx_ssl_conn_t *ssl_conn;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
648 ngx_quic_connection_t *qc;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
649
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
650 qc = c->quic;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
651 ssl_conn = c->ssl->connection;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
652
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
653 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
654 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
655 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
656
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
657 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
658 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
659 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
660
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
661 pkt->secret = &qc->secrets.client.in;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
662 pkt->level = ssl_encryption_initial;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
663
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
664 if (ngx_quic_decrypt(c->pool, ssl_conn, pkt) != NGX_OK) {
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
665 return NGX_ERROR;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
666 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
667
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
668 return ngx_quic_payload_handler(c, pkt);
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
669 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
670
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
671
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
672 static ngx_int_t
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
673 ngx_quic_handshake_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
674 {
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
675 ngx_quic_connection_t *qc;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
676
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
677 qc = c->quic;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
678
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
679 /* extract cleartext data into pkt */
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
680 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
681 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
682 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
683
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
684 if (pkt->dcid.len != qc->dcid.len) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
685 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcidl");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
686 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
687 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
688
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
689 if (ngx_memcmp(pkt->dcid.data, qc->dcid.data, qc->dcid.len) != 0) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
690 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcid");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
691 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
692 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
693
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
694 if (pkt->scid.len != qc->scid.len) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
695 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic scidl");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
696 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
697 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
698
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
699 if (ngx_memcmp(pkt->scid.data, qc->scid.data, qc->scid.len) != 0) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
700 ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic scid");
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
701 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
702 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
703
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
704 if (!ngx_quic_pkt_hs(pkt->flags)) {
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
705 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
706 "invalid packet type: 0x%xi", pkt->flags);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
707 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
708 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
709
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
710 if (ngx_quic_parse_handshake_header(pkt) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
711 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
712 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
713
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
714 pkt->secret = &qc->secrets.client.hs;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
715 pkt->level = ssl_encryption_handshake;
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
716
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
717 if (ngx_quic_decrypt(c->pool, c->ssl->connection, pkt) != NGX_OK) {
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
718 return NGX_ERROR;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
719 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
720
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
721 return ngx_quic_payload_handler(c, pkt);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
722 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
723
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
724
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
725 static ngx_int_t
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
726 ngx_quic_app_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
727 {
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
728 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
729
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
730 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
731
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
732 if (qc->secrets.client.ad.key.len == 0) {
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
733 ngx_log_error(NGX_LOG_INFO, c->log, 0,
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
734 "no read keys yet, packet ignored");
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
735 return NGX_DECLINED;
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
736 }
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
737
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents: 8223
diff changeset
738 if (ngx_quic_parse_short_header(pkt, &qc->dcid) != NGX_OK) {
8185
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
739 return NGX_ERROR;
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
740 }
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
741
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
742 pkt->secret = &qc->secrets.client.ad;
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
743 pkt->level = ssl_encryption_application;
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
744
8221
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 8220
diff changeset
745 if (ngx_quic_decrypt(c->pool, c->ssl->connection, pkt) != NGX_OK) {
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
746 return NGX_ERROR;
8185
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
747 }
6a76d9657772 QUIC handshake final bits.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8184
diff changeset
748
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
749 return ngx_quic_payload_handler(c, pkt);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
750 }
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
751
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
752
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
753 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
754 ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
755 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
756 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
757 ssize_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
758 ngx_uint_t ack_this, do_close;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
759 ngx_quic_frame_t frame, *ack_frame;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
760 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
761
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
762 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
763
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
764 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
765 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
766
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
767 ack_this = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
768 do_close = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
769
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
770 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
771
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
772 len = ngx_quic_parse_frame(pkt, p, end, &frame);
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
773
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
774 if (len == NGX_DECLINED) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
775 /* TODO: handle protocol violation:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
776 * such frame not allowed in this packet
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
777 */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
778 return NGX_ERROR;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
779 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
780
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
781 if (len < 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
782 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
783 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
784
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
785 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
786
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
787 switch (frame.type) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
788
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
789 case NGX_QUIC_FT_ACK:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
790 if (ngx_quic_handle_ack_frame(c, pkt, &frame.u.ack) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
791 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
792 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
793
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
794 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
795
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
796 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
797
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
798 if (ngx_quic_handle_crypto_frame(c, pkt, &frame.u.crypto)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
799 != NGX_OK)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
800 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
801 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
802 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
803
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
804 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
805 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
806
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
807 case NGX_QUIC_FT_PADDING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
808 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
809
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
810 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
811 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
812 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
813
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
814 case NGX_QUIC_FT_NEW_CONNECTION_ID:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
815 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
816 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
817
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
818 case NGX_QUIC_FT_CONNECTION_CLOSE:
8258
80d7144b1c38 Closing connection on NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8252
diff changeset
819 case NGX_QUIC_FT_CONNECTION_CLOSE2:
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
820
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
821 do_close = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
822 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
823
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
824 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
825 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
826 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
827 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
828 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
829 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
830 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
831 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
832
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
833 if (ngx_quic_handle_stream_frame(c, pkt, &frame.u.stream)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
834 != NGX_OK)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
835 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
836 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
837 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
838
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
839 ack_this = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
840 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
841
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
842 case NGX_QUIC_FT_MAX_DATA:
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
843 c->quic->max_data = frame.u.max_data.max_data;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
844 ack_this = 1;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
845 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
846
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8229
diff changeset
847 case NGX_QUIC_FT_RESET_STREAM:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
848 /* TODO: handle */
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8229
diff changeset
849 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8229
diff changeset
850
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8229
diff changeset
851 case NGX_QUIC_FT_STOP_SENDING:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
852 /* TODO: handle; need ack ? */
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8229
diff changeset
853 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8229
diff changeset
854
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
855 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
856 case NGX_QUIC_FT_STREAMS_BLOCKED2:
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
857
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
858 if (ngx_quic_handle_streams_blocked_frame(c, pkt,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
859 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
860 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
861 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
862 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
863 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
864
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
865 ack_this = 1;
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
866 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
867
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
868 default:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
869 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
870 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
871 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
872
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
873 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
874 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
875 "trailing garbage in payload: %ui bytes", end - p);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
876 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
877 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
878
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
879 if (do_close) {
8258
80d7144b1c38 Closing connection on NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8252
diff changeset
880 ngx_quic_close_connection(c);
80d7144b1c38 Closing connection on NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8252
diff changeset
881 return NGX_OK;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
882 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
883
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
884 if (ack_this == 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
885 /* do not ack packets with ACKs and PADDING */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
886 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
887 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
888
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
889 // packet processed, ACK it now if required
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
890 // TODO: if (ack_required) ... - currently just ack each packet
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
891
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
892 ack_frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
893 if (ack_frame == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
894 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
895 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
896
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
897 ack_frame->level = pkt->level;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
898 ack_frame->type = NGX_QUIC_FT_ACK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
899 ack_frame->u.ack.pn = pkt->pn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
900
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
901 ngx_sprintf(ack_frame->info, "ACK for PN=%d from frame handler level=%d", pkt->pn, pkt->level);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
902 ngx_quic_queue_frame(qc, ack_frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
903
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
904 return ngx_quic_output(c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
905 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
906
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
907
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
908 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
909 ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
910 ngx_quic_ack_frame_t *f)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
911 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
912 /* TODO: handle ACK here */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
913 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
914 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
915
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
916
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
917 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
918 ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
919 ngx_quic_crypto_frame_t *f)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
920 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
921 int sslerr;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
922 ssize_t n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
923 ngx_ssl_conn_t *ssl_conn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
924
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
925 if (f->offset != 0x0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
926 ngx_log_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
927 "crypto frame with non-zero offset");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
928 // TODO: add support for crypto frames spanning packets
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
929 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
930 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
931
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
932 ssl_conn = c->ssl->connection;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
933
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
934 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
935 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
936 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
937 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
938
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
939 if (!SSL_provide_quic_data(ssl_conn, SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
940 f->data, f->len))
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
941 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
942 ngx_ssl_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
943 "SSL_provide_quic_data() failed");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
944 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
945 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
946
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
947 n = SSL_do_handshake(ssl_conn);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
948
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
949 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
950
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
951 if (n == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
952 sslerr = SSL_get_error(ssl_conn, n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
953
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
954 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
955 sslerr);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
956
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
957 if (sslerr == SSL_ERROR_SSL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
958 ngx_ssl_error(NGX_LOG_ERR, c->log, 0, "SSL_do_handshake() failed");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
959 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
960 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
961
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
962 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
963 "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
964
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
965 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
966 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
967 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
968 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
969
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
970 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
971 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
972
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
973
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
974 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
975 ngx_quic_handle_stream_frame(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
976 ngx_quic_header_t *pkt, ngx_quic_stream_frame_t *f)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
977 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
978 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
979 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
980 ngx_quic_stream_node_t *sn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
981
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
982 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
983
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
984 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
985
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
986 if (sn) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
987 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "existing stream");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
988 b = sn->b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
989
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
990 if ((size_t) (b->end - b->pos) < f->length) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
991 ngx_log_error(NGX_LOG_INFO, c->log, 0, "no space in stream buffer");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
992 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
993 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
994
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
995 ngx_memcpy(b->pos, f->data, f->length);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
996 b->pos += f->length;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
997
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
998 // TODO: notify
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
999
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1000 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1001 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1002
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1003 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "stream is new");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1004
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1005 sn = ngx_quic_create_stream(c, f->stream_id);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1006 if (sn == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1007 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1008 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1009
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1010 b = sn->b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1011
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1012 ngx_memcpy(b->start, f->data, f->length);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1013 b->last = b->start + f->length;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1014
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1015 qc->streams.handler(sn->c);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1016
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1017 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1018 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1019
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1020
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1021 static ngx_int_t
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1022 ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1023 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1024 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1025 ngx_quic_frame_t *frame;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1026
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1027 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1028 if (frame == NULL) {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1029 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1030 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1031
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1032 frame->level = pkt->level;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1033 frame->type = NGX_QUIC_FT_MAX_STREAMS;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1034 frame->u.max_streams.limit = f->limit * 2;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1035 frame->u.max_streams.bidi = f->bidi;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1036
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1037 ngx_sprintf(frame->info, "MAX_STREAMS limit:%d bidi:%d level=%d",
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1038 (int) frame->u.max_streams.limit,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1039 (int) frame->u.max_streams.bidi,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1040 frame->level);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1041
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1042 ngx_quic_queue_frame(c->quic, frame);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1043
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1044 return NGX_OK;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1045 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1046
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1047
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1048 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1049 ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1050 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1051 ngx_quic_frame_t *f;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1052
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1053 if (qc->frames == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1054 qc->frames = frame;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1055 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1056 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1057
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1058 for (f = qc->frames; f->next; f = f->next) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1059 if (f->next->level > frame->level) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1060 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1061 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1062 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1063
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1064 frame->next = f->next;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1065 f->next = frame;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1066 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1067
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1068
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1069 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1070 ngx_quic_output(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1071 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1072 size_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1073 ngx_uint_t lvl;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1074 ngx_quic_frame_t *f, *start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1075 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1076
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1077 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1078
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1079 if (qc->frames == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1080 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1081 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1082
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1083 lvl = qc->frames->level;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1084 start = qc->frames;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1085 f = start;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1086
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1087 do {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1088 len = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1089
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1090 do {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1091 /* process same-level group of frames */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1092
8241
db745339e54b The ngx_quic_frame_len() function is not really needed.
Vladimir Homutov <vl@nginx.com>
parents: 8240
diff changeset
1093 len += ngx_quic_create_frame(NULL, NULL, f);// TODO: handle overflow, max size
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1094
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1095 f = f->next;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1096 } while (f && f->level == lvl);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1097
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1098
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1099 if (ngx_quic_frames_send(c, start, f, len) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1100 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1101 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1102
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1103 if (f == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1104 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1105 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1106
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1107 lvl = f->level; // TODO: must not decrease (ever, also between calls)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1108 start = f;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1109
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1110 } while (1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1111
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1112 qc->frames = NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1113
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1114 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1115 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1116
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1117
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1118 /* pack a group of frames [start; end) into memory p and send as single packet */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1119 ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1120 ngx_quic_frames_send(ngx_connection_t *c, ngx_quic_frame_t *start,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1121 ngx_quic_frame_t *end, size_t total)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1122 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1123 ssize_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1124 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1125 ngx_str_t out;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1126 ngx_quic_frame_t *f;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1127
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1128 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1129 "sending frames %p...%p", start, end);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1130
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1131 p = ngx_pnalloc(c->pool, total);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1132 if (p == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1133 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1134 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1135
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1136 out.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1137
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1138 for (f = start; f != end; f = f->next) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1139
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1140 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "frame: %s", f->info);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1141
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1142 len = ngx_quic_create_frame(p, p + total, f);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1143 if (len == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1144 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1145 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1146
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1147 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1148 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1149
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1150 out.len = p - out.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1151
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1152 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1153 "packet ready: %ui bytes at level %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1154 out.len, start->level);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1155
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1156 // IOVEC/sendmsg_chain ?
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1157 if (ngx_quic_send_packet(c, c->quic, start->level, &out) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1158 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1159 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1160
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1161 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1162 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1163
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1164
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1165 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1166 ngx_quic_send_packet(ngx_connection_t *c, ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1167 enum ssl_encryption_level_t level, ngx_str_t *payload)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1168 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1169 ngx_str_t res;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1170 ngx_quic_header_t pkt;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1171
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1172 pkt.log = c->log;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1173
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1174 static ngx_str_t initial_token = ngx_null_string;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1175
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1176 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1177 ngx_quic_hexdump0(c->log, "payload", payload->data, payload->len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1178
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1179 pkt.level = level;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1180 pkt.dcid = qc->dcid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1181 pkt.scid = qc->scid;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1182
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1183 if (level == ssl_encryption_initial) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1184 pkt.number = &qc->initial_pn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1185 pkt.flags = NGX_QUIC_PKT_INITIAL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1186 pkt.secret = &qc->secrets.server.in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1187 pkt.token = initial_token;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1188
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1189 } else if (level == ssl_encryption_handshake) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1190 pkt.number = &qc->handshake_pn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1191 pkt.flags = NGX_QUIC_PKT_HANDSHAKE;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1192 pkt.secret = &qc->secrets.server.hs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1193
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1194 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1195 pkt.number = &qc->appdata_pn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1196 pkt.secret = &qc->secrets.server.ad;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1197 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1198
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1199 if (ngx_quic_encrypt(c->pool, c->ssl->connection, &pkt, payload, &res)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1200 != NGX_OK)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1201 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1202 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1203 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1204
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1205 ngx_quic_hexdump0(c->log, "packet to send", res.data, res.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1206
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1207 c->send(c, res.data, res.len); // TODO: err handling
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1208
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1209 (*pkt.number)++;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1210
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1211 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1212 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1213
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1214
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1215 ngx_connection_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1216 ngx_quic_create_uni_stream(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1217 {
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1218 ngx_uint_t id;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1219 ngx_quic_stream_t *qs;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1220 ngx_quic_connection_t *qc;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1221 ngx_quic_stream_node_t *sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1222
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1223 qs = c->qs;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1224 qc = qs->parent->quic;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1225
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1226 /*
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1227 * A stream ID is a 62-bit integer that is unique for all streams
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1228 * on a connection.
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1229 *
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1230 * 0x3 | Server-Initiated, Unidirectional
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1231 */
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1232 id = (qc->streams.id_counter << 2) | 0x3;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1233
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1234 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1235 "creating server uni stream #%ui id %ui",
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1236 qc->streams.id_counter, id);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1237
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1238 qc->streams.id_counter++;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1239
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1240 sn = ngx_quic_create_stream(qs->parent, id);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1241 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1242 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1243 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1244
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1245 return sn->c;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1246 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1247
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1248
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1249 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1250 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1251 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1252 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1253 ngx_rbtree_node_t **p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1254 ngx_quic_stream_node_t *qn, *qnt;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1255
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1256 for ( ;; ) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1257
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1258 if (node->key < temp->key) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1259
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1260 p = &temp->left;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1261
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1262 } else if (node->key > temp->key) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1263
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1264 p = &temp->right;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1265
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1266 } else { /* node->key == temp->key */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1267
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1268 qn = (ngx_quic_stream_node_t *) &node->color;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1269 qnt = (ngx_quic_stream_node_t *) &temp->color;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1270
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1271 if (qn->c < qnt->c) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1272 p = &temp->left;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1273 } else {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1274 p = &temp->right;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1275 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1276 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1277
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1278 if (*p == sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1279 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1280 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1281
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1282 temp = *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1283 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1284
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1285 *p = node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1286 node->parent = temp;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1287 node->left = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1288 node->right = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1289 ngx_rbt_red(node);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1290 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1291
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1292
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1293 static ngx_quic_stream_node_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1294 ngx_quic_find_stream(ngx_rbtree_t *rbtree, ngx_uint_t key)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1295 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1296 ngx_rbtree_node_t *node, *sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1297
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1298 node = rbtree->root;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1299 sentinel = rbtree->sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1300
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1301 while (node != sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1302
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1303 if (key == node->key) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1304 return (ngx_quic_stream_node_t *) node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1305 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1306
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1307 node = (key < node->key) ? node->left : node->right;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1308 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1309
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1310 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1311 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1312
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1313
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1314 static ngx_quic_stream_node_t *
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1315 ngx_quic_create_stream(ngx_connection_t *c, ngx_uint_t id)
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1316 {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1317 ngx_log_t *log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1318 ngx_pool_t *pool;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1319 ngx_event_t *rev, *wev;
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1320 ngx_pool_cleanup_t *cln;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1321 ngx_quic_connection_t *qc;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1322 ngx_quic_stream_node_t *sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1323
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1324 qc = c->quic;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1325
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1326 sn = ngx_pcalloc(c->pool, sizeof(ngx_quic_stream_node_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1327 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1328 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1329 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1330
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1331 sn->c = ngx_get_connection(-1, c->log); // TODO: free on connection termination
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1332 if (sn->c == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1333 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1334 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1335
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1336 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1337 if (pool == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1338 /* XXX free connection */
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1339 // TODO: add pool cleanup handdler
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1340 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1341 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1342
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1343 log = ngx_palloc(pool, sizeof(ngx_log_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1344 if (log == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1345 /* XXX free pool and connection */
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1346 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1347 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1348
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1349 *log = *c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1350 pool->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1351
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1352 sn->c->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1353 sn->c->pool = pool;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1354
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1355 sn->c->listening = c->listening;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1356 sn->c->sockaddr = c->sockaddr;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1357 sn->c->local_sockaddr = c->local_sockaddr;
8234
19bb9edcd8bd Added copying addr_text to QUIC stream connections.
Roman Arutyunyan <arut@nginx.com>
parents: 8232
diff changeset
1358 sn->c->addr_text = c->addr_text;
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1359
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1360 rev = sn->c->read;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1361 wev = sn->c->write;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1362
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1363 rev->ready = 1;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1364
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1365 rev->log = c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1366 wev->log = c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1367
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1368 sn->c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1369
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1370 sn->node.key =id;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1371 sn->b = ngx_create_temp_buf(pool, 16 * 1024); // XXX enough for everyone
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1372 if (sn->b == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1373 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1374 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1375
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1376 ngx_rbtree_insert(&qc->streams.tree, &sn->node);
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1377
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1378 sn->s.id = id;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1379 sn->s.unidirectional = (sn->s.id & 0x02) ? 1 : 0;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1380 sn->s.parent = c;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1381 sn->c->qs = &sn->s;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1382
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1383 sn->c->recv = ngx_quic_stream_recv;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1384 sn->c->send = ngx_quic_stream_send;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1385 sn->c->send_chain = ngx_quic_stream_send_chain;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1386
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1387 cln = ngx_pool_cleanup_add(pool, 0);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1388 if (cln == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1389 ngx_close_connection(sn->c);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1390 ngx_destroy_pool(pool);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1391 return NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1392 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1393
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1394 cln->handler = ngx_quic_stream_cleanup_handler;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1395 cln->data = sn->c;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1396
8229
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1397 return sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1398 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1399
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 8225
diff changeset
1400
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1401 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1402 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1403 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1404 ssize_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1405 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1406 ngx_quic_stream_t *qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1407 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1408 ngx_quic_stream_node_t *sn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1409
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1410 qs = c->qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1411 qc = qs->parent->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1412
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1413 // XXX: get direct pointer from stream structure?
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1414 sn = ngx_quic_find_stream(&qc->streams.tree, qs->id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1415
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1416 if (sn == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1417 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1418 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1419
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1420 // XXX: how to return EOF?
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1421
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1422 b = sn->b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1423
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1424 if (b->last - b->pos == 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1425 c->read->ready = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1426 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1427 "quic recv() not ready");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1428 return NGX_AGAIN; // ?
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1429 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1430
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1431 len = ngx_min(b->last - b->pos, (ssize_t) size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1432
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1433 ngx_memcpy(buf, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1434
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1435 b->pos += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1436
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1437 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1438 "quic recv: %z of %uz", len, size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1439
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1440 return len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1441 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1442
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1443
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1444 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1445 ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1446 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1447 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1448 ngx_connection_t *pc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1449 ngx_quic_frame_t *frame;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1450 ngx_quic_stream_t *qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1451 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1452 ngx_quic_stream_node_t *sn;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1453
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1454 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send: %uz", size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1455
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1456 qs = c->qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1457 pc = qs->parent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1458 qc = pc->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1459
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1460 // XXX: get direct pointer from stream structure?
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1461 sn = ngx_quic_find_stream(&qc->streams.tree, qs->id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1462
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1463 if (sn == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1464 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1465 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1466
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1467 frame = ngx_pcalloc(pc->pool, sizeof(ngx_quic_frame_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1468 if (frame == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1469 return 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1470 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1471
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1472 p = ngx_pnalloc(pc->pool, size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1473 if (p == NULL) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1474 return 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1475 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1476
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1477 ngx_memcpy(p, buf, size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1478
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1479 frame->level = ssl_encryption_application;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1480 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1481 frame->u.stream.off = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1482 frame->u.stream.len = 1;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1483 frame->u.stream.fin = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1484
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1485 frame->u.stream.type = frame->type;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1486 frame->u.stream.stream_id = qs->id;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1487 frame->u.stream.offset = c->sent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1488 frame->u.stream.length = size;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1489 frame->u.stream.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1490
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1491 c->sent += size;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1492
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1493 ngx_sprintf(frame->info, "stream %xi len=%ui level=%d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1494 qs->id, size, frame->level);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1495
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1496 ngx_quic_queue_frame(qc, frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1497
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1498 return size;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1499 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1500
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1501
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1502 static void
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1503 ngx_quic_stream_cleanup_handler(void *data)
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1504 {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1505 ngx_connection_t *c = data;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1506
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1507 ngx_connection_t *pc;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1508 ngx_quic_frame_t *frame;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1509 ngx_quic_stream_t *qs;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1510 ngx_quic_connection_t *qc;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1511 ngx_quic_stream_node_t *sn;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1512
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1513 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic send fin");
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1514
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1515 qs = c->qs;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1516 pc = qs->parent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1517 qc = pc->quic;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1518
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1519 if ((qs->id & 0x03) == 0x02) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1520 /* do not send fin for client unidirectional streams */
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1521 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1522 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1523
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1524 // XXX: get direct pointer from stream structure?
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1525 sn = ngx_quic_find_stream(&qc->streams.tree, qs->id);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1526
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1527 if (sn == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1528 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1529 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1530
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1531 frame = ngx_pcalloc(pc->pool, sizeof(ngx_quic_frame_t));
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1532 if (frame == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1533 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1534 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1535
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1536 frame->level = ssl_encryption_application;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1537 frame->type = NGX_QUIC_FT_STREAM7; /* OFF=1 LEN=1 FIN=1 */
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1538 frame->u.stream.off = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1539 frame->u.stream.len = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1540 frame->u.stream.fin = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1541
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1542 frame->u.stream.type = frame->type;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1543 frame->u.stream.stream_id = qs->id;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1544 frame->u.stream.offset = c->sent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1545 frame->u.stream.length = 0;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1546 frame->u.stream.data = NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1547
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1548 ngx_sprintf(frame->info, "stream %xi fin=1 level=%d", qs->id, frame->level);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1549
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1550 ngx_quic_queue_frame(qc, frame);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1551 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1552
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1553
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1554 static ngx_chain_t *
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1555 ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1556 off_t limit)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1557 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1558 size_t len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1559 ssize_t n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1560 ngx_buf_t *b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1561
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1562 for ( /* void */; in; in = in->next) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1563 b = in->buf;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1564
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1565 if (!ngx_buf_in_memory(b)) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1566 continue;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1567 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1568
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1569 if (ngx_buf_size(b) == 0) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1570 continue;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1571 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1572
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1573 len = b->last - b->pos;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1574
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1575 n = ngx_quic_stream_send(c, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1576
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1577 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1578 return NGX_CHAIN_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1579 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1580
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1581 if (n == NGX_AGAIN) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1582 return in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1583 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1584
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1585 if (n != (ssize_t) len) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1586 b->pos += n;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1587 return in;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1588 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1589 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1590
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1591 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1592 }