Mercurial > hg > nginx
annotate src/event/quic/ngx_event_quic.c @ 8737:76f476ce4d31 quic
QUIC: distinct files for connection migration.
The connection migration-related code from quic.c with dependencies is moved
into separate file.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Wed, 31 Mar 2021 14:57:15 +0300 |
parents | 714e9af983de |
children | fa24745b8c06 |
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 | 7 #include <ngx_config.h> |
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> |
8486
d0ac4449a07f
QUIC: fixed bulding perl module by reducing header pollution.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8483
diff
changeset
|
10 #include <ngx_event_quic_transport.h> |
d0ac4449a07f
QUIC: fixed bulding perl module by reducing header pollution.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8483
diff
changeset
|
11 #include <ngx_event_quic_protection.h> |
8736
714e9af983de
QUIC: separate header for ngx_quic_connection_t.
Vladimir Homutov <vl@nginx.com>
parents:
8735
diff
changeset
|
12 #include <ngx_event_quic_connection.h> |
8737
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
13 #include <ngx_event_quic_migration.h> |
8686 | 14 #include <ngx_sha1.h> |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
15 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
16 |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
17 #define ngx_quic_lost_threshold(qc) \ |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
18 ngx_max(NGX_QUIC_TIME_THR * ngx_max((qc)->latest_rtt, (qc)->avg_rtt), \ |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
19 NGX_QUIC_TIME_GRANULARITY) |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
20 |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
21 /* |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
22 * 7.4. Cryptographic Message Buffering |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
23 * Implementations MUST support buffering at least 4096 bytes of data |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
24 */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
25 #define NGX_QUIC_MAX_BUFFERED 65535 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
26 |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
27 #define NGX_QUIC_STREAM_GONE (void *) -1 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
28 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
29 #define NGX_QUIC_UNSET_PN (uint64_t) -1 |
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
30 |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
31 /* |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
32 * Endpoints MUST discard packets that are too small to be valid QUIC |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
33 * packets. With the set of AEAD functions defined in [QUIC-TLS], |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
34 * packets that are smaller than 21 bytes are never valid. |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
35 */ |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
36 #define NGX_QUIC_MIN_PKT_LEN 21 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
37 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
38 #define NGX_QUIC_MIN_SR_PACKET 43 /* 5 random + 16 srt + 22 padding */ |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
39 #define NGX_QUIC_MAX_SR_PACKET 1200 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
40 |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
41 #define NGX_QUIC_MAX_ACK_GAP 2 |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
42 |
8307
dc7ac778aafe
Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents:
8306
diff
changeset
|
43 |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
44 typedef ngx_int_t (*ngx_quic_frame_handler_pt)(ngx_connection_t *c, |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
45 ngx_quic_frame_t *frame, void *data); |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
46 |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
47 |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
48 #if BORINGSSL_API_VERSION >= 10 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
49 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
|
50 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
|
51 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
|
52 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
|
53 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
|
54 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
|
55 #else |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
56 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
|
57 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
|
58 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
|
59 #endif |
8225 | 60 |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
61 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
|
62 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
|
63 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
|
64 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
|
65 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
|
66 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
67 |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
68 static ngx_int_t ngx_quic_apply_transport_params(ngx_connection_t *c, |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
69 ngx_quic_tp_t *ctp); |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
70 static ngx_quic_connection_t *ngx_quic_new_connection(ngx_connection_t *c, |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
71 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
72 static ngx_int_t ngx_quic_send_stateless_reset(ngx_connection_t *c, |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
73 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
74 static ngx_int_t ngx_quic_new_sr_token(ngx_connection_t *c, ngx_str_t *cid, |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
75 u_char *secret, u_char *token); |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
76 static ngx_int_t ngx_quic_process_stateless_reset(ngx_connection_t *c, |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
77 ngx_quic_header_t *pkt); |
8522
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
78 static ngx_int_t ngx_quic_negotiate_version(ngx_connection_t *c, |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
79 ngx_quic_header_t *inpkt); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
80 static ngx_int_t ngx_quic_create_server_id(ngx_connection_t *c, u_char *id); |
8676
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
81 #if (NGX_QUIC_BPF) |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
82 static ngx_int_t ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id); |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
83 #endif |
8686 | 84 static ngx_int_t ngx_quic_send_retry(ngx_connection_t *c, |
85 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); | |
86 static ngx_int_t ngx_quic_new_token(ngx_connection_t *c, u_char *key, | |
87 ngx_str_t *token, ngx_str_t *odcid, time_t expires, ngx_uint_t is_retry); | |
88 static void ngx_quic_address_hash(ngx_connection_t *c, ngx_uint_t no_port, | |
89 u_char buf[20]); | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
90 static ngx_int_t ngx_quic_validate_token(ngx_connection_t *c, |
8686 | 91 u_char *key, ngx_quic_header_t *pkt); |
8225 | 92 static ngx_int_t ngx_quic_init_connection(ngx_connection_t *c); |
8436
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
93 static ngx_inline size_t ngx_quic_max_udp_payload(ngx_connection_t *c); |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
94 static void ngx_quic_input_handler(ngx_event_t *rev); |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
95 |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
96 static ngx_int_t ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
97 static void ngx_quic_close_timer_handler(ngx_event_t *ev); |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
98 static ngx_int_t ngx_quic_close_streams(ngx_connection_t *c, |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
99 ngx_quic_connection_t *qc); |
8225 | 100 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
101 static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
102 ngx_quic_conf_t *conf); |
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
103 static ngx_int_t ngx_quic_process_packet(ngx_connection_t *c, |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
104 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
105 static ngx_int_t ngx_quic_process_payload(ngx_connection_t *c, |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
106 ngx_quic_header_t *pkt); |
8686 | 107 static ngx_int_t ngx_quic_send_early_cc(ngx_connection_t *c, |
108 ngx_quic_header_t *inpkt, ngx_uint_t err, const char *reason); | |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
109 static void ngx_quic_discard_ctx(ngx_connection_t *c, |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
110 enum ssl_encryption_level_t level); |
8688
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
111 static ngx_int_t ngx_quic_check_csid(ngx_quic_connection_t *qc, |
8361 | 112 ngx_quic_header_t *pkt); |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
113 static ngx_int_t ngx_quic_handle_frames(ngx_connection_t *c, |
8225 | 114 ngx_quic_header_t *pkt); |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
115 static ngx_int_t ngx_quic_ack_packet(ngx_connection_t *c, |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
116 ngx_quic_header_t *pkt); |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
117 static ngx_int_t ngx_quic_send_ack_range(ngx_connection_t *c, |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
118 ngx_quic_send_ctx_t *ctx, uint64_t smallest, uint64_t largest); |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
119 static void ngx_quic_drop_ack_ranges(ngx_connection_t *c, |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
120 ngx_quic_send_ctx_t *ctx, uint64_t pn); |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
121 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c, |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
122 ngx_quic_send_ctx_t *ctx); |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
123 static ngx_int_t ngx_quic_send_cc(ngx_connection_t *c); |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
124 static ngx_int_t ngx_quic_send_new_token(ngx_connection_t *c); |
8225 | 125 |
126 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c, | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
127 ngx_quic_header_t *pkt, ngx_quic_frame_t *f); |
8326 | 128 static ngx_int_t ngx_quic_handle_ack_frame_range(ngx_connection_t *c, |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
129 ngx_quic_send_ctx_t *ctx, uint64_t min, uint64_t max, |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
130 ngx_msec_t *send_time); |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
131 static void ngx_quic_rtt_sample(ngx_connection_t *c, ngx_quic_ack_frame_t *ack, |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
132 enum ssl_encryption_level_t level, ngx_msec_t send_time); |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
133 static void ngx_quic_handle_stream_ack(ngx_connection_t *c, |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
134 ngx_quic_frame_t *f); |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
135 |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
136 static ngx_int_t ngx_quic_handle_ordered_frame(ngx_connection_t *c, |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
137 ngx_quic_frames_stream_t *fs, ngx_quic_frame_t *frame, |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
138 ngx_quic_frame_handler_pt handler, void *data); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
139 static ngx_int_t ngx_quic_adjust_frame_offset(ngx_connection_t *c, |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
140 ngx_quic_frame_t *f, uint64_t offset_in); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
141 static ngx_int_t ngx_quic_buffer_frame(ngx_connection_t *c, |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
142 ngx_quic_frames_stream_t *stream, ngx_quic_frame_t *f); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
143 |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
144 static ngx_int_t ngx_quic_handle_crypto_frame(ngx_connection_t *c, |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
145 ngx_quic_header_t *pkt, ngx_quic_frame_t *frame); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
146 static ngx_int_t ngx_quic_crypto_input(ngx_connection_t *c, |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
147 ngx_quic_frame_t *frame, void *data); |
8225 | 148 static ngx_int_t ngx_quic_handle_stream_frame(ngx_connection_t *c, |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
149 ngx_quic_header_t *pkt, ngx_quic_frame_t *frame); |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
150 static ngx_int_t ngx_quic_stream_input(ngx_connection_t *c, |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
151 ngx_quic_frame_t *frame, void *data); |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
152 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
153 static ngx_int_t ngx_quic_handle_max_data_frame(ngx_connection_t *c, |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
154 ngx_quic_max_data_frame_t *f); |
8245
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
155 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
|
156 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f); |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
157 static ngx_int_t ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c, |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
158 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f); |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
159 static ngx_int_t ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c, |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
160 ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f); |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
161 static ngx_int_t ngx_quic_handle_reset_stream_frame(ngx_connection_t *c, |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
162 ngx_quic_header_t *pkt, ngx_quic_reset_stream_frame_t *f); |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
163 static ngx_int_t ngx_quic_handle_stop_sending_frame(ngx_connection_t *c, |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
164 ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f); |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
165 static ngx_int_t ngx_quic_handle_max_streams_frame(ngx_connection_t *c, |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
166 ngx_quic_header_t *pkt, ngx_quic_max_streams_frame_t *f); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
167 static ngx_int_t ngx_quic_handle_new_connection_id_frame(ngx_connection_t *c, |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
168 ngx_quic_header_t *pkt, ngx_quic_new_conn_id_frame_t *f); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
169 static ngx_int_t ngx_quic_retire_connection_id(ngx_connection_t *c, |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
170 enum ssl_encryption_level_t level, uint64_t seqnum); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
171 static ngx_int_t ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
172 ngx_quic_header_t *pkt, ngx_quic_retire_cid_frame_t *f); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
173 static ngx_int_t ngx_quic_issue_server_ids(ngx_connection_t *c); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
174 static void ngx_quic_clear_temp_server_ids(ngx_connection_t *c); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
175 static ngx_quic_server_id_t *ngx_quic_insert_server_id(ngx_connection_t *c, |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
176 ngx_quic_connection_t *qc, ngx_str_t *id); |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
177 static ngx_quic_client_id_t *ngx_quic_alloc_client_id(ngx_connection_t *c, |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
178 ngx_quic_connection_t *qc); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
179 static ngx_quic_server_id_t *ngx_quic_alloc_server_id(ngx_connection_t *c, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
180 ngx_quic_connection_t *qc); |
8225 | 181 |
182 static ngx_int_t ngx_quic_output(ngx_connection_t *c); | |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
183 static ngx_uint_t ngx_quic_get_padding_level(ngx_connection_t *c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
184 static ngx_int_t ngx_quic_generate_ack(ngx_connection_t *c, |
8332
6ad871b63422
Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents:
8331
diff
changeset
|
185 ngx_quic_send_ctx_t *ctx); |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
186 static ssize_t ngx_quic_output_packet(ngx_connection_t *c, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
187 ngx_quic_send_ctx_t *ctx, u_char *data, size_t max, size_t min); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
188 static ngx_int_t ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
189 size_t len); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
190 static void ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames); |
8656
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
191 static ssize_t ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len); |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
192 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
193 static void ngx_quic_set_packet_number(ngx_quic_header_t *pkt, |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
194 ngx_quic_send_ctx_t *ctx); |
8472 | 195 static void ngx_quic_pto_handler(ngx_event_t *ev); |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
196 static void ngx_quic_lost_handler(ngx_event_t *ev); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
197 static ngx_int_t ngx_quic_detect_lost(ngx_connection_t *c); |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
198 static void ngx_quic_set_lost_timer(ngx_connection_t *c); |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
199 static void ngx_quic_resend_frames(ngx_connection_t *c, |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
200 ngx_quic_send_ctx_t *ctx); |
8309 | 201 static void ngx_quic_push_handler(ngx_event_t *ev); |
8225 | 202 |
203 static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp, | |
204 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); | |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
205 static ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree, |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
206 uint64_t id); |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
207 static ngx_quic_stream_t *ngx_quic_create_client_stream(ngx_connection_t *c, |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
208 uint64_t id); |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
209 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c, |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
210 uint64_t id, size_t rcvbuf_size); |
8211
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
211 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
|
212 size_t size); |
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
213 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
|
214 size_t size); |
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
215 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
|
216 ngx_chain_t *in, off_t limit); |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
217 static size_t ngx_quic_max_stream_flow(ngx_connection_t *c); |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
218 static void ngx_quic_stream_cleanup_handler(void *data); |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
219 static void ngx_quic_shutdown_quic(ngx_connection_t *c); |
8286 | 220 static void ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame); |
8211
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
221 |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
222 static void ngx_quic_congestion_ack(ngx_connection_t *c, |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
223 ngx_quic_frame_t *frame); |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
224 static void ngx_quic_congestion_lost(ngx_connection_t *c, |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
225 ngx_quic_frame_t *frame); |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
226 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
227 static ngx_chain_t *ngx_quic_alloc_buf(ngx_connection_t *c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
228 static void ngx_quic_free_bufs(ngx_connection_t *c, ngx_chain_t *in); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
229 static ngx_chain_t *ngx_quic_copy_buf(ngx_connection_t *c, u_char *data, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
230 size_t len); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
231 static ngx_chain_t *ngx_quic_copy_chain(ngx_connection_t *c, ngx_chain_t *in, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
232 size_t limit); |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
233 static ngx_chain_t *ngx_quic_split_bufs(ngx_connection_t *c, ngx_chain_t *in, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
234 size_t len); |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
235 |
8225 | 236 |
8674 | 237 static ngx_core_module_t ngx_quic_module_ctx = { |
238 ngx_string("quic"), | |
239 NULL, | |
240 NULL | |
241 }; | |
242 | |
243 | |
244 ngx_module_t ngx_quic_module = { | |
245 NGX_MODULE_V1, | |
246 &ngx_quic_module_ctx, /* module context */ | |
247 NULL, /* module directives */ | |
248 NGX_CORE_MODULE, /* module type */ | |
249 NULL, /* init master */ | |
250 NULL, /* init module */ | |
251 NULL, /* init process */ | |
252 NULL, /* init thread */ | |
253 NULL, /* exit thread */ | |
254 NULL, /* exit process */ | |
255 NULL, /* exit master */ | |
256 NGX_MODULE_V1_PADDING | |
257 }; | |
258 | |
259 | |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
260 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
|
261 #if BORINGSSL_API_VERSION >= 10 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
262 ngx_quic_set_read_secret, |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
263 ngx_quic_set_write_secret, |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
264 #else |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
265 ngx_quic_set_encryption_secrets, |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
266 #endif |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
267 ngx_quic_add_handshake_data, |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
268 ngx_quic_flush_flight, |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
269 ngx_quic_send_alert, |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
270 }; |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
271 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
272 |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
273 #if (NGX_DEBUG) |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
274 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
275 static void |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
276 ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx) |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
277 { |
8613
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
278 u_char *p, *last, *pos, *end; |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
279 ssize_t n; |
8614
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
280 uint64_t gap, range, largest, smallest; |
8613
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
281 ngx_uint_t i; |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
282 u_char buf[NGX_MAX_ERROR_STR]; |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
283 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
284 p = buf; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
285 last = buf + sizeof(buf); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
286 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
287 switch (f->type) { |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
288 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
289 case NGX_QUIC_FT_CRYPTO: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
290 p = ngx_slprintf(p, last, "CRYPTO len:%uL off:%uL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
291 f->u.crypto.length, f->u.crypto.offset); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
292 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
293 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
294 case NGX_QUIC_FT_PADDING: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
295 p = ngx_slprintf(p, last, "PADDING"); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
296 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
297 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
298 case NGX_QUIC_FT_ACK: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
299 case NGX_QUIC_FT_ACK_ECN: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
300 |
8614
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
301 p = ngx_slprintf(p, last, "ACK n:%ui delay:%uL ", |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
302 f->u.ack.range_count, f->u.ack.delay); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
303 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
304 if (f->data) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
305 pos = f->data->buf->pos; |
8695
0b3d70fbba99
QUIC: fixed logging ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8694
diff
changeset
|
306 end = f->data->buf->last; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
307 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
308 } else { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
309 pos = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
310 end = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
311 } |
8613
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
312 |
8614
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
313 largest = f->u.ack.largest; |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
314 smallest = f->u.ack.largest - f->u.ack.first_range; |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
315 |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
316 if (largest == smallest) { |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
317 p = ngx_slprintf(p, last, "%uL", largest); |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
318 |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
319 } else { |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
320 p = ngx_slprintf(p, last, "%uL-%uL", largest, smallest); |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
321 } |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
322 |
8613
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
323 for (i = 0; i < f->u.ack.range_count; i++) { |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
324 n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range); |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
325 if (n == NGX_ERROR) { |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
326 break; |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
327 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
328 |
8613
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
329 pos += n; |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
330 |
8614
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
331 largest = smallest - gap - 2; |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
332 smallest = largest - range; |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
333 |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
334 if (largest == smallest) { |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
335 p = ngx_slprintf(p, last, " %uL", largest); |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
336 |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
337 } else { |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
338 p = ngx_slprintf(p, last, " %uL-%uL", largest, smallest); |
3d79c08bb0f1
QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8613
diff
changeset
|
339 } |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
340 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
341 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
342 if (f->type == NGX_QUIC_FT_ACK_ECN) { |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
343 p = ngx_slprintf(p, last, " ECN counters ect0:%uL ect1:%uL ce:%uL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
344 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
345 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
346 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
347 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
348 case NGX_QUIC_FT_PING: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
349 p = ngx_slprintf(p, last, "PING"); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
350 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
351 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
352 case NGX_QUIC_FT_NEW_CONNECTION_ID: |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
353 p = ngx_slprintf(p, last, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
354 "NEW_CONNECTION_ID seq:%uL retire:%uL len:%ud", |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
355 f->u.ncid.seqnum, f->u.ncid.retire, f->u.ncid.len); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
356 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
357 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
358 case NGX_QUIC_FT_RETIRE_CONNECTION_ID: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
359 p = ngx_slprintf(p, last, "RETIRE_CONNECTION_ID seqnum:%uL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
360 f->u.retire_cid.sequence_number); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
361 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
362 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
363 case NGX_QUIC_FT_CONNECTION_CLOSE: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
364 case NGX_QUIC_FT_CONNECTION_CLOSE_APP: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
365 p = ngx_slprintf(p, last, "CONNECTION_CLOSE%s err:%ui", |
8692
0697294f79a4
QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8688
diff
changeset
|
366 f->type == NGX_QUIC_FT_CONNECTION_CLOSE ? "" : "_APP", |
0697294f79a4
QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8688
diff
changeset
|
367 f->u.close.error_code); |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
368 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
369 if (f->u.close.reason.len) { |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
370 p = ngx_slprintf(p, last, " %V", &f->u.close.reason); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
371 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
372 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
373 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) { |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
374 p = ngx_slprintf(p, last, " ft:%ui", f->u.close.frame_type); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
375 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
376 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
377 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
378 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
379 case NGX_QUIC_FT_STREAM0: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
380 case NGX_QUIC_FT_STREAM1: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
381 case NGX_QUIC_FT_STREAM2: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
382 case NGX_QUIC_FT_STREAM3: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
383 case NGX_QUIC_FT_STREAM4: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
384 case NGX_QUIC_FT_STREAM5: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
385 case NGX_QUIC_FT_STREAM6: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
386 case NGX_QUIC_FT_STREAM7: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
387 |
8615
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
388 p = ngx_slprintf(p, last, "STREAM id:0x%xL", f->u.stream.stream_id); |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
389 |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
390 if (f->u.stream.off) { |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
391 p = ngx_slprintf(p, last, " off:%uL", f->u.stream.offset); |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
392 } |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
393 |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
394 if (f->u.stream.len) { |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
395 p = ngx_slprintf(p, last, " len:%uL", f->u.stream.length); |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
396 } |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
397 |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
398 if (f->u.stream.fin) { |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
399 p = ngx_slprintf(p, last, " fin:1"); |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
400 } |
27e305834078
QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
401 |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
402 #ifdef NGX_QUIC_DEBUG_FRAMES |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
403 { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
404 ngx_chain_t *cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
405 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
406 p = ngx_slprintf(p, last, " data:"); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
407 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
408 for (cl = f->data; cl; cl = cl->next) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
409 p = ngx_slprintf(p, last, "%*xs", |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
410 cl->buf->last - cl->buf->pos, cl->buf->pos); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
411 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
412 } |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
413 #endif |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
414 |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
415 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
416 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
417 case NGX_QUIC_FT_MAX_DATA: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
418 p = ngx_slprintf(p, last, "MAX_DATA max_data:%uL on recv", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
419 f->u.max_data.max_data); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
420 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
421 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
422 case NGX_QUIC_FT_RESET_STREAM: |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
423 p = ngx_slprintf(p, last, "RESET_STREAM" |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
424 " id:0x%xL error_code:0x%xL final_size:0x%xL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
425 f->u.reset_stream.id, f->u.reset_stream.error_code, |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
426 f->u.reset_stream.final_size); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
427 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
428 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
429 case NGX_QUIC_FT_STOP_SENDING: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
430 p = ngx_slprintf(p, last, "STOP_SENDING id:0x%xL err:0x%xL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
431 f->u.stop_sending.id, f->u.stop_sending.error_code); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
432 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
433 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
434 case NGX_QUIC_FT_STREAMS_BLOCKED: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
435 case NGX_QUIC_FT_STREAMS_BLOCKED2: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
436 p = ngx_slprintf(p, last, "STREAMS_BLOCKED limit:%uL bidi:%ui", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
437 f->u.streams_blocked.limit, f->u.streams_blocked.bidi); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
438 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
439 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
440 case NGX_QUIC_FT_MAX_STREAMS: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
441 case NGX_QUIC_FT_MAX_STREAMS2: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
442 p = ngx_slprintf(p, last, "MAX_STREAMS limit:%uL bidi:%ui", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
443 f->u.max_streams.limit, f->u.max_streams.bidi); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
444 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
445 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
446 case NGX_QUIC_FT_MAX_STREAM_DATA: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
447 p = ngx_slprintf(p, last, "MAX_STREAM_DATA id:0x%xL limit:%uL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
448 f->u.max_stream_data.id, f->u.max_stream_data.limit); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
449 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
450 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
451 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
452 case NGX_QUIC_FT_DATA_BLOCKED: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
453 p = ngx_slprintf(p, last, "DATA_BLOCKED limit:%uL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
454 f->u.data_blocked.limit); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
455 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
456 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
457 case NGX_QUIC_FT_STREAM_DATA_BLOCKED: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
458 p = ngx_slprintf(p, last, "STREAM_DATA_BLOCKED id:0x%xL limit:%uL", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
459 f->u.stream_data_blocked.id, |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
460 f->u.stream_data_blocked.limit); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
461 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
462 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
463 case NGX_QUIC_FT_PATH_CHALLENGE: |
8670
b14338acbf9d
QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8663
diff
changeset
|
464 p = ngx_slprintf(p, last, "PATH_CHALLENGE data:0x%*xs", |
b14338acbf9d
QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8663
diff
changeset
|
465 sizeof(f->u.path_challenge.data), |
b14338acbf9d
QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8663
diff
changeset
|
466 f->u.path_challenge.data); |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
467 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
468 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
469 case NGX_QUIC_FT_PATH_RESPONSE: |
8670
b14338acbf9d
QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8663
diff
changeset
|
470 p = ngx_slprintf(p, last, "PATH_RESPONSE data:0x%*xs", |
b14338acbf9d
QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8663
diff
changeset
|
471 sizeof(f->u.path_challenge.data), |
b14338acbf9d
QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8663
diff
changeset
|
472 f->u.path_challenge.data); |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
473 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
474 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
475 case NGX_QUIC_FT_NEW_TOKEN: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
476 p = ngx_slprintf(p, last, "NEW_TOKEN"); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
477 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
478 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
479 case NGX_QUIC_FT_HANDSHAKE_DONE: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
480 p = ngx_slprintf(p, last, "HANDSHAKE DONE"); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
481 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
482 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
483 default: |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
484 p = ngx_slprintf(p, last, "unknown type 0x%xi", f->type); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
485 break; |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
486 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
487 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
488 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, "quic frame %s %s %*s", |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
489 tx ? "tx" : "rx", ngx_quic_level_name(f->level), |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
490 p - buf, buf); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
491 } |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
492 |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
493 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
494 static void |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
495 ngx_quic_connstate_dbg(ngx_connection_t *c) |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
496 { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
497 u_char *p, *last; |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
498 ngx_quic_connection_t *qc; |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
499 u_char buf[NGX_MAX_ERROR_STR]; |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
500 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
501 p = buf; |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
502 last = p + sizeof(buf); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
503 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
504 qc = ngx_quic_get_connection(c); |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
505 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
506 p = ngx_slprintf(p, last, "state:"); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
507 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
508 if (qc) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
509 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
510 if (qc->error) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
511 p = ngx_slprintf(p, last, "%s", qc->error_app ? " app" : ""); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
512 p = ngx_slprintf(p, last, " error:%ui", qc->error); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
513 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
514 if (qc->error_reason) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
515 p = ngx_slprintf(p, last, " \"%s\"", qc->error_reason); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
516 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
517 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
518 |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
519 p = ngx_slprintf(p, last, "%s", qc->shutdown ? " shutdown" : ""); |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
520 p = ngx_slprintf(p, last, "%s", qc->closing ? " closing" : ""); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
521 p = ngx_slprintf(p, last, "%s", qc->draining ? " draining" : ""); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
522 p = ngx_slprintf(p, last, "%s", qc->key_phase ? " kp" : ""); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
523 p = ngx_slprintf(p, last, "%s", qc->validated? " valid" : ""); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
524 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
525 } else { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
526 p = ngx_slprintf(p, last, " early"); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
527 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
528 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
529 if (c->read->timer_set) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
530 p = ngx_slprintf(p, last, |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
531 qc && qc->send_timer_set ? " send:%M" : " read:%M", |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
532 c->read->timer.key - ngx_current_msec); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
533 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
534 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
535 if (qc) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
536 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
537 if (qc->push.timer_set) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
538 p = ngx_slprintf(p, last, " push:%M", |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
539 qc->push.timer.key - ngx_current_msec); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
540 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
541 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
542 if (qc->pto.timer_set) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
543 p = ngx_slprintf(p, last, " pto:%M", |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
544 qc->pto.timer.key - ngx_current_msec); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
545 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
546 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
547 if (qc->close.timer_set) { |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
548 p = ngx_slprintf(p, last, " close:%M", |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
549 qc->close.timer.key - ngx_current_msec); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
550 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
551 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
552 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
553 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
554 "quic %*s", p - buf, buf); |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
555 } |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
556 |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
557 #else |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
558 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
559 #define ngx_quic_log_frame(log, f, tx) |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
560 #define ngx_quic_connstate_dbg(c) |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
561 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
562 #endif |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
563 |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
564 |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
565 #if BORINGSSL_API_VERSION >= 10 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
566 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
567 static int |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
568 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
|
569 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
|
570 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
|
571 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
572 ngx_connection_t *c; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
573 ngx_quic_connection_t *qc; |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
574 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
575 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
576 qc = ngx_quic_get_connection(c); |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
577 |
8360
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
578 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
579 "quic ngx_quic_set_read_secret() level:%d", level); |
8578
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
580 #ifdef NGX_QUIC_DEBUG_CRYPTO |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
581 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
582 "quic read secret len:%uz %*xs", secret_len, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
583 secret_len, rsecret); |
8359 | 584 #endif |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
585 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
586 return ngx_quic_keys_set_encryption_secret(c->pool, 0, qc->keys, level, |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
587 cipher, rsecret, secret_len); |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
588 } |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
589 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
590 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
591 static int |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
592 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
|
593 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
|
594 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
|
595 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
596 ngx_connection_t *c; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
597 ngx_quic_connection_t *qc; |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
598 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
599 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
600 qc = ngx_quic_get_connection(c); |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
601 |
8360
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
602 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
603 "quic ngx_quic_set_write_secret() level:%d", level); |
8578
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
604 #ifdef NGX_QUIC_DEBUG_CRYPTO |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
605 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
606 "quic write secret len:%uz %*xs", secret_len, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
607 secret_len, wsecret); |
8359 | 608 #endif |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
609 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
610 return ngx_quic_keys_set_encryption_secret(c->pool, 1, qc->keys, level, |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
611 cipher, wsecret, secret_len); |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
612 } |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
613 |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
614 #else |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
615 |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
616 static int |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
617 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
|
618 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
|
619 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
|
620 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
621 ngx_connection_t *c; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
622 const SSL_CIPHER *cipher; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
623 ngx_quic_connection_t *qc; |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
624 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
625 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
626 qc = ngx_quic_get_connection(c); |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
627 |
8360
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
628 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
629 "quic ngx_quic_set_encryption_secrets() level:%d", level); |
8578
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
630 #ifdef NGX_QUIC_DEBUG_CRYPTO |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
631 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
632 "quic read secret len:%uz %*xs", secret_len, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
633 secret_len, rsecret); |
8359 | 634 #endif |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
635 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
636 cipher = SSL_get_current_cipher(ssl_conn); |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
637 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
638 if (ngx_quic_keys_set_encryption_secret(c->pool, 0, qc->keys, level, |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
639 cipher, rsecret, secret_len) |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
640 != 1) |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
641 { |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
642 return 0; |
8182
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 |
8303
2ac03e80d013
TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8302
diff
changeset
|
645 if (level == ssl_encryption_early_data) { |
2ac03e80d013
TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8302
diff
changeset
|
646 return 1; |
2ac03e80d013
TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8302
diff
changeset
|
647 } |
2ac03e80d013
TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8302
diff
changeset
|
648 |
8359 | 649 #ifdef NGX_QUIC_DEBUG_CRYPTO |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
650 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
651 "quic write secret len:%uz %*xs", secret_len, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
652 secret_len, wsecret); |
8359 | 653 #endif |
8303
2ac03e80d013
TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8302
diff
changeset
|
654 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
655 return ngx_quic_keys_set_encryption_secret(c->pool, 1, qc->keys, level, |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
656 cipher, wsecret, secret_len); |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
657 } |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
658 |
8204
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
659 #endif |
9e0c30e1f7fb
Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8203
diff
changeset
|
660 |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
661 |
8184
ec1f84996990
Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents:
8183
diff
changeset
|
662 static int |
ec1f84996990
Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents:
8183
diff
changeset
|
663 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
|
664 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
|
665 { |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
666 u_char *p, *end; |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
667 size_t client_params_len; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
668 const uint8_t *client_params; |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
669 ngx_quic_tp_t ctp; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
670 ngx_quic_frame_t *frame; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
671 ngx_connection_t *c; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
672 ngx_quic_connection_t *qc; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
673 ngx_quic_frames_stream_t *fs; |
8184
ec1f84996990
Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents:
8183
diff
changeset
|
674 |
ec1f84996990
Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents:
8183
diff
changeset
|
675 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
676 qc = ngx_quic_get_connection(c); |
8184
ec1f84996990
Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents:
8183
diff
changeset
|
677 |
8186
0a2683df5f11
Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents:
8185
diff
changeset
|
678 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 679 "quic ngx_quic_add_handshake_data"); |
8184
ec1f84996990
Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents:
8183
diff
changeset
|
680 |
8260
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
681 if (!qc->client_tp_done) { |
8438 | 682 /* |
683 * things to do once during handshake: check ALPN and transport | |
684 * parameters; we want to break handshake if something is wrong | |
685 * here; | |
686 */ | |
687 | |
688 #if defined(TLSEXT_TYPE_application_layer_protocol_negotiation) | |
8482
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
689 if (qc->conf->require_alpn) { |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
690 unsigned int len; |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
691 const unsigned char *data; |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
692 |
8619
bb3f4f669417
QUIC: passing ssl_conn to SSL_get0_alpn_selected() directly.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8617
diff
changeset
|
693 SSL_get0_alpn_selected(ssl_conn, &data, &len); |
8482
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
694 |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
695 if (len == 0) { |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
696 qc->error = 0x100 + SSL_AD_NO_APPLICATION_PROTOCOL; |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
697 qc->error_reason = "unsupported protocol in ALPN extension"; |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
698 |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
699 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
700 "quic unsupported protocol in ALPN extension"); |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
701 return 0; |
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
702 } |
8438 | 703 } |
704 #endif | |
8260
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
705 |
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
706 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
|
707 &client_params_len); |
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
708 |
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
709 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 710 "quic SSL_get_peer_quic_transport_params():" |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
711 " params_len:%ui", client_params_len); |
8260
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
712 |
8435
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
713 if (client_params_len == 0) { |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
714 /* quic-tls 8.2 */ |
8447
97adb87f149b
Get rid of hardcoded numbers used for quic handshake errors.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8446
diff
changeset
|
715 qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_MISSING_EXTENSION); |
8435
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
716 qc->error_reason = "missing transport parameters"; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
717 |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
718 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
719 "missing transport parameters"); |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
720 return 0; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
721 } |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
722 |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
723 p = (u_char *) client_params; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
724 end = p + client_params_len; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
725 |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
726 /* defaults for parameters not sent by client */ |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
727 ngx_memcpy(&ctp, &qc->ctp, sizeof(ngx_quic_tp_t)); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
728 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
729 if (ngx_quic_parse_transport_params(p, end, &ctp, c->log) |
8435
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
730 != NGX_OK) |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
731 { |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
732 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
733 qc->error_reason = "failed to process transport parameters"; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
734 |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
735 return 0; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
736 } |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
737 |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
738 if (ngx_quic_apply_transport_params(c, &ctp) != NGX_OK) { |
8435
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
739 return 0; |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
740 } |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
741 |
5bc9229ec4cf
QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8434
diff
changeset
|
742 qc->client_tp_done = 1; |
8260
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
743 } |
f388c0ad3477
Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8259
diff
changeset
|
744 |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
745 fs = &qc->crypto[level]; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
746 |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
747 frame = ngx_quic_alloc_frame(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
748 if (frame == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
749 return 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
750 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
751 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
752 frame->data = ngx_quic_copy_buf(c, (u_char *) data, len); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
753 if (frame->data == NGX_CHAIN_ERROR) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
754 return 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
755 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
756 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
757 frame->level = level; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
758 frame->type = NGX_QUIC_FT_CRYPTO; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
759 frame->u.crypto.offset = fs->sent; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
760 frame->u.crypto.length = len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
761 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
762 fs->sent += len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
763 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
764 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
|
765 |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
766 return 1; |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
767 } |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
768 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
769 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
770 static int |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
771 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
|
772 { |
8360
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
773 #if (NGX_DEBUG) |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
774 ngx_connection_t *c; |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
775 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
776 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
|
777 |
8359 | 778 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
779 "quic ngx_quic_flush_flight()"); | |
8360
f175006124d0
Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents:
8359
diff
changeset
|
780 #endif |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
781 return 1; |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
782 } |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
783 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
784 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
785 static int |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
786 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
|
787 uint8_t alert) |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
788 { |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
789 ngx_connection_t *c; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
790 ngx_quic_connection_t *qc; |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
791 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
792 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
|
793 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
794 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
795 "quic ngx_quic_send_alert() lvl:%d alert:%d", |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
796 (int) level, (int) alert); |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
797 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
798 qc = ngx_quic_get_connection(c); |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
799 if (qc == NULL) { |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
800 return 1; |
8235
552d6868091b
Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8234
diff
changeset
|
801 } |
552d6868091b
Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8234
diff
changeset
|
802 |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
803 qc->error_level = level; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
804 qc->error = NGX_QUIC_ERR_CRYPTO(alert); |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
805 qc->error_reason = "TLS alert"; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
806 qc->error_app = 0; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
807 qc->error_ftype = 0; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
808 |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
809 if (ngx_quic_send_cc(c) != NGX_OK) { |
8235
552d6868091b
Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8234
diff
changeset
|
810 return 0; |
552d6868091b
Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8234
diff
changeset
|
811 } |
552d6868091b
Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8234
diff
changeset
|
812 |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
813 return 1; |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
814 } |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
815 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
816 |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
817 static ngx_int_t |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
818 ngx_quic_apply_transport_params(ngx_connection_t *c, ngx_quic_tp_t *ctp) |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
819 { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
820 ngx_quic_connection_t *qc; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
821 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
822 qc = ngx_quic_get_connection(c); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
823 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
824 if (qc->scid.len != ctp->initial_scid.len |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
825 || ngx_memcmp(qc->scid.data, ctp->initial_scid.data, qc->scid.len) != 0) |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
826 { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
827 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
828 "quic client initial_source_connection_id mismatch"); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
829 return NGX_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
830 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
831 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
832 if (ctp->max_udp_payload_size < NGX_QUIC_MIN_INITIAL_SIZE |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
833 || ctp->max_udp_payload_size > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
834 { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
835 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
836 qc->error_reason = "invalid maximum packet size"; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
837 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
838 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
839 "quic maximum packet size is invalid"); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
840 return NGX_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
841 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
842 } else if (ctp->max_udp_payload_size > ngx_quic_max_udp_payload(c)) { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
843 ctp->max_udp_payload_size = ngx_quic_max_udp_payload(c); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
844 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
845 "quic client maximum packet size truncated"); |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
846 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
847 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
848 if (ctp->active_connection_id_limit < 2) { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
849 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
850 qc->error_reason = "invalid active_connection_id_limit"; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
851 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
852 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
853 "quic active_connection_id_limit is invalid"); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
854 return NGX_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
855 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
856 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
857 if (ctp->ack_delay_exponent > 20) { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
858 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
859 qc->error_reason = "invalid ack_delay_exponent"; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
860 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
861 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
862 "quic ack_delay_exponent is invalid"); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
863 return NGX_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
864 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
865 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
866 if (ctp->max_ack_delay > 16384) { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
867 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
868 qc->error_reason = "invalid max_ack_delay"; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
869 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
870 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
871 "quic max_ack_delay is invalid"); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
872 return NGX_ERROR; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
873 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
874 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
875 if (ctp->max_idle_timeout > 0 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
876 && ctp->max_idle_timeout < qc->tp.max_idle_timeout) |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
877 { |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
878 qc->tp.max_idle_timeout = ctp->max_idle_timeout; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
879 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
880 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
881 qc->streams.server_max_streams_bidi = ctp->initial_max_streams_bidi; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
882 qc->streams.server_max_streams_uni = ctp->initial_max_streams_uni; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
883 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
884 ngx_memcpy(&qc->ctp, ctp, sizeof(ngx_quic_tp_t)); |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
885 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
886 return NGX_OK; |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
887 } |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
888 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
889 |
8225 | 890 void |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
891 ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf) |
8225 | 892 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
893 ngx_int_t rc; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
894 ngx_quic_connection_t *qc; |
8225 | 895 |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
896 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run"); |
8225 | 897 |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
898 rc = ngx_quic_input(c, c->buffer, conf); |
8536
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
899 if (rc != NGX_OK) { |
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
900 ngx_quic_close_connection(c, rc == NGX_DECLINED ? NGX_DONE : NGX_ERROR); |
8225 | 901 return; |
902 } | |
903 | |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
904 qc = ngx_quic_get_connection(c); |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
905 |
8686 | 906 if (qc == NULL) { |
907 ngx_quic_close_connection(c, NGX_DONE); | |
908 return; | |
909 } | |
910 | |
911 ngx_add_timer(c->read, qc->tp.max_idle_timeout); | |
912 ngx_quic_connstate_dbg(c); | |
8225 | 913 |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
914 c->read->handler = ngx_quic_input_handler; |
8225 | 915 |
916 return; | |
917 } | |
918 | |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
919 |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
920 static ngx_quic_connection_t * |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
921 ngx_quic_new_connection(ngx_connection_t *c, ngx_quic_conf_t *conf, |
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
922 ngx_quic_header_t *pkt) |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
923 { |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
924 ngx_uint_t i; |
8265
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
8263
diff
changeset
|
925 ngx_quic_tp_t *ctp; |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
926 ngx_quic_server_id_t *sid; |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
927 ngx_quic_client_id_t *cid; |
8225 | 928 ngx_quic_connection_t *qc; |
8387
eebdda507ec3
Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents:
8386
diff
changeset
|
929 |
8225 | 930 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t)); |
931 if (qc == NULL) { | |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
932 return NULL; |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
933 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
934 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
935 qc->keys = ngx_quic_keys_new(c->pool); |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
936 if (qc->keys == NULL) { |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
937 return NULL; |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
938 } |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
939 |
8624
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
940 qc->version = pkt->version; |
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
941 |
8225 | 942 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel, |
943 ngx_quic_rbtree_insert_stream); | |
944 | |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
945 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
946 ngx_queue_init(&qc->send_ctx[i].frames); |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
947 ngx_queue_init(&qc->send_ctx[i].sent); |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
948 qc->send_ctx[i].largest_pn = NGX_QUIC_UNSET_PN; |
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
949 qc->send_ctx[i].largest_ack = NGX_QUIC_UNSET_PN; |
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
950 qc->send_ctx[i].largest_range = NGX_QUIC_UNSET_PN; |
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
951 qc->send_ctx[i].pending_ack = NGX_QUIC_UNSET_PN; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
952 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
953 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
954 qc->send_ctx[0].level = ssl_encryption_initial; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
955 qc->send_ctx[1].level = ssl_encryption_handshake; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
956 qc->send_ctx[2].level = ssl_encryption_application; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
957 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
958 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
959 ngx_queue_init(&qc->crypto[i].frames); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
960 } |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
961 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
962 ngx_queue_init(&qc->free_frames); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
963 ngx_queue_init(&qc->client_ids); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
964 ngx_queue_init(&qc->server_ids); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
965 ngx_queue_init(&qc->free_client_ids); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
966 ngx_queue_init(&qc->free_server_ids); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
967 |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
968 qc->avg_rtt = NGX_QUIC_INITIAL_RTT; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
969 qc->rttvar = NGX_QUIC_INITIAL_RTT / 2; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
970 qc->min_rtt = NGX_TIMER_INFINITE; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
971 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
972 /* |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
973 * qc->latest_rtt = 0 |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
974 * qc->nclient_ids = 0 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
975 * qc->nserver_ids = 0 |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
976 * qc->max_retired_seqnum = 0 |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
977 */ |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
978 |
8477
031918df51c0
QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents:
8476
diff
changeset
|
979 qc->received = pkt->raw->last - pkt->raw->start; |
031918df51c0
QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents:
8476
diff
changeset
|
980 |
8472 | 981 qc->pto.log = c->log; |
982 qc->pto.data = c; | |
983 qc->pto.handler = ngx_quic_pto_handler; | |
984 qc->pto.cancelable = 1; | |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
985 |
8309 | 986 qc->push.log = c->log; |
987 qc->push.data = c; | |
988 qc->push.handler = ngx_quic_push_handler; | |
989 qc->push.cancelable = 1; | |
990 | |
8481
0d2b2664b41c
QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents:
8480
diff
changeset
|
991 qc->conf = conf; |
0d2b2664b41c
QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents:
8480
diff
changeset
|
992 qc->tp = conf->tp; |
8225 | 993 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
994 if (qc->tp.disable_active_migration) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
995 qc->sockaddr = ngx_palloc(c->pool, c->socklen); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
996 if (qc->sockaddr == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
997 return NULL; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
998 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
999 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1000 ngx_memcpy(qc->sockaddr, c->sockaddr, c->socklen); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1001 qc->socklen = c->socklen; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1002 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1003 |
8265
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
8263
diff
changeset
|
1004 ctp = &qc->ctp; |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
1005 |
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
1006 /* defaults to be used before actual client parameters are received */ |
8436
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1007 ctp->max_udp_payload_size = ngx_quic_max_udp_payload(c); |
8265
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
8263
diff
changeset
|
1008 ctp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT; |
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
8263
diff
changeset
|
1009 ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY; |
8701
ba9e34c03968
QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8698
diff
changeset
|
1010 ctp->active_connection_id_limit = 2; |
8265
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
8263
diff
changeset
|
1011 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
1012 qc->streams.recv_max_data = qc->tp.initial_max_data; |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
1013 |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
1014 qc->streams.client_max_streams_uni = qc->tp.initial_max_streams_uni; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
1015 qc->streams.client_max_streams_bidi = qc->tp.initial_max_streams_bidi; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
1016 |
8415
125cbfa77013
Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8413
diff
changeset
|
1017 qc->congestion.window = ngx_min(10 * qc->tp.max_udp_payload_size, |
125cbfa77013
Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8413
diff
changeset
|
1018 ngx_max(2 * qc->tp.max_udp_payload_size, |
125cbfa77013
Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8413
diff
changeset
|
1019 14720)); |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
1020 qc->congestion.ssthresh = (size_t) -1; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
1021 qc->congestion.recovery_start = ngx_current_msec; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
1022 |
8686 | 1023 qc->odcid.len = pkt->odcid.len; |
1024 qc->odcid.data = ngx_pstrdup(c->pool, &pkt->odcid); | |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1025 if (qc->odcid.data == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1026 return NULL; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1027 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1028 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1029 qc->dcid.len = NGX_QUIC_SERVER_CID_LEN; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1030 qc->dcid.data = ngx_pnalloc(c->pool, qc->dcid.len); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1031 if (qc->dcid.data == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1032 return NULL; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1033 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1034 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1035 if (ngx_quic_create_server_id(c, qc->dcid.data) != NGX_OK) { |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
1036 return NULL; |
8225 | 1037 } |
8368 | 1038 |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
1039 qc->tp.original_dcid = qc->odcid; |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
1040 qc->tp.initial_scid = qc->dcid; |
8417
6633f17044eb
QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8415
diff
changeset
|
1041 |
8686 | 1042 if (pkt->validated && pkt->retried) { |
1043 qc->tp.retry_scid.len = pkt->dcid.len; | |
1044 qc->tp.retry_scid.data = ngx_pstrdup(c->pool, &pkt->dcid); | |
1045 if (qc->tp.retry_scid.data == NULL) { | |
1046 return NULL; | |
1047 } | |
1048 } | |
1049 | |
8225 | 1050 qc->scid.len = pkt->scid.len; |
8686 | 1051 qc->scid.data = ngx_pstrdup(c->pool, &pkt->scid); |
8225 | 1052 if (qc->scid.data == NULL) { |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
1053 return NULL; |
8225 | 1054 } |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1055 |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
1056 cid = ngx_quic_alloc_client_id(c, qc); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1057 if (cid == NULL) { |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
1058 return NULL; |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1059 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1060 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1061 cid->seqnum = 0; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1062 cid->len = pkt->scid.len; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1063 ngx_memcpy(cid->id, pkt->scid.data, pkt->scid.len); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1064 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1065 ngx_queue_insert_tail(&qc->client_ids, &cid->queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1066 qc->nclient_ids++; |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
1067 qc->client_seqnum = 0; |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
1068 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1069 qc->server_seqnum = NGX_QUIC_UNSET_PN; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1070 |
8710
44b4c6180106
QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8709
diff
changeset
|
1071 if (ngx_quic_keys_set_initial_secret(c->pool, qc->keys, &pkt->dcid, |
44b4c6180106
QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8709
diff
changeset
|
1072 qc->version) |
8686 | 1073 != NGX_OK) |
1074 { | |
1075 return NULL; | |
1076 } | |
1077 | |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
1078 if (ngx_quic_insert_server_id(c, qc, &qc->odcid) == NULL) { |
8686 | 1079 return NULL; |
1080 } | |
1081 | |
1082 qc->server_seqnum = 0; | |
1083 | |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
1084 sid = ngx_quic_insert_server_id(c, qc, &qc->dcid); |
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
1085 if (sid == NULL) { |
8686 | 1086 return NULL; |
1087 } | |
1088 | |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
1089 c->udp = &sid->udp; |
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
1090 |
8686 | 1091 qc->validated = pkt->validated; |
1092 | |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
1093 return qc; |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1094 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1095 |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1096 |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1097 static ngx_int_t |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1098 ngx_quic_send_stateless_reset(ngx_connection_t *c, ngx_quic_conf_t *conf, |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1099 ngx_quic_header_t *pkt) |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1100 { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1101 u_char *token; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1102 size_t len, max; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1103 uint16_t rndbytes; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1104 u_char buf[NGX_QUIC_MAX_SR_PACKET]; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1105 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1106 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1107 "quic handle stateless reset output"); |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1108 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1109 if (pkt->len <= NGX_QUIC_MIN_PKT_LEN) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1110 return NGX_DECLINED; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1111 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1112 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1113 if (pkt->len <= NGX_QUIC_MIN_SR_PACKET) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1114 len = pkt->len - 1; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1115 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1116 } else { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1117 max = ngx_min(NGX_QUIC_MAX_SR_PACKET, pkt->len * 3); |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1118 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1119 if (RAND_bytes((u_char *) &rndbytes, sizeof(rndbytes)) != 1) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1120 return NGX_ERROR; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1121 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1122 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1123 len = (rndbytes % (max - NGX_QUIC_MIN_SR_PACKET + 1)) |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1124 + NGX_QUIC_MIN_SR_PACKET; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1125 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1126 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1127 if (RAND_bytes(buf, len - NGX_QUIC_SR_TOKEN_LEN) != 1) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1128 return NGX_ERROR; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1129 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1130 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1131 buf[0] &= ~NGX_QUIC_PKT_LONG; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1132 buf[0] |= NGX_QUIC_PKT_FIXED_BIT; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1133 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1134 token = &buf[len - NGX_QUIC_SR_TOKEN_LEN]; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1135 |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1136 if (ngx_quic_new_sr_token(c, &pkt->dcid, conf->sr_token_key, token) |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1137 != NGX_OK) |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1138 { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1139 return NGX_ERROR; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1140 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1141 |
8656
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
1142 (void) ngx_quic_send(c, buf, len); |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1143 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1144 return NGX_DECLINED; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1145 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1146 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1147 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1148 static ngx_int_t |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1149 ngx_quic_new_sr_token(ngx_connection_t *c, ngx_str_t *cid, u_char *secret, |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1150 u_char *token) |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1151 { |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1152 ngx_str_t tmp; |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1153 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1154 tmp.data = secret; |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1155 tmp.len = NGX_QUIC_SR_KEY_LEN; |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1156 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1157 if (ngx_quic_derive_key(c->log, "sr_token_key", &tmp, cid, token, |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1158 NGX_QUIC_SR_TOKEN_LEN) |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1159 != NGX_OK) |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1160 { |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1161 return NGX_ERROR; |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1162 } |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1163 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1164 #if (NGX_DEBUG) |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1165 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1166 "quic stateless reset token %*xs", |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1167 (size_t) NGX_QUIC_SR_TOKEN_LEN, token); |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1168 #endif |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1169 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1170 return NGX_OK; |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1171 } |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1172 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1173 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1174 static ngx_int_t |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1175 ngx_quic_process_stateless_reset(ngx_connection_t *c, ngx_quic_header_t *pkt) |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1176 { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1177 u_char *tail, ch; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1178 ngx_uint_t i; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1179 ngx_queue_t *q; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1180 ngx_quic_client_id_t *cid; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1181 ngx_quic_connection_t *qc; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1182 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1183 qc = ngx_quic_get_connection(c); |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1184 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1185 /* A stateless reset uses an entire UDP datagram */ |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1186 if (pkt->raw->start != pkt->data) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1187 return NGX_DECLINED; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1188 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1189 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1190 tail = pkt->raw->last - NGX_QUIC_SR_TOKEN_LEN; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1191 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1192 for (q = ngx_queue_head(&qc->client_ids); |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1193 q != ngx_queue_sentinel(&qc->client_ids); |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1194 q = ngx_queue_next(q)) |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1195 { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1196 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1197 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1198 if (cid->seqnum == 0) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1199 /* no stateless reset token in initial connection id */ |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1200 continue; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1201 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1202 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1203 /* constant time comparison */ |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1204 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1205 for (ch = 0, i = 0; i < NGX_QUIC_SR_TOKEN_LEN; i++) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1206 ch |= tail[i] ^ cid->sr_token[i]; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1207 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1208 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1209 if (ch == 0) { |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1210 return NGX_OK; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1211 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1212 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1213 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1214 return NGX_DECLINED; |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1215 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1216 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1217 |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1218 static ngx_int_t |
8522
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1219 ngx_quic_negotiate_version(ngx_connection_t *c, ngx_quic_header_t *inpkt) |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1220 { |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1221 size_t len; |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1222 ngx_quic_header_t pkt; |
8625
4416b7ab0a27
QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8624
diff
changeset
|
1223 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; |
8522
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1224 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1225 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1226 "sending version negotiation packet"); |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1227 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1228 pkt.log = c->log; |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1229 pkt.flags = NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_FIXED_BIT; |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1230 pkt.dcid = inpkt->scid; |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1231 pkt.scid = inpkt->dcid; |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1232 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1233 len = ngx_quic_create_version_negotiation(&pkt, buf); |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1234 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1235 #ifdef NGX_QUIC_DEBUG_PACKETS |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1236 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1237 "quic vnego packet to send len:%uz %*xs", len, len, buf); |
8522
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1238 #endif |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1239 |
8656
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
1240 (void) ngx_quic_send(c, buf, len); |
8522
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1241 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1242 return NGX_ERROR; |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1243 } |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1244 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1245 |
fc89d02bdca2
QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents:
8519
diff
changeset
|
1246 static ngx_int_t |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1247 ngx_quic_create_server_id(ngx_connection_t *c, u_char *id) |
8368 | 1248 { |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1249 if (RAND_bytes(id, NGX_QUIC_SERVER_CID_LEN) != 1) { |
8382
b7704303a7e5
Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8381
diff
changeset
|
1250 return NGX_ERROR; |
b7704303a7e5
Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8381
diff
changeset
|
1251 } |
b7704303a7e5
Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8381
diff
changeset
|
1252 |
8676
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1253 #if (NGX_QUIC_BPF) |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1254 if (ngx_quic_bpf_attach_id(c, id) != NGX_OK) { |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1255 ngx_log_error(NGX_LOG_ERR, c->log, 0, |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1256 "quic bpf failed to generate socket key"); |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1257 /* ignore error, things still may work */ |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1258 } |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1259 #endif |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1260 |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1261 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1262 "quic create server id %*xs", |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1263 (size_t) NGX_QUIC_SERVER_CID_LEN, id); |
8368 | 1264 return NGX_OK; |
1265 } | |
1266 | |
1267 | |
8676
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1268 #if (NGX_QUIC_BPF) |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1269 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1270 static ngx_int_t |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1271 ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id) |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1272 { |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1273 int fd; |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1274 uint64_t cookie; |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1275 socklen_t optlen; |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1276 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1277 fd = c->listening->fd; |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1278 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1279 optlen = sizeof(cookie); |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1280 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1281 if (getsockopt(fd, SOL_SOCKET, SO_COOKIE, &cookie, &optlen) == -1) { |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1282 ngx_log_error(NGX_LOG_ERR, c->log, ngx_socket_errno, |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1283 "quic getsockopt(SO_COOKIE) failed"); |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1284 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1285 return NGX_ERROR; |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1286 } |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1287 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1288 ngx_quic_dcid_encode_key(id, cookie); |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1289 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1290 return NGX_OK; |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1291 } |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1292 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1293 #endif |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1294 |
7df607cb2d11
QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents:
8674
diff
changeset
|
1295 |
8368 | 1296 static ngx_int_t |
8686 | 1297 ngx_quic_send_retry(ngx_connection_t *c, ngx_quic_conf_t *conf, |
1298 ngx_quic_header_t *inpkt) | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1299 { |
8686 | 1300 time_t expires; |
1301 ssize_t len; | |
1302 ngx_str_t res, token; | |
1303 ngx_quic_header_t pkt; | |
1304 | |
1305 u_char buf[NGX_QUIC_RETRY_BUFFER_SIZE]; | |
1306 u_char dcid[NGX_QUIC_SERVER_CID_LEN]; | |
1307 | |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1308 expires = ngx_time() + NGX_QUIC_RETRY_TOKEN_LIFETIME; |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1309 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1310 if (ngx_quic_new_token(c, conf->av_token_key, &token, &inpkt->dcid, |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1311 expires, 1) |
8686 | 1312 != NGX_OK) |
1313 { | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1314 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1315 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1316 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1317 ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1318 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_RETRY; |
8686 | 1319 pkt.version = inpkt->version; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1320 pkt.log = c->log; |
8686 | 1321 |
1322 pkt.odcid = inpkt->dcid; | |
1323 pkt.dcid = inpkt->scid; | |
1324 | |
1325 /* TODO: generate routable dcid */ | |
1326 if (RAND_bytes(dcid, NGX_QUIC_SERVER_CID_LEN) != 1) { | |
1327 return NGX_ERROR; | |
1328 } | |
1329 | |
1330 pkt.scid.len = NGX_QUIC_SERVER_CID_LEN; | |
1331 pkt.scid.data = dcid; | |
1332 | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1333 pkt.token = token; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1334 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1335 res.data = buf; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1336 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
1337 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1338 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1339 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1340 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1341 #ifdef NGX_QUIC_DEBUG_PACKETS |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1342 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1343 "quic packet to send len:%uz %xV", res.len, &res); |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1344 #endif |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1345 |
8656
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
1346 len = ngx_quic_send(c, res.data, res.len); |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
1347 if (len == NGX_ERROR) { |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1348 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1349 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1350 |
8686 | 1351 ngx_log_debug(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
1352 "quic retry packet sent to %xV", &pkt.dcid); |
8686 | 1353 |
1354 /* | |
1355 * quic-transport 17.2.5.1: A server MUST NOT send more than one Retry | |
1356 * packet in response to a single UDP datagram. | |
1357 * NGX_DONE will stop quic_input() from processing further | |
1358 */ | |
1359 return NGX_DONE; | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1360 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1361 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1362 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1363 static ngx_int_t |
8686 | 1364 ngx_quic_new_token(ngx_connection_t *c, u_char *key, ngx_str_t *token, |
1365 ngx_str_t *odcid, time_t exp, ngx_uint_t is_retry) | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1366 { |
8686 | 1367 int len, iv_len; |
1368 u_char *p, *iv; | |
1369 EVP_CIPHER_CTX *ctx; | |
1370 const EVP_CIPHER *cipher; | |
1371 | |
1372 u_char in[NGX_QUIC_MAX_TOKEN_SIZE]; | |
1373 | |
1374 ngx_quic_address_hash(c, !is_retry, in); | |
1375 | |
1376 p = in + 20; | |
1377 | |
1378 p = ngx_cpymem(p, &exp, sizeof(time_t)); | |
1379 | |
1380 *p++ = is_retry ? 1 : 0; | |
1381 | |
1382 if (odcid) { | |
1383 *p++ = odcid->len; | |
1384 p = ngx_cpymem(p, odcid->data, odcid->len); | |
1385 | |
1386 } else { | |
1387 *p++ = 0; | |
1388 } | |
1389 | |
1390 len = p - in; | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1391 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1392 cipher = EVP_aes_256_cbc(); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1393 iv_len = EVP_CIPHER_iv_length(cipher); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1394 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1395 token->len = iv_len + len + EVP_CIPHER_block_size(cipher); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1396 token->data = ngx_pnalloc(c->pool, token->len); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1397 if (token->data == NULL) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1398 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1399 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1400 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1401 ctx = EVP_CIPHER_CTX_new(); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1402 if (ctx == NULL) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1403 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1404 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1405 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1406 iv = token->data; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1407 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1408 if (RAND_bytes(iv, iv_len) <= 0 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1409 || !EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv)) |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1410 { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1411 EVP_CIPHER_CTX_free(ctx); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1412 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1413 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1414 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1415 token->len = iv_len; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1416 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1417 if (EVP_EncryptUpdate(ctx, token->data + token->len, &len, in, len) != 1) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1418 EVP_CIPHER_CTX_free(ctx); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1419 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1420 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1421 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1422 token->len += len; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1423 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1424 if (EVP_EncryptFinal_ex(ctx, token->data + token->len, &len) <= 0) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1425 EVP_CIPHER_CTX_free(ctx); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1426 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1427 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1428 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1429 token->len += len; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1430 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1431 EVP_CIPHER_CTX_free(ctx); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1432 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1433 #ifdef NGX_QUIC_DEBUG_PACKETS |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1434 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1435 "quic new token len:%uz %xV", token->len, token); |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1436 #endif |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1437 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1438 return NGX_OK; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1439 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1440 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1441 |
8686 | 1442 static void |
1443 ngx_quic_address_hash(ngx_connection_t *c, ngx_uint_t no_port, u_char buf[20]) | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1444 { |
8686 | 1445 size_t len; |
1446 u_char *data; | |
1447 ngx_sha1_t sha1; | |
1448 struct sockaddr_in *sin; | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1449 #if (NGX_HAVE_INET6) |
8686 | 1450 struct sockaddr_in6 *sin6; |
1451 #endif | |
1452 | |
1453 len = (size_t) c->socklen; | |
1454 data = (u_char *) c->sockaddr; | |
1455 | |
1456 if (no_port) { | |
1457 switch (c->sockaddr->sa_family) { | |
1458 | |
1459 #if (NGX_HAVE_INET6) | |
1460 case AF_INET6: | |
1461 sin6 = (struct sockaddr_in6 *) c->sockaddr; | |
1462 | |
1463 len = sizeof(struct in6_addr); | |
1464 data = sin6->sin6_addr.s6_addr; | |
1465 | |
1466 break; | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1467 #endif |
8686 | 1468 |
1469 case AF_INET: | |
1470 sin = (struct sockaddr_in *) c->sockaddr; | |
1471 | |
1472 len = sizeof(in_addr_t); | |
1473 data = (u_char *) &sin->sin_addr; | |
1474 | |
1475 break; | |
1476 } | |
1477 } | |
1478 | |
1479 ngx_sha1_init(&sha1); | |
1480 ngx_sha1_update(&sha1, data, len); | |
1481 ngx_sha1_final(buf, &sha1); | |
1482 } | |
1483 | |
1484 | |
1485 static ngx_int_t | |
1486 ngx_quic_validate_token(ngx_connection_t *c, u_char *key, | |
1487 ngx_quic_header_t *pkt) | |
1488 { | |
1489 int len, tlen, iv_len; | |
1490 u_char *iv, *p; | |
1491 time_t now, exp; | |
1492 size_t total; | |
1493 ngx_str_t odcid; | |
1494 EVP_CIPHER_CTX *ctx; | |
1495 const EVP_CIPHER *cipher; | |
1496 | |
1497 u_char addr_hash[20]; | |
1498 u_char tdec[NGX_QUIC_MAX_TOKEN_SIZE]; | |
1499 | |
1500 /* Retry token or NEW_TOKEN in a previous connection */ | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1501 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1502 cipher = EVP_aes_256_cbc(); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1503 iv = pkt->token.data; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1504 iv_len = EVP_CIPHER_iv_length(cipher); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1505 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1506 /* sanity checks */ |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1507 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1508 if (pkt->token.len < (size_t) iv_len + EVP_CIPHER_block_size(cipher)) { |
8686 | 1509 goto garbage; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1510 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1511 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1512 if (pkt->token.len > (size_t) iv_len + NGX_QUIC_MAX_TOKEN_SIZE) { |
8686 | 1513 goto garbage; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1514 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1515 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1516 ctx = EVP_CIPHER_CTX_new(); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1517 if (ctx == NULL) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1518 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1519 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1520 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1521 if (!EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv)) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1522 EVP_CIPHER_CTX_free(ctx); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1523 return NGX_ERROR; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1524 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1525 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1526 p = pkt->token.data + iv_len; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1527 len = pkt->token.len - iv_len; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1528 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1529 if (EVP_DecryptUpdate(ctx, tdec, &len, p, len) != 1) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1530 EVP_CIPHER_CTX_free(ctx); |
8686 | 1531 goto garbage; |
1532 } | |
1533 total = len; | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1534 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1535 if (EVP_DecryptFinal_ex(ctx, tdec + len, &tlen) <= 0) { |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1536 EVP_CIPHER_CTX_free(ctx); |
8686 | 1537 goto garbage; |
1538 } | |
1539 total += tlen; | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1540 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1541 EVP_CIPHER_CTX_free(ctx); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1542 |
8686 | 1543 if (total < (20 + sizeof(time_t) + 2)) { |
1544 goto garbage; | |
1545 } | |
1546 | |
1547 p = tdec + 20; | |
1548 | |
1549 ngx_memcpy(&exp, p, sizeof(time_t)); | |
1550 p += sizeof(time_t); | |
1551 | |
1552 pkt->retried = (*p++ == 1); | |
1553 | |
1554 ngx_quic_address_hash(c, !pkt->retried, addr_hash); | |
1555 | |
1556 if (ngx_memcmp(tdec, addr_hash, 20) != 0) { | |
8399
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
1557 goto bad_token; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1558 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1559 |
8686 | 1560 odcid.len = *p++; |
1561 if (odcid.len) { | |
1562 if (odcid.len > NGX_QUIC_MAX_CID_LEN) { | |
1563 goto bad_token; | |
1564 } | |
1565 | |
1566 if ((size_t)(tdec + total - p) < odcid.len) { | |
1567 goto bad_token; | |
1568 } | |
1569 | |
1570 odcid.data = p; | |
1571 p += odcid.len; | |
1572 } | |
1573 | |
1574 now = ngx_time(); | |
1575 | |
1576 if (now > exp) { | |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
1577 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic expired token"); |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1578 return NGX_DECLINED; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1579 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1580 |
8686 | 1581 if (odcid.len) { |
1582 pkt->odcid.len = odcid.len; | |
1583 pkt->odcid.data = ngx_pstrdup(c->pool, &odcid); | |
1584 if (pkt->odcid.data == NULL) { | |
1585 return NGX_ERROR; | |
1586 } | |
1587 | |
1588 } else { | |
1589 pkt->odcid = pkt->dcid; | |
1590 } | |
1591 | |
1592 pkt->validated = 1; | |
1593 | |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1594 return NGX_OK; |
8399
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
1595 |
8686 | 1596 garbage: |
1597 | |
1598 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic garbage token"); | |
1599 | |
1600 return NGX_ABORT; | |
1601 | |
8399
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
1602 bad_token: |
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
1603 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
1604 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic invalid token"); |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
1605 |
8622
183275308d9a
QUIC: fixed address validation issues in a new connection.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8621
diff
changeset
|
1606 return NGX_DECLINED; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1607 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1608 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1609 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
1610 static ngx_int_t |
8221
69345a26ba69
Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents:
8220
diff
changeset
|
1611 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
|
1612 { |
8247
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1613 u_char *p; |
8422
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1614 size_t clen; |
8247
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1615 ssize_t len; |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1616 ngx_ssl_conn_t *ssl_conn; |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1617 ngx_quic_connection_t *qc; |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1618 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1619 qc = ngx_quic_get_connection(c); |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1620 |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
1621 if (ngx_ssl_create_connection(qc->conf->ssl, c, NGX_SSL_BUFFER) != NGX_OK) { |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1622 return NGX_ERROR; |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1623 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1624 |
8655
f596a4e5794b
QUIC: disabling bidirectional SSL shutdown earlier.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8652
diff
changeset
|
1625 c->ssl->no_wait_shutdown = 1; |
f596a4e5794b
QUIC: disabling bidirectional SSL shutdown earlier.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8652
diff
changeset
|
1626 |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1627 ssl_conn = c->ssl->connection; |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1628 |
8232
253cf267f95a
Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents:
8231
diff
changeset
|
1629 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
|
1630 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
8361 | 1631 "quic SSL_set_quic_method() failed"); |
8232
253cf267f95a
Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents:
8231
diff
changeset
|
1632 return NGX_ERROR; |
253cf267f95a
Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents:
8231
diff
changeset
|
1633 } |
253cf267f95a
Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents:
8231
diff
changeset
|
1634 |
8304
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
1635 #ifdef SSL_READ_EARLY_DATA_SUCCESS |
8564
b52b2a33b0e5
QUIC: fixed build with OpenSSL after bed310672f39.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8563
diff
changeset
|
1636 if (SSL_CTX_get_max_early_data(qc->conf->ssl->ctx)) { |
8304
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
1637 SSL_set_quic_early_data_enabled(ssl_conn, 1); |
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
1638 } |
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
1639 #endif |
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
1640 |
8717
0a0b1de9ccab
QUIC: fixed expected TLS codepoint with final draft and BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8710
diff
changeset
|
1641 #if BORINGSSL_API_VERSION >= 13 |
0a0b1de9ccab
QUIC: fixed expected TLS codepoint with final draft and BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8710
diff
changeset
|
1642 SSL_set_quic_use_legacy_codepoint(ssl_conn, qc->version != 1); |
0a0b1de9ccab
QUIC: fixed expected TLS codepoint with final draft and BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8710
diff
changeset
|
1643 #endif |
0a0b1de9ccab
QUIC: fixed expected TLS codepoint with final draft and BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8710
diff
changeset
|
1644 |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
1645 if (ngx_quic_new_sr_token(c, &qc->dcid, qc->conf->sr_token_key, |
8634
831d1960826f
QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents:
8631
diff
changeset
|
1646 qc->tp.sr_token) |
831d1960826f
QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents:
8631
diff
changeset
|
1647 != NGX_OK) |
831d1960826f
QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents:
8631
diff
changeset
|
1648 { |
831d1960826f
QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents:
8631
diff
changeset
|
1649 return NGX_ERROR; |
831d1960826f
QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents:
8631
diff
changeset
|
1650 } |
831d1960826f
QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents:
8631
diff
changeset
|
1651 |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1652 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1653 "quic stateless reset token %*xs", |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1654 (size_t) NGX_QUIC_SR_TOKEN_LEN, qc->tp.sr_token); |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
1655 |
8422
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1656 len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp, &clen); |
8247
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1657 /* always succeeds */ |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1658 |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1659 p = ngx_pnalloc(c->pool, len); |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1660 if (p == NULL) { |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1661 return NGX_ERROR; |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1662 } |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1663 |
8422
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1664 len = ngx_quic_create_transport_params(p, p + len, &qc->tp, NULL); |
8247
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1665 if (len < 0) { |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1666 return NGX_ERROR; |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1667 } |
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1668 |
8359 | 1669 #ifdef NGX_QUIC_DEBUG_PACKETS |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1670 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
1671 "quic transport parameters len:%uz %*xs", len, len, p); |
8359 | 1672 #endif |
1673 | |
8247
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
8246
diff
changeset
|
1674 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
|
1675 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
8361 | 1676 "quic SSL_set_quic_transport_params() failed"); |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1677 return NGX_ERROR; |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1678 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1679 |
8422
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1680 #if NGX_OPENSSL_QUIC_ZRTT_CTX |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1681 if (SSL_set_quic_early_data_context(ssl_conn, p, clen) == 0) { |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1682 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1683 "quic SSL_set_quic_early_data_context() failed"); |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1684 return NGX_ERROR; |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1685 } |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1686 #endif |
90b02ff6b003
Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8421
diff
changeset
|
1687 |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1688 return NGX_OK; |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1689 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1690 |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1691 |
8436
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1692 static ngx_inline size_t |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1693 ngx_quic_max_udp_payload(ngx_connection_t *c) |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1694 { |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1695 /* TODO: path MTU discovery */ |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1696 |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1697 #if (NGX_HAVE_INET6) |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1698 if (c->sockaddr->sa_family == AF_INET6) { |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1699 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT6; |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1700 } |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1701 #endif |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1702 |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1703 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT; |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1704 } |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1705 |
9fe7875ce4bb
QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents:
8435
diff
changeset
|
1706 |
8225 | 1707 static void |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
1708 ngx_quic_input_handler(ngx_event_t *rev) |
8211
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
1709 { |
8545
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1710 ngx_int_t rc; |
8730
90ae21799f67
QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents:
8724
diff
changeset
|
1711 ngx_buf_t *b; |
8271
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
1712 ngx_connection_t *c; |
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
1713 ngx_quic_connection_t *qc; |
8211
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
1714 |
8576
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
1715 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler"); |
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
1716 |
8225 | 1717 c = rev->data; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1718 qc = ngx_quic_get_connection(c); |
8211
6bc18966b8c1
Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents:
8209
diff
changeset
|
1719 |
8576
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
1720 c->log->action = "handling quic input"; |
8212
e3c0b19a3a8a
Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents:
8211
diff
changeset
|
1721 |
8225 | 1722 if (rev->timedout) { |
8361 | 1723 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, |
1724 "quic client timed out"); | |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1725 ngx_quic_close_connection(c, NGX_DONE); |
8225 | 1726 return; |
8212
e3c0b19a3a8a
Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents:
8211
diff
changeset
|
1727 } |
e3c0b19a3a8a
Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents:
8211
diff
changeset
|
1728 |
8225 | 1729 if (c->close) { |
8442
b9bce2c4fe33
Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8439
diff
changeset
|
1730 qc->error_reason = "graceful shutdown"; |
b9bce2c4fe33
Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8439
diff
changeset
|
1731 ngx_quic_close_connection(c, NGX_OK); |
8225 | 1732 return; |
1733 } | |
8220
7ada2feeac18
Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8218
diff
changeset
|
1734 |
8730
90ae21799f67
QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents:
8724
diff
changeset
|
1735 if (!rev->ready) { |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1736 if (qc->closing) { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1737 ngx_quic_close_connection(c, NGX_OK); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1738 } |
8225 | 1739 return; |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1740 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1741 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1742 if (qc->tp.disable_active_migration) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1743 if (c->socklen != qc->socklen |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1744 || ngx_memcmp(c->sockaddr, qc->sockaddr, c->socklen) != 0) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1745 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1746 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1747 "quic dropping packet from new address"); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1748 return; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1749 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1750 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1751 |
8734
c61fcdc1b8e3
UDP: extended datagram context.
Vladimir Homutov <vl@nginx.com>
parents:
8730
diff
changeset
|
1752 b = c->udp->dgram->buffer; |
8730
90ae21799f67
QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents:
8724
diff
changeset
|
1753 |
90ae21799f67
QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents:
8724
diff
changeset
|
1754 qc->received += (b->last - b->pos); |
90ae21799f67
QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents:
8724
diff
changeset
|
1755 |
90ae21799f67
QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents:
8724
diff
changeset
|
1756 rc = ngx_quic_input(c, b, NULL); |
8545
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1757 |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1758 if (rc == NGX_ERROR) { |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1759 ngx_quic_close_connection(c, NGX_ERROR); |
8225 | 1760 return; |
1761 } | |
8271
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
1762 |
8545
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1763 if (rc == NGX_DECLINED) { |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1764 return; |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1765 } |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1766 |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1767 /* rc == NGX_OK */ |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
1768 |
8271
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
1769 qc->send_timer_set = 0; |
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
1770 ngx_add_timer(rev, qc->tp.max_idle_timeout); |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
1771 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
1772 ngx_quic_connstate_dbg(c); |
8199
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1773 } |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1774 |
1297dc83a6b9
Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents:
8198
diff
changeset
|
1775 |
8736
714e9af983de
QUIC: separate header for ngx_quic_connection_t.
Vladimir Homutov <vl@nginx.com>
parents:
8735
diff
changeset
|
1776 void |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1777 ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc) |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1778 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1779 ngx_pool_t *pool; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1780 ngx_quic_connection_t *qc; |
8281
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
1781 |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1782 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
1783 "quic ngx_quic_close_connection rc:%i", rc); |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1784 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1785 qc = ngx_quic_get_connection(c); |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1786 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1787 if (qc == NULL) { |
8686 | 1788 if (rc == NGX_ERROR) { |
1789 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, | |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
1790 "quic close connection early error"); |
8686 | 1791 } |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1792 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1793 } else if (ngx_quic_close_quic(c, rc) == NGX_AGAIN) { |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1794 return; |
8281
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
1795 } |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1796 |
8225 | 1797 if (c->ssl) { |
1798 (void) ngx_ssl_shutdown(c); | |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1799 } |
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1800 |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1801 if (c->read->timer_set) { |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1802 ngx_del_timer(c->read); |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1803 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1804 |
8225 | 1805 #if (NGX_STAT_STUB) |
1806 (void) ngx_atomic_fetch_add(ngx_stat_active, -1); | |
1807 #endif | |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1808 |
8225 | 1809 c->destroyed = 1; |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1810 |
8225 | 1811 pool = c->pool; |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1812 |
8225 | 1813 ngx_close_connection(c); |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1814 |
8225 | 1815 ngx_destroy_pool(pool); |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1816 } |
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1817 |
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
1818 |
8193
4355efde26d8
Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents:
8192
diff
changeset
|
1819 static ngx_int_t |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1820 ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc) |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1821 { |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1822 ngx_uint_t i; |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1823 ngx_queue_t *q; |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1824 ngx_quic_send_ctx_t *ctx; |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1825 ngx_quic_server_id_t *sid; |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1826 ngx_quic_connection_t *qc; |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1827 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1828 qc = ngx_quic_get_connection(c); |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1829 |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1830 if (!qc->closing) { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1831 |
8398
8bec0ac23cf9
Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents:
8397
diff
changeset
|
1832 /* drop packets from retransmit queues, no ack is expected */ |
8bec0ac23cf9
Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents:
8397
diff
changeset
|
1833 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
8652
e9bd4305e68b
QUIC: fixed send contexts cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8651
diff
changeset
|
1834 ngx_quic_free_frames(c, &qc->send_ctx[i].sent); |
8398
8bec0ac23cf9
Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents:
8397
diff
changeset
|
1835 } |
8bec0ac23cf9
Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents:
8397
diff
changeset
|
1836 |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1837 if (rc == NGX_DONE) { |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1838 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1839 /* |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1840 * 10.2. Idle Timeout |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1841 * |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1842 * If the idle timeout is enabled by either peer, a connection is |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1843 * silently closed and its state is discarded when it remains idle |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1844 */ |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1845 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1846 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1847 "quic closing %s connection", |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1848 qc->draining ? "drained" : "idle"); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1849 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1850 } else { |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1851 |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1852 /* |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1853 * 10.3. Immediate Close |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1854 * |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1855 * An endpoint sends a CONNECTION_CLOSE frame (Section 19.19) |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1856 * to terminate the connection immediately. |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1857 */ |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1858 |
8475
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
1859 qc->error_level = c->ssl ? SSL_quic_read_level(c->ssl->connection) |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
1860 : ssl_encryption_initial; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
1861 |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1862 if (rc == NGX_OK) { |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
1863 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
1864 "quic immediate close drain:%d", |
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
1865 qc->draining); |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1866 |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1867 qc->close.log = c->log; |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1868 qc->close.data = c; |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1869 qc->close.handler = ngx_quic_close_timer_handler; |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1870 qc->close.cancelable = 1; |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1871 |
8475
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
1872 ctx = ngx_quic_get_send_ctx(qc, qc->error_level); |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
1873 |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
1874 ngx_add_timer(&qc->close, 3 * ngx_quic_pto(c, ctx)); |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1875 |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1876 qc->error = NGX_QUIC_ERR_NO_ERROR; |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1877 |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1878 } else { |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1879 if (qc->error == 0 && !qc->error_app) { |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1880 qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1881 } |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1882 |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1883 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
1884 "quic immediate close due to %s error: %ui %s", |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1885 qc->error_app ? "app " : "", qc->error, |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1886 qc->error_reason ? qc->error_reason : ""); |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1887 } |
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1888 |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1889 (void) ngx_quic_send_cc(c); |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1890 |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1891 if (qc->error_level == ssl_encryption_handshake) { |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1892 /* for clients that might not have handshake keys */ |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1893 qc->error_level = ssl_encryption_initial; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1894 (void) ngx_quic_send_cc(c); |
8400
d96ddef458cd
Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8399
diff
changeset
|
1895 } |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1896 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1897 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1898 qc->closing = 1; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1899 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1900 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1901 if (rc == NGX_ERROR && qc->close.timer_set) { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1902 /* do not wait for timer in case of fatal error */ |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1903 ngx_del_timer(&qc->close); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1904 } |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1905 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1906 if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) { |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1907 return NGX_AGAIN; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1908 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1909 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1910 if (qc->push.timer_set) { |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1911 ngx_del_timer(&qc->push); |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1912 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1913 |
8472 | 1914 if (qc->pto.timer_set) { |
1915 ngx_del_timer(&qc->pto); | |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1916 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1917 |
8434
ea4899591798
QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8433
diff
changeset
|
1918 if (qc->push.posted) { |
ea4899591798
QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8433
diff
changeset
|
1919 ngx_delete_posted_event(&qc->push); |
ea4899591798
QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8433
diff
changeset
|
1920 } |
ea4899591798
QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8433
diff
changeset
|
1921 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1922 while (!ngx_queue_empty(&qc->server_ids)) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1923 q = ngx_queue_head(&qc->server_ids); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1924 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1925 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1926 ngx_queue_remove(q); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1927 ngx_rbtree_delete(&c->listening->rbtree, &sid->udp.node); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1928 qc->nserver_ids--; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1929 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
1930 |
8553
dbcb9d0a3df1
QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents:
8546
diff
changeset
|
1931 if (qc->close.timer_set) { |
dbcb9d0a3df1
QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents:
8546
diff
changeset
|
1932 return NGX_AGAIN; |
dbcb9d0a3df1
QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents:
8546
diff
changeset
|
1933 } |
dbcb9d0a3df1
QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents:
8546
diff
changeset
|
1934 |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1935 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1936 "quic part of connection is terminated"); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1937 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1938 /* may be tested from SSL callback during SSL shutdown */ |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1939 c->udp = NULL; |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1940 |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1941 return NGX_OK; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1942 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1943 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1944 |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1945 void |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1946 ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err, |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1947 const char *reason) |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1948 { |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1949 ngx_quic_connection_t *qc; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1950 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
1951 qc = ngx_quic_get_connection(c); |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1952 qc->error = err; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1953 qc->error_reason = reason; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1954 qc->error_app = 1; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1955 qc->error_ftype = 0; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1956 |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1957 ngx_quic_close_connection(c, NGX_ERROR); |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1958 } |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1959 |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
1960 |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1961 void |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1962 ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err, |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1963 const char *reason) |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1964 { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1965 ngx_quic_connection_t *qc; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1966 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1967 qc = ngx_quic_get_connection(c); |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1968 qc->shutdown = 1; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1969 qc->shutdown_code = err; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1970 qc->shutdown_reason = reason; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1971 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1972 ngx_quic_shutdown_quic(c); |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1973 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1974 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
1975 |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1976 static void |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1977 ngx_quic_close_timer_handler(ngx_event_t *ev) |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1978 { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1979 ngx_connection_t *c; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1980 |
8359 | 1981 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic close timer"); |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1982 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1983 c = ev->data; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1984 ngx_quic_close_connection(c, NGX_DONE); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1985 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1986 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
1987 |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1988 static ngx_int_t |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1989 ngx_quic_close_streams(ngx_connection_t *c, ngx_quic_connection_t *qc) |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1990 { |
8503
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
1991 ngx_event_t *rev, *wev; |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1992 ngx_rbtree_t *tree; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1993 ngx_rbtree_node_t *node; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1994 ngx_quic_stream_t *qs; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1995 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1996 #if (NGX_DEBUG) |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1997 ngx_uint_t ns; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1998 #endif |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
1999 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2000 tree = &qc->streams.tree; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2001 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2002 if (tree->root == tree->sentinel) { |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2003 return NGX_OK; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2004 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2005 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2006 #if (NGX_DEBUG) |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2007 ns = 0; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2008 #endif |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2009 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2010 for (node = ngx_rbtree_min(tree->root, tree->sentinel); |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2011 node; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2012 node = ngx_rbtree_next(tree, node)) |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2013 { |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2014 qs = (ngx_quic_stream_t *) node; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2015 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2016 rev = qs->c->read; |
8503
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
2017 rev->error = 1; |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2018 rev->ready = 1; |
8503
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
2019 |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
2020 wev = qs->c->write; |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
2021 wev->error = 1; |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
2022 wev->ready = 1; |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2023 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2024 ngx_post_event(rev, &ngx_posted_events); |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2025 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2026 if (rev->timer_set) { |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2027 ngx_del_timer(rev); |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2028 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2029 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2030 #if (NGX_DEBUG) |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2031 ns++; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2032 #endif |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2033 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2034 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2035 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2036 "quic connection has %ui active streams", ns); |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2037 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2038 return NGX_AGAIN; |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2039 } |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2040 |
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2041 |
8703
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2042 ngx_int_t |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2043 ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err) |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2044 { |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2045 ngx_event_t *wev; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2046 ngx_connection_t *pc; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2047 ngx_quic_frame_t *frame; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2048 ngx_quic_stream_t *qs; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2049 ngx_quic_connection_t *qc; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2050 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2051 qs = c->quic; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2052 pc = qs->parent; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2053 qc = ngx_quic_get_connection(pc); |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2054 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2055 frame = ngx_quic_alloc_frame(pc); |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2056 if (frame == NULL) { |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2057 return NGX_ERROR; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2058 } |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2059 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2060 frame->level = ssl_encryption_application; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2061 frame->type = NGX_QUIC_FT_RESET_STREAM; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2062 frame->u.reset_stream.id = qs->id; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2063 frame->u.reset_stream.error_code = err; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2064 frame->u.reset_stream.final_size = c->sent; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2065 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2066 ngx_quic_queue_frame(qc, frame); |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2067 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2068 wev = c->write; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2069 wev->error = 1; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2070 wev->ready = 1; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2071 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2072 return NGX_OK; |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2073 } |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2074 |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
2075 |
8354
d11bc25fc4c3
Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents:
8350
diff
changeset
|
2076 static ngx_int_t |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
2077 ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf) |
8193
4355efde26d8
Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents:
8192
diff
changeset
|
2078 { |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2079 u_char *p; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2080 ngx_int_t rc; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2081 ngx_uint_t good; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2082 ngx_quic_header_t pkt; |
8193
4355efde26d8
Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents:
8192
diff
changeset
|
2083 |
8545
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2084 good = 0; |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2085 |
8304
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2086 p = b->pos; |
8208
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
8207
diff
changeset
|
2087 |
8304
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2088 while (p < b->last) { |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
2089 |
8225 | 2090 ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); |
2091 pkt.raw = b; | |
2092 pkt.data = p; | |
2093 pkt.len = b->last - p; | |
2094 pkt.log = c->log; | |
8251
c217a907ce42
Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents:
8247
diff
changeset
|
2095 pkt.flags = p[0]; |
8559
a89a58c642ef
QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents:
8558
diff
changeset
|
2096 pkt.raw->pos++; |
8193
4355efde26d8
Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents:
8192
diff
changeset
|
2097 |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
2098 rc = ngx_quic_process_packet(c, conf, &pkt); |
8193
4355efde26d8
Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents:
8192
diff
changeset
|
2099 |
8580
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2100 #if (NGX_DEBUG) |
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2101 if (pkt.parsed) { |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
2102 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8609
f32740ddd484
QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents:
8608
diff
changeset
|
2103 "quic packet %s done decr:%d pn:%L perr:%ui rc:%i", |
8580
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2104 ngx_quic_level_name(pkt.level), pkt.decrypted, |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
2105 pkt.pn, pkt.error, rc); |
8580
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2106 } else { |
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2107 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8609
f32740ddd484
QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents:
8608
diff
changeset
|
2108 "quic packet done parse failed rc:%i", rc); |
8580
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2109 } |
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2110 #endif |
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2111 |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2112 if (rc == NGX_ERROR) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2113 return NGX_ERROR; |
8225 | 2114 } |
8206
8d6ac639feac
Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents:
8205
diff
changeset
|
2115 |
8686 | 2116 if (rc == NGX_DONE) { |
2117 /* stop further processing */ | |
2118 return NGX_DECLINED; | |
2119 } | |
2120 | |
8545
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2121 if (rc == NGX_OK) { |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2122 good = 1; |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2123 } |
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2124 |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2125 /* NGX_OK || NGX_DECLINED */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2126 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2127 /* |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2128 * we get NGX_DECLINED when there are no keys [yet] available |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2129 * to decrypt packet. |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2130 * Instead of queueing it, we ignore it and rely on the sender's |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2131 * retransmission: |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2132 * |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2133 * 12.2. Coalescing Packets: |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2134 * |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2135 * For example, if decryption fails (because the keys are |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2136 * not available or any other reason), the receiver MAY either |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2137 * discard or buffer the packet for later processing and MUST |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2138 * attempt to process the remaining packets. |
8535
eb5aa85294e9
QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents:
8533
diff
changeset
|
2139 * |
eb5aa85294e9
QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents:
8533
diff
changeset
|
2140 * We also skip packets that don't match connection state |
eb5aa85294e9
QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents:
8533
diff
changeset
|
2141 * or cannot be parsed properly. |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2142 */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2143 |
8225 | 2144 /* b->pos is at header end, adjust by actual packet length */ |
8558
0f37b4ef3cd9
QUIC: keep the entire packet size in pkt->len.
Roman Arutyunyan <arut@nginx.com>
parents:
8557
diff
changeset
|
2145 b->pos = pkt.data + pkt.len; |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2146 |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2147 /* firefox workaround: skip zero padding at the end of quic packet */ |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2148 while (b->pos < b->last && *(b->pos) == 0) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2149 b->pos++; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2150 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2151 |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2152 p = b->pos; |
8304
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2153 } |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2154 |
8545
702f1d2581a4
QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents:
8541
diff
changeset
|
2155 return good ? NGX_OK : NGX_DECLINED; |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2156 } |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2157 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2158 |
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2159 static ngx_int_t |
8563
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
2160 ngx_quic_process_packet(ngx_connection_t *c, ngx_quic_conf_t *conf, |
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8562
diff
changeset
|
2161 ngx_quic_header_t *pkt) |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2162 { |
8536
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
2163 ngx_int_t rc; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2164 ngx_quic_connection_t *qc; |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2165 |
8576
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2166 c->log->action = "parsing quic packet"; |
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2167 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2168 rc = ngx_quic_parse_packet(pkt); |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2169 |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2170 if (rc == NGX_DECLINED || rc == NGX_ERROR) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2171 return rc; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2172 } |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2173 |
8580
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2174 pkt->parsed = 1; |
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2175 |
8576
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2176 c->log->action = "processing quic packet"; |
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2177 |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2178 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2179 "quic packet rx dcid len:%uz %xV", |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2180 pkt->dcid.len, &pkt->dcid); |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2181 |
8578
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
2182 #if (NGX_DEBUG) |
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
2183 if (pkt->level != ssl_encryption_application) { |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2184 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2185 "quic packet rx scid len:%uz %xV", |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2186 pkt->scid.len, &pkt->scid); |
8578
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
2187 } |
8641
fe53def49945
QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8639
diff
changeset
|
2188 |
fe53def49945
QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8639
diff
changeset
|
2189 if (pkt->level == ssl_encryption_initial) { |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2190 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
2191 "quic address validation token len:%uz %xV", |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
2192 pkt->token.len, &pkt->token); |
8641
fe53def49945
QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8639
diff
changeset
|
2193 } |
8578
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
2194 #endif |
52ad697f9d1c
QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents:
8577
diff
changeset
|
2195 |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2196 qc = ngx_quic_get_connection(c); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2197 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2198 if (qc) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2199 |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2200 if (rc == NGX_ABORT) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2201 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2202 "quic unsupported version: 0x%xD", pkt->version); |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2203 return NGX_DECLINED; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2204 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2205 |
8624
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
2206 if (pkt->level != ssl_encryption_application) { |
8688
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2207 |
8624
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
2208 if (pkt->version != qc->version) { |
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
2209 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
2210 "quic version mismatch: 0x%xD", pkt->version); |
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
2211 return NGX_DECLINED; |
340cd26158fb
QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8623
diff
changeset
|
2212 } |
8688
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2213 |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2214 if (ngx_quic_check_csid(qc, pkt) != NGX_OK) { |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2215 return NGX_DECLINED; |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
2216 } |
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
2217 |
8688
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2218 } else { |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2219 |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2220 if (ngx_quic_process_stateless_reset(c, pkt) == NGX_OK) { |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2221 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2222 "quic stateless reset packet detected"); |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2223 |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2224 qc->draining = 1; |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2225 ngx_quic_close_connection(c, NGX_OK); |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2226 |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2227 return NGX_OK; |
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2228 } |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2229 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2230 |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2231 return ngx_quic_process_payload(c, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2232 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2233 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2234 /* packet does not belong to a connection */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2235 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2236 if (rc == NGX_ABORT) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2237 return ngx_quic_negotiate_version(c, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2238 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2239 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2240 if (pkt->level == ssl_encryption_application) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2241 return ngx_quic_send_stateless_reset(c, conf, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2242 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2243 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2244 if (pkt->level != ssl_encryption_initial) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2245 return NGX_ERROR; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2246 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2247 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2248 c->log->action = "processing initial packet"; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2249 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2250 if (pkt->dcid.len < NGX_QUIC_CID_LEN_MIN) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2251 /* 7.2. Negotiating Connection IDs */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2252 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2253 "quic too short dcid in initial" |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2254 " packet: len:%i", pkt->dcid.len); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2255 return NGX_ERROR; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2256 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2257 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2258 /* process retry and initialize connection IDs */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2259 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2260 if (pkt->token.len) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2261 |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
2262 rc = ngx_quic_validate_token(c, conf->av_token_key, pkt); |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2263 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2264 if (rc == NGX_ERROR) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2265 /* internal error */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2266 return NGX_ERROR; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2267 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2268 } else if (rc == NGX_ABORT) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2269 /* token cannot be decrypted */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2270 return ngx_quic_send_early_cc(c, pkt, |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2271 NGX_QUIC_ERR_INVALID_TOKEN, |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2272 "cannot decrypt token"); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2273 } else if (rc == NGX_DECLINED) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2274 /* token is invalid */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2275 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2276 if (pkt->retried) { |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
2277 /* invalid address validation token */ |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2278 return ngx_quic_send_early_cc(c, pkt, |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2279 NGX_QUIC_ERR_INVALID_TOKEN, |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
2280 "invalid address validation token"); |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2281 } else if (conf->retry) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2282 /* invalid NEW_TOKEN */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2283 return ngx_quic_send_retry(c, conf, pkt); |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2284 } |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2285 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2286 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2287 /* NGX_OK */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2288 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2289 } else if (conf->retry) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2290 return ngx_quic_send_retry(c, conf, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2291 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2292 } else { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2293 pkt->odcid = pkt->dcid; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2294 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2295 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2296 if (ngx_terminate || ngx_exiting) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2297 if (conf->retry) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2298 return ngx_quic_send_retry(c, conf, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2299 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2300 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2301 return NGX_ERROR; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2302 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2303 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2304 c->log->action = "creating quic connection"; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2305 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2306 qc = ngx_quic_new_connection(c, conf, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2307 if (qc == NULL) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2308 return NGX_ERROR; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2309 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2310 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2311 return ngx_quic_process_payload(c, pkt); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2312 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2313 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2314 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2315 static ngx_int_t |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2316 ngx_quic_process_payload(ngx_connection_t *c, ngx_quic_header_t *pkt) |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2317 { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2318 ngx_int_t rc; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2319 ngx_quic_send_ctx_t *ctx; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2320 ngx_quic_connection_t *qc; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2321 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2322 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2323 qc = ngx_quic_get_connection(c); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2324 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2325 qc->error = 0; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2326 qc->error_reason = 0; |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2327 |
8576
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2328 c->log->action = "decrypting packet"; |
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2329 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2330 if (!ngx_quic_keys_available(qc->keys, pkt->level)) { |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2331 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2332 "quic no level %d keys yet, ignoring packet", pkt->level); |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2333 return NGX_DECLINED; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2334 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2335 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2336 pkt->keys = qc->keys; |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2337 pkt->key_phase = qc->key_phase; |
8383
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2338 pkt->plaintext = buf; |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2339 |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2340 ctx = ngx_quic_get_send_ctx(qc, pkt->level); |
7ea34e13937f
Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8382
diff
changeset
|
2341 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2342 rc = ngx_quic_decrypt(pkt, &ctx->largest_pn); |
8536
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
2343 if (rc != NGX_OK) { |
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
2344 qc->error = pkt->error; |
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
2345 qc->error_reason = "failed to decrypt packet"; |
c6b963de0c00
QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents:
8535
diff
changeset
|
2346 return rc; |
8223 | 2347 } |
2348 | |
8580
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2349 pkt->decrypted = 1; |
07971f870879
QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents:
8579
diff
changeset
|
2350 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2351 if (c->ssl == NULL) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2352 if (ngx_quic_init_connection(c) != NGX_OK) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2353 return NGX_ERROR; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2354 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2355 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2356 |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2357 if (pkt->level == ssl_encryption_handshake) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2358 /* |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2359 * 4.10.1. The successful use of Handshake packets indicates |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2360 * that no more Initial packets need to be exchanged |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2361 */ |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2362 ngx_quic_discard_ctx(c, ssl_encryption_initial); |
8611
e2086d8181fa
QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents:
8610
diff
changeset
|
2363 |
e2086d8181fa
QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents:
8610
diff
changeset
|
2364 if (qc->validated == 0) { |
e2086d8181fa
QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents:
8610
diff
changeset
|
2365 qc->validated = 1; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2366 ngx_post_event(&qc->push, &ngx_posted_events); |
8611
e2086d8181fa
QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents:
8610
diff
changeset
|
2367 } |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2368 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2369 |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2370 if (qc->closing) { |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2371 /* |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2372 * 10.1 Closing and Draining Connection States |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2373 * ... delayed or reordered packets are properly discarded. |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2374 * |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2375 * An endpoint retains only enough information to generate |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2376 * a packet containing a CONNECTION_CLOSE frame and to identify |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2377 * packets as belonging to the connection. |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2378 */ |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2379 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2380 qc->error_level = pkt->level; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2381 qc->error = NGX_QUIC_ERR_NO_ERROR; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2382 qc->error_reason = "connection is closing, packet discarded"; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2383 qc->error_ftype = 0; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2384 qc->error_app = 0; |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2385 |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2386 return ngx_quic_send_cc(c); |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2387 } |
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2388 |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2389 pkt->received = ngx_current_msec; |
8574
1d4417e4f2d0
QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8573
diff
changeset
|
2390 |
8576
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2391 c->log->action = "handling payload"; |
eacca87c476e
QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents:
8575
diff
changeset
|
2392 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2393 if (pkt->level != ssl_encryption_application) { |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2394 return ngx_quic_handle_frames(c, pkt); |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2395 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2396 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2397 if (!pkt->key_update) { |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2398 return ngx_quic_handle_frames(c, pkt); |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2399 } |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2400 |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2401 /* switch keys and generate next on Key Phase change */ |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2402 |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2403 qc->key_phase ^= 1; |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2404 ngx_quic_keys_switch(c, qc->keys); |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2405 |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2406 rc = ngx_quic_handle_frames(c, pkt); |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2407 if (rc != NGX_OK) { |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2408 return rc; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2409 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2410 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2411 return ngx_quic_keys_update(c, qc->keys); |
8223 | 2412 } |
2413 | |
2414 | |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2415 static ngx_int_t |
8686 | 2416 ngx_quic_send_early_cc(ngx_connection_t *c, ngx_quic_header_t *inpkt, |
2417 ngx_uint_t err, const char *reason) | |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2418 { |
8686 | 2419 ssize_t len; |
2420 ngx_str_t res; | |
2421 ngx_quic_frame_t frame; | |
2422 ngx_quic_header_t pkt; | |
2423 | |
2424 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; | |
2425 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; | |
2426 | |
2427 ngx_memzero(&frame, sizeof(ngx_quic_frame_t)); | |
2428 ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); | |
2429 | |
2430 frame.level = inpkt->level; | |
2431 frame.type = NGX_QUIC_FT_CONNECTION_CLOSE; | |
2432 frame.u.close.error_code = err; | |
2433 | |
2434 frame.u.close.reason.data = (u_char *) reason; | |
2435 frame.u.close.reason.len = ngx_strlen(reason); | |
2436 | |
2437 len = ngx_quic_create_frame(NULL, &frame); | |
2438 if (len > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) { | |
2439 return NGX_ERROR; | |
2440 } | |
2441 | |
2442 ngx_quic_log_frame(c->log, &frame, 1); | |
2443 | |
2444 len = ngx_quic_create_frame(src, &frame); | |
2445 if (len == -1) { | |
2446 return NGX_ERROR; | |
2447 } | |
2448 | |
2449 pkt.keys = ngx_quic_keys_new(c->pool); | |
2450 if (pkt.keys == NULL) { | |
2451 return NGX_ERROR; | |
2452 } | |
2453 | |
8710
44b4c6180106
QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8709
diff
changeset
|
2454 if (ngx_quic_keys_set_initial_secret(c->pool, pkt.keys, &inpkt->dcid, |
44b4c6180106
QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8709
diff
changeset
|
2455 inpkt->version) |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2456 != NGX_OK) |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2457 { |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2458 return NGX_ERROR; |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2459 } |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2460 |
8686 | 2461 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG |
2462 | NGX_QUIC_PKT_INITIAL; | |
2463 | |
2464 pkt.num_len = 1; | |
2465 /* | |
2466 * pkt.num = 0; | |
2467 * pkt.trunc = 0; | |
2468 */ | |
2469 | |
2470 pkt.version = inpkt->version; | |
2471 pkt.log = c->log; | |
2472 pkt.level = inpkt->level; | |
2473 pkt.dcid = inpkt->scid; | |
2474 pkt.scid = inpkt->dcid; | |
2475 pkt.payload.data = src; | |
2476 pkt.payload.len = len; | |
2477 | |
2478 res.data = dst; | |
2479 | |
2480 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { | |
2481 return NGX_ERROR; | |
2482 } | |
2483 | |
2484 if (ngx_quic_send(c, res.data, res.len) == NGX_ERROR) { | |
2485 return NGX_ERROR; | |
2486 } | |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2487 |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2488 return NGX_OK; |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2489 } |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2490 |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
2491 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2492 static void |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2493 ngx_quic_discard_ctx(ngx_connection_t *c, enum ssl_encryption_level_t level) |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2494 { |
8507
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2495 ngx_queue_t *q; |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2496 ngx_quic_frame_t *f; |
8339
aba84d9ab256
Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8338
diff
changeset
|
2497 ngx_quic_send_ctx_t *ctx; |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2498 ngx_quic_connection_t *qc; |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
2499 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2500 qc = ngx_quic_get_connection(c); |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2501 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2502 if (!ngx_quic_keys_available(qc->keys, level)) { |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2503 return; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2504 } |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2505 |
8621
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2506 ngx_quic_keys_discard(qc->keys, level); |
9c3be23ddbe7
QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8620
diff
changeset
|
2507 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2508 qc->pto_count = 0; |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2509 |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2510 ctx = ngx_quic_get_send_ctx(qc, level); |
8507
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2511 |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2512 while (!ngx_queue_empty(&ctx->sent)) { |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2513 q = ngx_queue_head(&ctx->sent); |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2514 ngx_queue_remove(q); |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2515 |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2516 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2517 ngx_quic_congestion_ack(c, f); |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2518 ngx_quic_free_frame(c, f); |
7f9938cbcd12
QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8506
diff
changeset
|
2519 } |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2520 |
8612
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2521 while (!ngx_queue_empty(&ctx->frames)) { |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2522 q = ngx_queue_head(&ctx->frames); |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2523 ngx_queue_remove(q); |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2524 |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2525 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2526 ngx_quic_congestion_ack(c, f); |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2527 ngx_quic_free_frame(c, f); |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2528 } |
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
2529 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2530 if (level == ssl_encryption_initial) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2531 ngx_quic_clear_temp_server_ids(c); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2532 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2533 |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2534 ctx->send_ack = 0; |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
2535 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
2536 ngx_quic_set_lost_timer(c); |
8304
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2537 } |
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2538 |
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2539 |
90f94413177e
TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8303
diff
changeset
|
2540 static ngx_int_t |
8688
a346905c359f
QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents:
8687
diff
changeset
|
2541 ngx_quic_check_csid(ngx_quic_connection_t *qc, ngx_quic_header_t *pkt) |
8361 | 2542 { |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2543 ngx_queue_t *q; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2544 ngx_quic_client_id_t *cid; |
8381
6e100d8c138a
Preserve original DCID and unbreak parsing 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8380
diff
changeset
|
2545 |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2546 for (q = ngx_queue_head(&qc->client_ids); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2547 q != ngx_queue_sentinel(&qc->client_ids); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2548 q = ngx_queue_next(q)) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2549 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2550 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2551 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2552 if (pkt->scid.len == cid->len |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2553 && ngx_memcmp(pkt->scid.data, cid->id, cid->len) == 0) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2554 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2555 return NGX_OK; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2556 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2557 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2558 |
8560
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2559 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic scid"); |
d0d3fc0697a0
QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents:
8559
diff
changeset
|
2560 return NGX_ERROR; |
8182
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
8180
diff
changeset
|
2561 } |
8171 | 2562 |
2563 | |
8225 | 2564 static ngx_int_t |
8687
1c6343bd7933
QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents:
8686
diff
changeset
|
2565 ngx_quic_handle_frames(ngx_connection_t *c, ngx_quic_header_t *pkt) |
8225 | 2566 { |
2567 u_char *end, *p; | |
2568 ssize_t len; | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2569 ngx_buf_t buf; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2570 ngx_uint_t do_close; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2571 ngx_chain_t chain; |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2572 ngx_quic_frame_t frame; |
8225 | 2573 ngx_quic_connection_t *qc; |
2574 | |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2575 qc = ngx_quic_get_connection(c); |
8225 | 2576 |
2577 p = pkt->payload.data; | |
2578 end = p + pkt->payload.len; | |
2579 | |
2580 do_close = 0; | |
2581 | |
2582 while (p < end) { | |
2583 | |
8275 | 2584 c->log->action = "parsing frames"; |
2585 | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2586 ngx_memzero(&buf, sizeof(ngx_buf_t)); |
8659
d9f673d18e9b
QUIC: set the temporary flag for input frame buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8658
diff
changeset
|
2587 buf.temporary = 1; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2588 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2589 chain.buf = &buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2590 chain.next = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2591 frame.data = &chain; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2592 |
8240
1f002206a59b
Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents:
8239
diff
changeset
|
2593 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
|
2594 |
8225 | 2595 if (len < 0) { |
8385
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
2596 qc->error = pkt->error; |
8225 | 2597 return NGX_ERROR; |
2598 } | |
2599 | |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
2600 ngx_quic_log_frame(c->log, &frame, 0); |
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
2601 |
8275 | 2602 c->log->action = "handling frames"; |
2603 | |
8225 | 2604 p += len; |
2605 | |
2606 switch (frame.type) { | |
2607 | |
2608 case NGX_QUIC_FT_ACK: | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
2609 if (ngx_quic_handle_ack_frame(c, pkt, &frame) != NGX_OK) { |
8225 | 2610 return NGX_ERROR; |
2611 } | |
2612 | |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2613 continue; |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2614 |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2615 case NGX_QUIC_FT_PADDING: |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2616 /* no action required */ |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2617 continue; |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2618 |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2619 case NGX_QUIC_FT_CONNECTION_CLOSE: |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
2620 case NGX_QUIC_FT_CONNECTION_CLOSE_APP: |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2621 do_close = 1; |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2622 continue; |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2623 } |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2624 |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2625 /* got there with ack-eliciting packet */ |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2626 pkt->need_ack = 1; |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2627 |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2628 switch (frame.type) { |
8225 | 2629 |
2630 case NGX_QUIC_FT_CRYPTO: | |
2631 | |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
2632 if (ngx_quic_handle_crypto_frame(c, pkt, &frame) != NGX_OK) { |
8225 | 2633 return NGX_ERROR; |
2634 } | |
2635 | |
2636 break; | |
2637 | |
2638 case NGX_QUIC_FT_PING: | |
2639 break; | |
2640 | |
2641 case NGX_QUIC_FT_STREAM0: | |
2642 case NGX_QUIC_FT_STREAM1: | |
2643 case NGX_QUIC_FT_STREAM2: | |
2644 case NGX_QUIC_FT_STREAM3: | |
2645 case NGX_QUIC_FT_STREAM4: | |
2646 case NGX_QUIC_FT_STREAM5: | |
2647 case NGX_QUIC_FT_STREAM6: | |
2648 case NGX_QUIC_FT_STREAM7: | |
2649 | |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
2650 if (ngx_quic_handle_stream_frame(c, pkt, &frame) != NGX_OK) { |
8225 | 2651 return NGX_ERROR; |
2652 } | |
2653 | |
2654 break; | |
2655 | |
8237
ff540f13d95d
MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8236
diff
changeset
|
2656 case NGX_QUIC_FT_MAX_DATA: |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2657 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2658 if (ngx_quic_handle_max_data_frame(c, &frame.u.max_data) != NGX_OK) |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2659 { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2660 return NGX_ERROR; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2661 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2662 |
8237
ff540f13d95d
MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8236
diff
changeset
|
2663 break; |
ff540f13d95d
MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8236
diff
changeset
|
2664 |
8236
d3b26c3bea22
Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents:
8235
diff
changeset
|
2665 case NGX_QUIC_FT_STREAMS_BLOCKED: |
d3b26c3bea22
Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents:
8235
diff
changeset
|
2666 case NGX_QUIC_FT_STREAMS_BLOCKED2: |
8245
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2667 |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2668 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
|
2669 &frame.u.streams_blocked) |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2670 != NGX_OK) |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2671 { |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2672 return NGX_ERROR; |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2673 } |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
2674 |
8236
d3b26c3bea22
Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents:
8235
diff
changeset
|
2675 break; |
d3b26c3bea22
Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents:
8235
diff
changeset
|
2676 |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2677 case NGX_QUIC_FT_STREAM_DATA_BLOCKED: |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2678 |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2679 if (ngx_quic_handle_stream_data_blocked_frame(c, pkt, |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2680 &frame.u.stream_data_blocked) |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2681 != NGX_OK) |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2682 { |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2683 return NGX_ERROR; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2684 } |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2685 |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2686 break; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
2687 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2688 case NGX_QUIC_FT_MAX_STREAM_DATA: |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2689 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2690 if (ngx_quic_handle_max_stream_data_frame(c, pkt, |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2691 &frame.u.max_stream_data) |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2692 != NGX_OK) |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2693 { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2694 return NGX_ERROR; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2695 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2696 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2697 break; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
2698 |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2699 case NGX_QUIC_FT_RESET_STREAM: |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2700 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2701 if (ngx_quic_handle_reset_stream_frame(c, pkt, |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2702 &frame.u.reset_stream) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2703 != NGX_OK) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2704 { |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2705 return NGX_ERROR; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2706 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2707 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2708 break; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2709 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2710 case NGX_QUIC_FT_STOP_SENDING: |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2711 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2712 if (ngx_quic_handle_stop_sending_frame(c, pkt, |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2713 &frame.u.stop_sending) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2714 != NGX_OK) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2715 { |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2716 return NGX_ERROR; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2717 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2718 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2719 break; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
2720 |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2721 case NGX_QUIC_FT_MAX_STREAMS: |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2722 case NGX_QUIC_FT_MAX_STREAMS2: |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2723 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2724 if (ngx_quic_handle_max_streams_frame(c, pkt, &frame.u.max_streams) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2725 != NGX_OK) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2726 { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2727 return NGX_ERROR; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2728 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2729 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2730 break; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
2731 |
8531
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2732 case NGX_QUIC_FT_PATH_CHALLENGE: |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2733 |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2734 if (ngx_quic_handle_path_challenge_frame(c, pkt, |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2735 &frame.u.path_challenge) |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2736 != NGX_OK) |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2737 { |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2738 return NGX_ERROR; |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2739 } |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2740 |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2741 break; |
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
2742 |
8737
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2743 case NGX_QUIC_FT_PATH_RESPONSE: |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2744 |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2745 if (ngx_quic_handle_path_response_frame(c, pkt, |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2746 &frame.u.path_response) |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2747 != NGX_OK) |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2748 { |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2749 return NGX_ERROR; |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2750 } |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2751 |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2752 break; |
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
2753 |
8325
9b9d592c0da3
Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents:
8322
diff
changeset
|
2754 case NGX_QUIC_FT_NEW_CONNECTION_ID: |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2755 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2756 if (ngx_quic_handle_new_connection_id_frame(c, pkt, &frame.u.ncid) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2757 != NGX_OK) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2758 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2759 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2760 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2761 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2762 break; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
2763 |
8325
9b9d592c0da3
Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents:
8322
diff
changeset
|
2764 case NGX_QUIC_FT_RETIRE_CONNECTION_ID: |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2765 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2766 if (ngx_quic_handle_retire_connection_id_frame(c, pkt, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2767 &frame.u.retire_cid) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2768 != NGX_OK) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2769 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2770 return NGX_ERROR; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2771 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2772 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2773 break; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
2774 |
8225 | 2775 default: |
8346
4e4485793418
Added MAX_STREAM_DATA stub handler.
Vladimir Homutov <vl@nginx.com>
parents:
8345
diff
changeset
|
2776 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 2777 "quic missing frame handler"); |
8225 | 2778 return NGX_ERROR; |
2779 } | |
2780 } | |
2781 | |
2782 if (p != end) { | |
2783 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
2784 "quic trailing garbage in payload:%ui bytes", end - p); |
8385
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
2785 |
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
2786 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; |
8225 | 2787 return NGX_ERROR; |
2788 } | |
2789 | |
2790 if (do_close) { | |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
2791 qc->draining = 1; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
2792 ngx_quic_close_connection(c, NGX_OK); |
8225 | 2793 } |
2794 | |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2795 if (ngx_quic_ack_packet(c, pkt) != NGX_OK) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2796 return NGX_ERROR; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2797 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2798 |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2799 return NGX_OK; |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2800 } |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2801 |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2802 |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
2803 static ngx_int_t |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2804 ngx_quic_ack_packet(ngx_connection_t *c, ngx_quic_header_t *pkt) |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2805 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2806 uint64_t base, largest, smallest, gs, ge, gap, range, pn; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2807 uint64_t prev_pending; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2808 ngx_uint_t i, nr; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2809 ngx_quic_send_ctx_t *ctx; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2810 ngx_quic_ack_range_t *r; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2811 ngx_quic_connection_t *qc; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2812 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2813 c->log->action = "preparing ack"; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2814 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2815 qc = ngx_quic_get_connection(c); |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2816 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2817 ctx = ngx_quic_get_send_ctx(qc, pkt->level); |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2818 |
8599
c01964fd7b8b
QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents:
8598
diff
changeset
|
2819 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
2820 "quic ngx_quic_ack_packet pn:%uL largest %L fr:%uL" |
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
2821 " nranges:%ui", pkt->pn, (int64_t) ctx->largest_range, |
8599
c01964fd7b8b
QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents:
8598
diff
changeset
|
2822 ctx->first_range, ctx->nranges); |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2823 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2824 prev_pending = ctx->pending_ack; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2825 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2826 if (pkt->need_ack) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2827 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
2828 ngx_post_event(&qc->push, &ngx_posted_events); |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2829 |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2830 if (ctx->send_ack == 0) { |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2831 ctx->ack_delay_start = ngx_current_msec; |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2832 } |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2833 |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2834 ctx->send_ack++; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2835 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
2836 if (ctx->pending_ack == NGX_QUIC_UNSET_PN |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2837 || ctx->pending_ack < pkt->pn) |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2838 { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2839 ctx->pending_ack = pkt->pn; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2840 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2841 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2842 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2843 base = ctx->largest_range; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2844 pn = pkt->pn; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2845 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
2846 if (base == NGX_QUIC_UNSET_PN) { |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2847 ctx->largest_range = pn; |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2848 ctx->largest_received = pkt->received; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2849 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2850 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2851 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2852 if (base == pn) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2853 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2854 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2855 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2856 largest = base; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2857 smallest = largest - ctx->first_range; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2858 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2859 if (pn > base) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2860 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2861 if (pn - base == 1) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2862 ctx->first_range++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2863 ctx->largest_range = pn; |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2864 ctx->largest_received = pkt->received; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2865 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2866 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2867 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2868 } else { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2869 /* new gap in front of current largest */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2870 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2871 /* no place for new range, send current range as is */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2872 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2873 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
2874 if (prev_pending != NGX_QUIC_UNSET_PN) { |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2875 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2876 return NGX_ERROR; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2877 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2878 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2879 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2880 if (prev_pending == ctx->pending_ack || !pkt->need_ack) { |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
2881 ctx->pending_ack = NGX_QUIC_UNSET_PN; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2882 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2883 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2884 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2885 gap = pn - base - 2; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2886 range = ctx->first_range; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2887 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2888 ctx->first_range = 0; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2889 ctx->largest_range = pn; |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2890 ctx->largest_received = pkt->received; |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2891 |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2892 /* packet is out of order, force send */ |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2893 if (pkt->need_ack) { |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2894 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2895 } |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2896 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2897 i = 0; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2898 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2899 goto insert; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2900 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2901 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2902 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2903 /* pn < base, perform lookup in existing ranges */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2904 |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2905 /* packet is out of order */ |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2906 if (pkt->need_ack) { |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2907 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2908 } |
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
2909 |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2910 if (pn >= smallest && pn <= largest) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2911 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2912 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2913 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2914 #if (NGX_SUPPRESS_WARN) |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2915 r = NULL; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2916 #endif |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2917 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2918 for (i = 0; i < ctx->nranges; i++) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2919 r = &ctx->ranges[i]; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2920 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2921 ge = smallest - 1; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2922 gs = ge - r->gap; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2923 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2924 if (pn >= gs && pn <= ge) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2925 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2926 if (gs == ge) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2927 /* gap size is exactly one packet, now filled */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2928 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2929 /* data moves to previous range, current is removed */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2930 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2931 if (i == 0) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2932 ctx->first_range += r->range + 2; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2933 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2934 } else { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2935 ctx->ranges[i - 1].range += r->range + 2; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2936 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2937 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2938 nr = ctx->nranges - i - 1; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2939 if (nr) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2940 ngx_memmove(&ctx->ranges[i], &ctx->ranges[i + 1], |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2941 sizeof(ngx_quic_ack_range_t) * nr); |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2942 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2943 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2944 ctx->nranges--; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2945 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2946 } else if (pn == gs) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2947 /* current gap shrinks from tail (current range grows) */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2948 r->gap--; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2949 r->range++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2950 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2951 } else if (pn == ge) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2952 /* current gap shrinks from head (previous range grows) */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2953 r->gap--; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2954 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2955 if (i == 0) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2956 ctx->first_range++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2957 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2958 } else { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2959 ctx->ranges[i - 1].range++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2960 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2961 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2962 } else { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2963 /* current gap is split into two parts */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2964 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2965 gap = ge - pn - 1; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2966 range = 0; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2967 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2968 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
2969 if (prev_pending != NGX_QUIC_UNSET_PN) { |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2970 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2971 return NGX_ERROR; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2972 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2973 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2974 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2975 if (prev_pending == ctx->pending_ack || !pkt->need_ack) { |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
2976 ctx->pending_ack = NGX_QUIC_UNSET_PN; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2977 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2978 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2979 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2980 r->gap = pn - gs - 1; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2981 goto insert; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2982 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2983 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2984 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2985 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2986 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2987 largest = smallest - r->gap - 2; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2988 smallest = largest - r->range; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2989 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2990 if (pn >= smallest && pn <= largest) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2991 /* this packet number is already known */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2992 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2993 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2994 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2995 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2996 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2997 if (pn == smallest - 1) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2998 /* extend first or last range */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
2999 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3000 if (i == 0) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3001 ctx->first_range++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3002 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3003 } else { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3004 r->range++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3005 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3006 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3007 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3008 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3009 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3010 /* nothing found, add new range at the tail */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3011 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3012 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3013 /* packet is too old to keep it */ |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3014 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3015 if (pkt->need_ack) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3016 return ngx_quic_send_ack_range(c, ctx, pn, pn); |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3017 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3018 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3019 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3020 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3021 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3022 gap = smallest - 2 - pn; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3023 range = 0; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3024 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3025 insert: |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3026 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3027 if (ctx->nranges < NGX_QUIC_MAX_RANGES) { |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3028 ctx->nranges++; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3029 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3030 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3031 ngx_memmove(&ctx->ranges[i + 1], &ctx->ranges[i], |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3032 sizeof(ngx_quic_ack_range_t) * (ctx->nranges - i - 1)); |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3033 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3034 ctx->ranges[i].gap = gap; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3035 ctx->ranges[i].range = range; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3036 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3037 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3038 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3039 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3040 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3041 static ngx_int_t |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3042 ngx_quic_send_ack_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3043 uint64_t smallest, uint64_t largest) |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
3044 { |
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
3045 ngx_quic_frame_t *frame; |
8225 | 3046 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3047 frame = ngx_quic_alloc_frame(c); |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
3048 if (frame == NULL) { |
8225 | 3049 return NGX_ERROR; |
3050 } | |
3051 | |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3052 frame->level = ctx->level; |
8367
c10e7d48aa85
Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8365
diff
changeset
|
3053 frame->type = NGX_QUIC_FT_ACK; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3054 frame->u.ack.largest = largest; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3055 frame->u.ack.delay = 0; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3056 frame->u.ack.range_count = 0; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3057 frame->u.ack.first_range = largest - smallest; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3058 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3059 return NGX_OK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3060 } |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3061 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3062 |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3063 static void |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3064 ngx_quic_drop_ack_ranges(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3065 uint64_t pn) |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3066 { |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3067 uint64_t base; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3068 ngx_uint_t i, smallest, largest; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3069 ngx_quic_ack_range_t *r; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3070 |
8599
c01964fd7b8b
QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents:
8598
diff
changeset
|
3071 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3072 "quic ngx_quic_drop_ack_ranges pn:%uL largest:%uL" |
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3073 " fr:%uL nranges:%ui", pn, ctx->largest_range, |
8599
c01964fd7b8b
QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents:
8598
diff
changeset
|
3074 ctx->first_range, ctx->nranges); |
c01964fd7b8b
QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents:
8598
diff
changeset
|
3075 |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3076 base = ctx->largest_range; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3077 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
3078 if (base == NGX_QUIC_UNSET_PN) { |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3079 return; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3080 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3081 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
3082 if (ctx->pending_ack != NGX_QUIC_UNSET_PN && pn >= ctx->pending_ack) { |
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
3083 ctx->pending_ack = NGX_QUIC_UNSET_PN; |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3084 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3085 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3086 largest = base; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3087 smallest = largest - ctx->first_range; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3088 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3089 if (pn >= largest) { |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
3090 ctx->largest_range = NGX_QUIC_UNSET_PN; |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3091 ctx->first_range = 0; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3092 ctx->nranges = 0; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3093 return; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3094 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3095 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3096 if (pn >= smallest) { |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3097 ctx->first_range = largest - pn - 1; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3098 ctx->nranges = 0; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3099 return; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3100 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3101 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3102 for (i = 0; i < ctx->nranges; i++) { |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3103 r = &ctx->ranges[i]; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3104 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3105 largest = smallest - r->gap - 2; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3106 smallest = largest - r->range; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3107 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3108 if (pn >= largest) { |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3109 ctx->nranges = i; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3110 return; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3111 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3112 if (pn >= smallest) { |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3113 r->range = largest - pn - 1; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3114 ctx->nranges = i + 1; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3115 return; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3116 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3117 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3118 } |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3119 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3120 |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3121 static ngx_int_t |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3122 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3123 { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3124 size_t len, left; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3125 uint64_t ack_delay; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3126 ngx_buf_t *b; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3127 ngx_uint_t i; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3128 ngx_chain_t *cl, **ll; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3129 ngx_quic_frame_t *frame; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3130 ngx_quic_connection_t *qc; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3131 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3132 qc = ngx_quic_get_connection(c); |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3133 |
8662
b9ac4752d0e6
QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents:
8661
diff
changeset
|
3134 ack_delay = ngx_current_msec - ctx->largest_received; |
b9ac4752d0e6
QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents:
8661
diff
changeset
|
3135 ack_delay *= 1000; |
8693
3956bbf91002
QUIC: use server ack_delay_exponent when sending ack.
Roman Arutyunyan <arut@nginx.com>
parents:
8692
diff
changeset
|
3136 ack_delay >>= qc->tp.ack_delay_exponent; |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
3137 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3138 frame = ngx_quic_alloc_frame(c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3139 if (frame == NULL) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3140 return NGX_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3141 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3142 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3143 ll = &frame->data; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3144 b = NULL; |
8613
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
3145 |
867c189f875d
QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8612
diff
changeset
|
3146 for (i = 0; i < ctx->nranges; i++) { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3147 len = ngx_quic_create_ack_range(NULL, ctx->ranges[i].gap, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3148 ctx->ranges[i].range); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3149 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3150 left = b ? b->end - b->last : 0; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3151 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3152 if (left < len) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3153 cl = ngx_quic_alloc_buf(c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3154 if (cl == NULL) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3155 return NGX_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3156 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3157 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3158 *ll = cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3159 ll = &cl->next; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3160 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3161 b = cl->buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3162 left = b->end - b->last; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3163 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3164 if (left < len) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3165 return NGX_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3166 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3167 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3168 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3169 b->last += ngx_quic_create_ack_range(b->last, ctx->ranges[i].gap, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3170 ctx->ranges[i].range); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3171 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3172 frame->u.ack.ranges_length += len; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3173 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3174 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3175 *ll = NULL; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3176 |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3177 frame->level = ctx->level; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3178 frame->type = NGX_QUIC_FT_ACK; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3179 frame->u.ack.largest = ctx->largest_range; |
8603
c5ea341f705a
QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents:
8602
diff
changeset
|
3180 frame->u.ack.delay = ack_delay; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3181 frame->u.ack.range_count = ctx->nranges; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3182 frame->u.ack.first_range = ctx->first_range; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
3183 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3184 ngx_quic_queue_frame(qc, frame); |
8225 | 3185 |
8309 | 3186 return NGX_OK; |
8225 | 3187 } |
3188 | |
3189 | |
3190 static ngx_int_t | |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3191 ngx_quic_send_cc(ngx_connection_t *c) |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3192 { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3193 ngx_quic_frame_t *frame; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3194 ngx_quic_connection_t *qc; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3195 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3196 qc = ngx_quic_get_connection(c); |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3197 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3198 if (qc->draining) { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3199 return NGX_OK; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3200 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3201 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3202 if (qc->closing |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3203 && ngx_current_msec - qc->last_cc < NGX_QUIC_CC_MIN_INTERVAL) |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3204 { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3205 /* dot not send CC too often */ |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3206 return NGX_OK; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3207 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3208 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3209 frame = ngx_quic_alloc_frame(c); |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3210 if (frame == NULL) { |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3211 return NGX_ERROR; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3212 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3213 |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3214 frame->level = qc->error_level; |
8692
0697294f79a4
QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8688
diff
changeset
|
3215 frame->type = qc->error_app ? NGX_QUIC_FT_CONNECTION_CLOSE_APP |
0697294f79a4
QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8688
diff
changeset
|
3216 : NGX_QUIC_FT_CONNECTION_CLOSE; |
8458
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3217 frame->u.close.error_code = qc->error; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3218 frame->u.close.frame_type = qc->error_ftype; |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3219 |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3220 if (qc->error_reason) { |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3221 frame->u.close.reason.len = ngx_strlen(qc->error_reason); |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
8450
diff
changeset
|
3222 frame->u.close.reason.data = (u_char *) qc->error_reason; |
8399
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
3223 } |
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
3224 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3225 ngx_quic_queue_frame(qc, frame); |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3226 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3227 qc->last_cc = ngx_current_msec; |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3228 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3229 return ngx_quic_output(c); |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3230 } |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3231 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3232 |
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
3233 static ngx_int_t |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3234 ngx_quic_send_new_token(ngx_connection_t *c) |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3235 { |
8686 | 3236 time_t expires; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3237 ngx_str_t token; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3238 ngx_quic_frame_t *frame; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3239 ngx_quic_connection_t *qc; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3240 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3241 qc = ngx_quic_get_connection(c); |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3242 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3243 if (!qc->conf->retry) { |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3244 return NGX_OK; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3245 } |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3246 |
8686 | 3247 expires = ngx_time() + NGX_QUIC_NEW_TOKEN_LIFETIME; |
3248 | |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
3249 if (ngx_quic_new_token(c, qc->conf->av_token_key, &token, NULL, expires, 0) |
8686 | 3250 != NGX_OK) |
3251 { | |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3252 return NGX_ERROR; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3253 } |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3254 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3255 frame = ngx_quic_alloc_frame(c); |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3256 if (frame == NULL) { |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3257 return NGX_ERROR; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3258 } |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3259 |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3260 frame->level = ssl_encryption_application; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3261 frame->type = NGX_QUIC_FT_NEW_TOKEN; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3262 frame->u.token.length = token.len; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3263 frame->u.token.data = token.data; |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
3264 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3265 ngx_quic_queue_frame(qc, frame); |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3266 |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3267 return NGX_OK; |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3268 } |
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3269 |
8450 | 3270 |
8384
52d0c4832570
Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8383
diff
changeset
|
3271 static ngx_int_t |
8225 | 3272 ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3273 ngx_quic_frame_t *f) |
8225 | 3274 { |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3275 ssize_t n; |
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3276 u_char *pos, *end; |
8502
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3277 uint64_t min, max, gap, range; |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3278 ngx_msec_t send_time; |
8502
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3279 ngx_uint_t i; |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3280 ngx_quic_send_ctx_t *ctx; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3281 ngx_quic_ack_frame_t *ack; |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3282 ngx_quic_connection_t *qc; |
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3283 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3284 qc = ngx_quic_get_connection(c); |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3285 |
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3286 ctx = ngx_quic_get_send_ctx(qc, pkt->level); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3287 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3288 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3289 "quic ngx_quic_handle_ack_frame level:%d", pkt->level); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3290 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3291 ack = &f->u.ack; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3292 |
8326 | 3293 /* |
8385
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
3294 * If any computed packet number is negative, an endpoint MUST |
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
3295 * generate a connection error of type FRAME_ENCODING_ERROR. |
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
3296 * (19.3.1) |
8326 | 3297 */ |
3298 | |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3299 if (ack->first_range > ack->largest) { |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3300 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3301 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
8361 | 3302 "quic invalid first range in ack frame"); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3303 return NGX_ERROR; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3304 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3305 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3306 min = ack->largest - ack->first_range; |
8326 | 3307 max = ack->largest; |
3308 | |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3309 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time) |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3310 != NGX_OK) |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3311 { |
8326 | 3312 return NGX_ERROR; |
3313 } | |
3314 | |
3315 /* 13.2.3. Receiver Tracking of ACK Frames */ | |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
3316 if (ctx->largest_ack < max || ctx->largest_ack == NGX_QUIC_UNSET_PN) { |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
3317 ctx->largest_ack = max; |
8326 | 3318 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3319 "quic updated largest received ack:%uL", max); |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3320 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3321 /* |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3322 * An endpoint generates an RTT sample on receiving an |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3323 * ACK frame that meets the following two conditions: |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3324 * |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3325 * - the largest acknowledged packet number is newly acknowledged |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3326 * - at least one of the newly acknowledged packets was ack-eliciting. |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3327 */ |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3328 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3329 if (send_time != NGX_TIMER_INFINITE) { |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3330 ngx_quic_rtt_sample(c, ack, pkt->level, send_time); |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3331 } |
8326 | 3332 } |
3333 | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3334 if (f->data) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3335 pos = f->data->buf->pos; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3336 end = f->data->buf->last; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3337 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3338 } else { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3339 pos = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3340 end = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3341 } |
8326 | 3342 |
3343 for (i = 0; i < ack->range_count; i++) { | |
3344 | |
8604
b3d9e57d0f62
QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents:
8603
diff
changeset
|
3345 n = ngx_quic_parse_ack_range(pkt->log, pos, end, &gap, &range); |
8326 | 3346 if (n == NGX_ERROR) { |
3347 return NGX_ERROR; | |
3348 } | |
3349 pos += n; | |
3350 | |
8502
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3351 if (gap + 2 > min) { |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3352 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; |
8326 | 3353 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3354 "quic invalid range:%ui in ack frame", i); |
8326 | 3355 return NGX_ERROR; |
3356 } | |
3357 | |
8502
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3358 max = min - gap - 2; |
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3359 |
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3360 if (range > max) { |
8471
9ed4c12ec948
QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents:
8470
diff
changeset
|
3361 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; |
8326 | 3362 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3363 "quic invalid range:%ui in ack frame", i); |
8326 | 3364 return NGX_ERROR; |
3365 } | |
3366 | |
8502
69033a50c3ae
QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8501
diff
changeset
|
3367 min = max - range; |
8326 | 3368 |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3369 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time) |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3370 != NGX_OK) |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3371 { |
8326 | 3372 return NGX_ERROR; |
3373 } | |
3374 } | |
3375 | |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
3376 return ngx_quic_detect_lost(c); |
8326 | 3377 } |
3378 | |
3379 | |
3380 static ngx_int_t | |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
3381 ngx_quic_handle_ack_frame_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3382 uint64_t min, uint64_t max, ngx_msec_t *send_time) |
8326 | 3383 { |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3384 ngx_uint_t found; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3385 ngx_queue_t *q; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3386 ngx_quic_frame_t *f; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3387 ngx_quic_connection_t *qc; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3388 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3389 qc = ngx_quic_get_connection(c); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3390 |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3391 *send_time = NGX_TIMER_INFINITE; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3392 found = 0; |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3393 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3394 q = ngx_queue_last(&ctx->sent); |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
3395 |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
3396 while (q != ngx_queue_sentinel(&ctx->sent)) { |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3397 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3398 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3399 q = ngx_queue_prev(q); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3400 |
8326 | 3401 if (f->pnum >= min && f->pnum <= max) { |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3402 ngx_quic_congestion_ack(c, f); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3403 |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3404 switch (f->type) { |
8600
06af25901b1a
QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents:
8599
diff
changeset
|
3405 case NGX_QUIC_FT_ACK: |
06af25901b1a
QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents:
8599
diff
changeset
|
3406 case NGX_QUIC_FT_ACK_ECN: |
06af25901b1a
QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents:
8599
diff
changeset
|
3407 ngx_quic_drop_ack_ranges(c, ctx, f->u.ack.largest); |
06af25901b1a
QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents:
8599
diff
changeset
|
3408 break; |
8597
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3409 |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3410 case NGX_QUIC_FT_STREAM0: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3411 case NGX_QUIC_FT_STREAM1: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3412 case NGX_QUIC_FT_STREAM2: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3413 case NGX_QUIC_FT_STREAM3: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3414 case NGX_QUIC_FT_STREAM4: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3415 case NGX_QUIC_FT_STREAM5: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3416 case NGX_QUIC_FT_STREAM6: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3417 case NGX_QUIC_FT_STREAM7: |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3418 ngx_quic_handle_stream_ack(c, f); |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3419 break; |
0351fcf52a03
QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents:
8596
diff
changeset
|
3420 } |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3421 |
8663
1823e2152fc4
QUIC: always calculate rtt for largest acknowledged packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8662
diff
changeset
|
3422 if (f->pnum == max) { |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3423 *send_time = f->last; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3424 } |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3425 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3426 ngx_queue_remove(&f->queue); |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3427 ngx_quic_free_frame(c, f); |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3428 found = 1; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3429 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3430 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3431 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3432 if (!found) { |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3433 |
8437
4e75267865de
QUIC: fixed off-by-one in frame range handler.
Vladimir Homutov <vl@nginx.com>
parents:
8436
diff
changeset
|
3434 if (max < ctx->pnum) { |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3435 /* duplicate ACK or ACK for non-ack-eliciting frame */ |
8326 | 3436 return NGX_OK; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3437 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3438 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3439 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
8401 | 3440 "quic ACK for the packet not sent"); |
8385
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
3441 |
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
3442 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; |
8399
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
3443 qc->error_ftype = NGX_QUIC_FT_ACK; |
ffd362e87eb2
Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents:
8398
diff
changeset
|
3444 qc->error_reason = "unknown packet number"; |
8385
fb7422074258
Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents:
8384
diff
changeset
|
3445 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3446 return NGX_ERROR; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3447 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
3448 |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3449 if (!qc->push.timer_set) { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3450 ngx_post_event(&qc->push, &ngx_posted_events); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3451 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3452 |
8475
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3453 qc->pto_count = 0; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3454 |
8225 | 3455 return NGX_OK; |
3456 } | |
3457 | |
3458 | |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3459 static void |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3460 ngx_quic_rtt_sample(ngx_connection_t *c, ngx_quic_ack_frame_t *ack, |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3461 enum ssl_encryption_level_t level, ngx_msec_t send_time) |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3462 { |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3463 ngx_msec_t latest_rtt, ack_delay, adjusted_rtt, rttvar_sample; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3464 ngx_quic_connection_t *qc; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3465 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3466 qc = ngx_quic_get_connection(c); |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3467 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3468 latest_rtt = ngx_current_msec - send_time; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3469 qc->latest_rtt = latest_rtt; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3470 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3471 if (qc->min_rtt == NGX_TIMER_INFINITE) { |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3472 qc->min_rtt = latest_rtt; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3473 qc->avg_rtt = latest_rtt; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3474 qc->rttvar = latest_rtt / 2; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3475 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3476 } else { |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3477 qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt); |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3478 |
8662
b9ac4752d0e6
QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents:
8661
diff
changeset
|
3479 ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000; |
b9ac4752d0e6
QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents:
8661
diff
changeset
|
3480 |
b9ac4752d0e6
QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents:
8661
diff
changeset
|
3481 if (c->ssl->handshaked) { |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3482 ack_delay = ngx_min(ack_delay, qc->ctp.max_ack_delay); |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3483 } |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3484 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3485 adjusted_rtt = latest_rtt; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3486 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3487 if (qc->min_rtt + ack_delay < latest_rtt) { |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3488 adjusted_rtt -= ack_delay; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3489 } |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3490 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3491 qc->avg_rtt = 0.875 * qc->avg_rtt + 0.125 * adjusted_rtt; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3492 rttvar_sample = ngx_abs((ngx_msec_int_t) (qc->avg_rtt - adjusted_rtt)); |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3493 qc->rttvar = 0.75 * qc->rttvar + 0.25 * rttvar_sample; |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3494 } |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3495 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3496 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3497 "quic rtt sample latest:%M min:%M avg:%M var:%M", |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3498 latest_rtt, qc->min_rtt, qc->avg_rtt, qc->rttvar); |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3499 } |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3500 |
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3501 |
8737
76f476ce4d31
QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
8736
diff
changeset
|
3502 ngx_msec_t |
8475
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3503 ngx_quic_pto(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3504 { |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3505 ngx_msec_t duration; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3506 ngx_quic_connection_t *qc; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3507 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3508 qc = ngx_quic_get_connection(c); |
8475
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3509 |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3510 /* PTO calculation: quic-recovery, Appendix 8 */ |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3511 duration = qc->avg_rtt; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3512 |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3513 duration += ngx_max(4 * qc->rttvar, NGX_QUIC_TIME_GRANULARITY); |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3514 duration <<= qc->pto_count; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3515 |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3516 if (qc->congestion.in_flight == 0) { /* no in-flight packets */ |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3517 return duration; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3518 } |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3519 |
8661
49efd27dace6
QUIC: use client max_ack_delay when computing pto timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8660
diff
changeset
|
3520 if (ctx->level == ssl_encryption_application && c->ssl->handshaked) { |
49efd27dace6
QUIC: use client max_ack_delay when computing pto timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8660
diff
changeset
|
3521 duration += qc->ctp.max_ack_delay << qc->pto_count; |
8475
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3522 } |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3523 |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3524 return duration; |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3525 } |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3526 |
b276833111cf
QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents:
8474
diff
changeset
|
3527 |
8469
3b107aadc9f6
QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents:
8458
diff
changeset
|
3528 static void |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3529 ngx_quic_handle_stream_ack(ngx_connection_t *c, ngx_quic_frame_t *f) |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3530 { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3531 uint64_t sent, unacked; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3532 ngx_event_t *wev; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3533 ngx_quic_stream_t *sn; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3534 ngx_quic_connection_t *qc; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3535 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3536 qc = ngx_quic_get_connection(c); |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3537 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3538 sn = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3539 if (sn == NULL) { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3540 return; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3541 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3542 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3543 wev = sn->c->write; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3544 sent = sn->c->sent; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3545 unacked = sent - sn->acked; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3546 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3547 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3548 wev->ready = 1; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3549 ngx_post_event(wev, &ngx_posted_events); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3550 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3551 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3552 sn->acked += f->u.stream.length; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3553 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3554 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, sn->c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3555 "quic stream ack len:%uL acked:%uL unacked:%uL", |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3556 f->u.stream.length, sn->acked, sent - sn->acked); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3557 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3558 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
3559 |
8225 | 3560 static ngx_int_t |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3561 ngx_quic_handle_ordered_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs, |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
3562 ngx_quic_frame_t *frame, ngx_quic_frame_handler_pt handler, void *data) |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3563 { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3564 size_t full_len; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3565 ngx_int_t rc; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3566 ngx_queue_t *q; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3567 ngx_quic_ordered_frame_t *f; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3568 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3569 f = &frame->u.ord; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3570 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3571 if (f->offset > fs->received) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3572 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3573 "quic out-of-order frame: expecting:%uL got:%uL", |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3574 fs->received, f->offset); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3575 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3576 return ngx_quic_buffer_frame(c, fs, frame); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3577 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3578 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3579 if (f->offset < fs->received) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3580 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3581 if (ngx_quic_adjust_frame_offset(c, frame, fs->received) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3582 == NGX_DONE) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3583 { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3584 /* old/duplicate data range */ |
8566
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3585 return handler == ngx_quic_crypto_input ? NGX_DECLINED : NGX_OK; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3586 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3587 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3588 /* intersecting data range, frame modified */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3589 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3590 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3591 /* f->offset == fs->received */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3592 |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
3593 rc = handler(c, frame, data); |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3594 if (rc == NGX_ERROR) { |
8225 | 3595 return NGX_ERROR; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3596 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3597 } else if (rc == NGX_DONE) { |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3598 /* handler destroyed stream, queue no longer exists */ |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3599 return NGX_OK; |
8225 | 3600 } |
3601 | |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3602 /* rc == NGX_OK */ |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3603 |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3604 fs->received += f->length; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3605 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3606 /* now check the queue if we can continue with buffered frames */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3607 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3608 do { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3609 q = ngx_queue_head(&fs->frames); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3610 if (q == ngx_queue_sentinel(&fs->frames)) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3611 break; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3612 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3613 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3614 frame = ngx_queue_data(q, ngx_quic_frame_t, queue); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3615 f = &frame->u.ord; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3616 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3617 if (f->offset > fs->received) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3618 /* gap found, nothing more to do */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3619 break; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3620 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3621 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3622 full_len = f->length; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3623 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3624 if (f->offset < fs->received) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3625 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3626 if (ngx_quic_adjust_frame_offset(c, frame, fs->received) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3627 == NGX_DONE) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3628 { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3629 /* old/duplicate data range */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3630 ngx_queue_remove(q); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3631 fs->total -= f->length; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3632 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3633 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3634 "quic skipped buffered frame, total:%ui", |
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3635 fs->total); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3636 ngx_quic_free_frame(c, frame); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3637 continue; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3638 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3639 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3640 /* frame was adjusted, proceed to input */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3641 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3642 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3643 /* f->offset == fs->received */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3644 |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
3645 rc = handler(c, frame, data); |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3646 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3647 if (rc == NGX_ERROR) { |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3648 return NGX_ERROR; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3649 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3650 } else if (rc == NGX_DONE) { |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3651 /* handler destroyed stream, queue no longer exists */ |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3652 return NGX_OK; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3653 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3654 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3655 fs->received += f->length; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3656 fs->total -= full_len; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3657 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3658 ngx_queue_remove(q); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3659 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3660 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3661 "quic consumed buffered frame, total:%ui", fs->total); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3662 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3663 ngx_quic_free_frame(c, frame); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3664 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3665 } while (1); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3666 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3667 return NGX_OK; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3668 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3669 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3670 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3671 static ngx_int_t |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3672 ngx_quic_adjust_frame_offset(ngx_connection_t *c, ngx_quic_frame_t *frame, |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3673 uint64_t offset_in) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3674 { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3675 size_t tail, n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3676 ngx_buf_t *b; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3677 ngx_chain_t *cl; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3678 ngx_quic_ordered_frame_t *f; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3679 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3680 f = &frame->u.ord; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3681 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3682 tail = offset_in - f->offset; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3683 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3684 if (tail >= f->length) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3685 /* range preceeding already received data or duplicate, ignore */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3686 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3687 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 3688 "quic old or duplicate data in ordered frame, ignored"); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3689 return NGX_DONE; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3690 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3691 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3692 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 3693 "quic adjusted ordered frame data start to expected offset"); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3694 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3695 /* intersecting range: adjust data size */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3696 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3697 f->offset += tail; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3698 f->length -= tail; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3699 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3700 for (cl = frame->data; cl; cl = cl->next) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3701 b = cl->buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3702 n = ngx_buf_size(b); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3703 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3704 if (n >= tail) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3705 b->pos += tail; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3706 break; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3707 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3708 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3709 cl->buf->pos = cl->buf->last; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3710 tail -= n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3711 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3712 |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3713 return NGX_OK; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3714 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3715 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3716 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3717 static ngx_int_t |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3718 ngx_quic_buffer_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs, |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3719 ngx_quic_frame_t *frame) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3720 { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3721 ngx_queue_t *q; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3722 ngx_quic_frame_t *dst, *item; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3723 ngx_quic_ordered_frame_t *f, *df; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3724 |
8359 | 3725 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
3726 "quic ngx_quic_buffer_frame"); | |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3727 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3728 f = &frame->u.ord; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3729 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3730 /* frame start offset is in the future, buffer it */ |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3731 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3732 dst = ngx_quic_alloc_frame(c); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3733 if (dst == NULL) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3734 return NGX_ERROR; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3735 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3736 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3737 ngx_memcpy(dst, frame, sizeof(ngx_quic_frame_t)); |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3738 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3739 dst->data = ngx_quic_copy_chain(c, frame->data, 0); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3740 if (dst->data == NGX_CHAIN_ERROR) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3741 return NGX_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3742 } |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3743 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3744 df = &dst->u.ord; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3745 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3746 fs->total += f->length; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3747 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3748 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8702
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3749 "quic ordered frame with unexpected offset:" |
d4e02b3b734f
QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8701
diff
changeset
|
3750 " buffered total:%ui", fs->total); |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3751 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3752 if (ngx_queue_empty(&fs->frames)) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3753 ngx_queue_insert_after(&fs->frames, &dst->queue); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3754 return NGX_OK; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3755 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3756 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3757 for (q = ngx_queue_last(&fs->frames); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3758 q != ngx_queue_sentinel(&fs->frames); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3759 q = ngx_queue_prev(q)) |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3760 { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3761 item = ngx_queue_data(q, ngx_quic_frame_t, queue); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3762 f = &item->u.ord; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3763 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3764 if (f->offset < df->offset) { |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3765 ngx_queue_insert_after(q, &dst->queue); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3766 return NGX_OK; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3767 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3768 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3769 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3770 ngx_queue_insert_after(&fs->frames, &dst->queue); |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3771 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3772 return NGX_OK; |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3773 } |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3774 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3775 |
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3776 static ngx_int_t |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3777 ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3778 ngx_quic_frame_t *frame) |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3779 { |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3780 uint64_t last; |
8566
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3781 ngx_int_t rc; |
8573
6226f834b420
QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8572
diff
changeset
|
3782 ngx_quic_send_ctx_t *ctx; |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3783 ngx_quic_connection_t *qc; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3784 ngx_quic_crypto_frame_t *f; |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3785 ngx_quic_frames_stream_t *fs; |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3786 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3787 qc = ngx_quic_get_connection(c); |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3788 fs = &qc->crypto[pkt->level]; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3789 f = &frame->u.crypto; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3790 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3791 /* no overflow since both values are 62-bit */ |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3792 last = f->offset + f->length; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3793 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3794 if (last > fs->received && last - fs->received > NGX_QUIC_MAX_BUFFERED) { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3795 qc->error = NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3796 return NGX_ERROR; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3797 } |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3798 |
8566
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3799 rc = ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_crypto_input, |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3800 NULL); |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3801 if (rc != NGX_DECLINED) { |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3802 return rc; |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3803 } |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3804 |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3805 /* speeding up handshake completion */ |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3806 |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3807 if (pkt->level == ssl_encryption_initial) { |
8573
6226f834b420
QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8572
diff
changeset
|
3808 ctx = ngx_quic_get_send_ctx(qc, pkt->level); |
6226f834b420
QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8572
diff
changeset
|
3809 |
6226f834b420
QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8572
diff
changeset
|
3810 if (!ngx_queue_empty(&ctx->sent)) { |
6226f834b420
QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8572
diff
changeset
|
3811 ngx_quic_resend_frames(c, ctx); |
8660
6201cef77b1d
QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents:
8659
diff
changeset
|
3812 |
6201cef77b1d
QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents:
8659
diff
changeset
|
3813 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_handshake); |
6201cef77b1d
QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents:
8659
diff
changeset
|
3814 while (!ngx_queue_empty(&ctx->sent)) { |
6201cef77b1d
QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents:
8659
diff
changeset
|
3815 ngx_quic_resend_frames(c, ctx); |
6201cef77b1d
QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents:
8659
diff
changeset
|
3816 } |
8573
6226f834b420
QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8572
diff
changeset
|
3817 } |
8566
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3818 } |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3819 |
9588a2782c62
QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8565
diff
changeset
|
3820 return NGX_OK; |
8335
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3821 } |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3822 |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3823 |
76839f55bc48
Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents:
8334
diff
changeset
|
3824 static ngx_int_t |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
3825 ngx_quic_crypto_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data) |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3826 { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3827 int n, sslerr; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3828 ngx_buf_t *b; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3829 ngx_chain_t *cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3830 ngx_ssl_conn_t *ssl_conn; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3831 ngx_quic_connection_t *qc; |
8333
167d32476737
Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents:
8332
diff
changeset
|
3832 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3833 qc = ngx_quic_get_connection(c); |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3834 |
8225 | 3835 ssl_conn = c->ssl->connection; |
3836 | |
3837 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, | |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
3838 "quic SSL_quic_read_level:%d SSL_quic_write_level:%d", |
8225 | 3839 (int) SSL_quic_read_level(ssl_conn), |
3840 (int) SSL_quic_write_level(ssl_conn)); | |
3841 | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3842 for (cl = frame->data; cl; cl = cl->next) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3843 b = cl->buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3844 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3845 if (!SSL_provide_quic_data(ssl_conn, SSL_quic_read_level(ssl_conn), |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3846 b->pos, b->last - b->pos)) |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3847 { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3848 ngx_ssl_error(NGX_LOG_INFO, c->log, 0, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3849 "SSL_provide_quic_data() failed"); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3850 return NGX_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3851 } |
8225 | 3852 } |
3853 | |
3854 n = SSL_do_handshake(ssl_conn); | |
3855 | |
8620
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3856 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3857 "quic SSL_quic_read_level:%d SSL_quic_write_level:%d", |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3858 (int) SSL_quic_read_level(ssl_conn), |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3859 (int) SSL_quic_write_level(ssl_conn)); |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3860 |
8225 | 3861 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n); |
3862 | |
8620
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3863 if (n <= 0) { |
8225 | 3864 sslerr = SSL_get_error(ssl_conn, n); |
3865 | |
3866 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", | |
3867 sslerr); | |
3868 | |
8300
23a2b5e7acc8
Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8299
diff
changeset
|
3869 if (sslerr != SSL_ERROR_WANT_READ) { |
8225 | 3870 ngx_ssl_error(NGX_LOG_ERR, c->log, 0, "SSL_do_handshake() failed"); |
8300
23a2b5e7acc8
Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8299
diff
changeset
|
3871 return NGX_ERROR; |
8225 | 3872 } |
8263
1295b293d09a
Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents:
8260
diff
changeset
|
3873 |
8620
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3874 return NGX_OK; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3875 } |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3876 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3877 if (SSL_in_init(ssl_conn)) { |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3878 return NGX_OK; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3879 } |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3880 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3881 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3882 "quic ssl cipher:%s", SSL_get_cipher(ssl_conn)); |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3883 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3884 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3885 "quic handshake completed successfully"); |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3886 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3887 c->ssl->handshaked = 1; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3888 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
3889 frame = ngx_quic_alloc_frame(c); |
8620
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3890 if (frame == NULL) { |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3891 return NGX_ERROR; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3892 } |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3893 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3894 /* 12.4 Frames and frame types, figure 8 */ |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3895 frame->level = ssl_encryption_application; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3896 frame->type = NGX_QUIC_FT_HANDSHAKE_DONE; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3897 ngx_quic_queue_frame(qc, frame); |
8620
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3898 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3899 if (ngx_quic_send_new_token(c) != NGX_OK) { |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3900 return NGX_ERROR; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3901 } |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3902 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3903 /* |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3904 * Generating next keys before a key update is received. |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3905 * See quic-tls 9.4 Header Protection Timing Side-Channels. |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3906 */ |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3907 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3908 if (ngx_quic_keys_update(c, qc->keys) != NGX_OK) { |
8620
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3909 return NGX_ERROR; |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3910 } |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3911 |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3912 /* |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3913 * 4.10.2 An endpoint MUST discard its handshake keys |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3914 * when the TLS handshake is confirmed |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3915 */ |
d10118e38943
QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8619
diff
changeset
|
3916 ngx_quic_discard_ctx(c, ssl_encryption_handshake); |
8225 | 3917 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
3918 if (ngx_quic_issue_server_ids(c) != NGX_OK) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
3919 return NGX_ERROR; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
3920 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
3921 |
8225 | 3922 return NGX_OK; |
3923 } | |
3924 | |
3925 | |
3926 static ngx_int_t | |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3927 ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3928 ngx_quic_frame_t *frame) |
8225 | 3929 { |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3930 size_t window; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3931 uint64_t last; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3932 ngx_buf_t *b; |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3933 ngx_pool_t *pool; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3934 ngx_connection_t *sc; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3935 ngx_quic_stream_t *sn; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3936 ngx_quic_connection_t *qc; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3937 ngx_quic_stream_frame_t *f; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3938 ngx_quic_frames_stream_t *fs; |
8225 | 3939 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3940 qc = ngx_quic_get_connection(c); |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3941 f = &frame->u.stream; |
8225 | 3942 |
8427
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3943 if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL) |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3944 && (f->stream_id & NGX_QUIC_STREAM_SERVER_INITIATED)) |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3945 { |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3946 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3947 return NGX_ERROR; |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3948 } |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3949 |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3950 /* no overflow since both values are 62-bit */ |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3951 last = f->offset + f->length; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3952 |
8225 | 3953 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id); |
3954 | |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3955 if (sn == NULL) { |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3956 sn = ngx_quic_create_client_stream(c, f->stream_id); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3957 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3958 if (sn == NULL) { |
8427
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3959 return NGX_ERROR; |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3960 } |
d437ee1ce81e
Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8424
diff
changeset
|
3961 |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3962 if (sn == NGX_QUIC_STREAM_GONE) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3963 return NGX_OK; |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
3964 } |
8337
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
3965 |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3966 sc = sn->c; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3967 fs = &sn->fs; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3968 b = sn->b; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3969 window = b->end - b->last; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3970 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3971 if (last > window) { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3972 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3973 goto cleanup; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3974 } |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3975 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3976 if (ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input, |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3977 sn) |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3978 != NGX_OK) |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3979 { |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3980 goto cleanup; |
8337
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
3981 } |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
3982 |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3983 sc->listening->handler(sc); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3984 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
3985 return NGX_OK; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3986 } |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3987 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3988 fs = &sn->fs; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3989 b = sn->b; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3990 window = (b->pos - b->start) + (b->end - b->last); |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3991 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3992 if (last > fs->received && last - fs->received > window) { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
3993 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR; |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3994 return NGX_ERROR; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3995 } |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
3996 |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
3997 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input, |
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
3998 sn); |
8530
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
3999 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4000 cleanup: |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4001 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4002 pool = sc->pool; |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4003 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4004 ngx_close_connection(sc); |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4005 ngx_destroy_pool(pool); |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4006 |
f882b1784f30
QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents:
8528
diff
changeset
|
4007 return NGX_ERROR; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4008 } |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4009 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4010 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4011 static ngx_int_t |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
4012 ngx_quic_stream_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data) |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4013 { |
8501
fc16e303003a
QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8500
diff
changeset
|
4014 uint64_t id; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4015 ngx_buf_t *b; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4016 ngx_event_t *rev; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4017 ngx_chain_t *cl; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4018 ngx_quic_stream_t *sn; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4019 ngx_quic_connection_t *qc; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4020 ngx_quic_stream_frame_t *f; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4021 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4022 qc = ngx_quic_get_connection(c); |
8378
81a4f98a2556
Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents:
8377
diff
changeset
|
4023 sn = data; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4024 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4025 f = &frame->u.stream; |
8501
fc16e303003a
QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8500
diff
changeset
|
4026 id = f->stream_id; |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4027 |
8225 | 4028 b = sn->b; |
8337
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4029 |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4030 if ((size_t) ((b->pos - b->start) + (b->end - b->last)) < f->length) { |
8361 | 4031 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
4032 "quic no space in stream buffer"); | |
8337
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4033 return NGX_ERROR; |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4034 } |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4035 |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4036 if ((size_t) (b->end - b->last) < f->length) { |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4037 b->last = ngx_movemem(b->start, b->pos, b->last - b->pos); |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4038 b->pos = b->start; |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4039 } |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4040 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4041 for (cl = frame->data; cl; cl = cl->next) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4042 b->last = ngx_cpymem(b->last, cl->buf->pos, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4043 cl->buf->last - cl->buf->pos); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4044 } |
8225 | 4045 |
8294
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
4046 rev = sn->c->read; |
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
4047 rev->ready = 1; |
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
4048 |
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
4049 if (f->fin) { |
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
4050 rev->pending_eof = 1; |
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
4051 } |
8225 | 4052 |
8337
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4053 if (rev->active) { |
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4054 rev->handler(rev); |
8314
de8981bf2dd5
Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8312
diff
changeset
|
4055 } |
de8981bf2dd5
Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8312
diff
changeset
|
4056 |
8337
ab443e80d9e4
Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents:
8336
diff
changeset
|
4057 /* check if stream was destroyed by handler */ |
8501
fc16e303003a
QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8500
diff
changeset
|
4058 if (ngx_quic_find_stream(&qc->streams.tree, id) == NULL) { |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4059 return NGX_DONE; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4060 } |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
4061 |
8225 | 4062 return NGX_OK; |
4063 } | |
4064 | |
4065 | |
8245
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
4066 static ngx_int_t |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4067 ngx_quic_handle_max_data_frame(ngx_connection_t *c, |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4068 ngx_quic_max_data_frame_t *f) |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4069 { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4070 ngx_event_t *wev; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4071 ngx_rbtree_t *tree; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4072 ngx_rbtree_node_t *node; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4073 ngx_quic_stream_t *qs; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4074 ngx_quic_connection_t *qc; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4075 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4076 qc = ngx_quic_get_connection(c); |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4077 tree = &qc->streams.tree; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4078 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4079 if (f->max_data <= qc->streams.send_max_data) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4080 return NGX_OK; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4081 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4082 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4083 if (qc->streams.sent >= qc->streams.send_max_data) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4084 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4085 for (node = ngx_rbtree_min(tree->root, tree->sentinel); |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4086 node; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4087 node = ngx_rbtree_next(tree, node)) |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4088 { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4089 qs = (ngx_quic_stream_t *) node; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4090 wev = qs->c->write; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4091 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4092 if (wev->active) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4093 wev->ready = 1; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4094 ngx_post_event(wev, &ngx_posted_events); |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4095 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4096 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4097 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4098 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4099 qc->streams.send_max_data = f->max_data; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4100 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4101 return NGX_OK; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4102 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4103 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4104 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4105 static ngx_int_t |
8245
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
4106 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
|
4107 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
|
4108 { |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
4109 return NGX_OK; |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
4110 } |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
4111 |
a14afe21e692
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents:
8241
diff
changeset
|
4112 |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4113 static ngx_int_t |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4114 ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c, |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4115 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f) |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4116 { |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
4117 size_t n; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
4118 ngx_buf_t *b; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
4119 ngx_quic_frame_t *frame; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
4120 ngx_quic_stream_t *sn; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
4121 ngx_quic_connection_t *qc; |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4122 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4123 qc = ngx_quic_get_connection(c); |
8429
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4124 |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4125 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4126 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED)) |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4127 { |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4128 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4129 return NGX_ERROR; |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4130 } |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4131 |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4132 sn = ngx_quic_find_stream(&qc->streams.tree, f->id); |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4133 |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4134 if (sn == NULL) { |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4135 sn = ngx_quic_create_client_stream(c, f->id); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4136 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4137 if (sn == NULL) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4138 return NGX_ERROR; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4139 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4140 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4141 if (sn == NGX_QUIC_STREAM_GONE) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4142 return NGX_OK; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4143 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4144 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4145 b = sn->b; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4146 n = b->end - b->last; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4147 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4148 sn->c->listening->handler(sn->c); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4149 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4150 } else { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4151 b = sn->b; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4152 n = sn->fs.received + (b->pos - b->start) + (b->end - b->last); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4153 } |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4154 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4155 frame = ngx_quic_alloc_frame(c); |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4156 if (frame == NULL) { |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4157 return NGX_ERROR; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4158 } |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4159 |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4160 frame->level = pkt->level; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4161 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4162 frame->u.max_stream_data.id = f->id; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4163 frame->u.max_stream_data.limit = n; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4164 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4165 ngx_quic_queue_frame(qc, frame); |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4166 |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4167 return NGX_OK; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4168 } |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4169 |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
4170 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4171 static ngx_int_t |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4172 ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c, |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4173 ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f) |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4174 { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4175 uint64_t sent; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4176 ngx_event_t *wev; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4177 ngx_quic_stream_t *sn; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4178 ngx_quic_connection_t *qc; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4179 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4180 qc = ngx_quic_get_connection(c); |
8429
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4181 |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4182 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4183 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4184 { |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4185 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4186 return NGX_ERROR; |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4187 } |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4188 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4189 sn = ngx_quic_find_stream(&qc->streams.tree, f->id); |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4190 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4191 if (sn == NULL) { |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4192 sn = ngx_quic_create_client_stream(c, f->id); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4193 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4194 if (sn == NULL) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4195 return NGX_ERROR; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4196 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4197 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4198 if (sn == NGX_QUIC_STREAM_GONE) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4199 return NGX_OK; |
8429
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4200 } |
8fc9fcf18608
Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8428
diff
changeset
|
4201 |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4202 if (f->limit > sn->send_max_data) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4203 sn->send_max_data = f->limit; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4204 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4205 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4206 sn->c->listening->handler(sn->c); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4207 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
4208 return NGX_OK; |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4209 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4210 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4211 if (f->limit <= sn->send_max_data) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4212 return NGX_OK; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4213 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4214 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4215 sent = sn->c->sent; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4216 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4217 if (sent >= sn->send_max_data) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4218 wev = sn->c->write; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4219 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4220 if (wev->active) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4221 wev->ready = 1; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4222 ngx_post_event(wev, &ngx_posted_events); |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4223 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4224 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4225 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4226 sn->send_max_data = f->limit; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4227 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4228 return NGX_OK; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4229 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4230 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
4231 |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4232 static ngx_int_t |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4233 ngx_quic_handle_reset_stream_frame(ngx_connection_t *c, |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4234 ngx_quic_header_t *pkt, ngx_quic_reset_stream_frame_t *f) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4235 { |
8505
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4236 ngx_event_t *rev; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4237 ngx_connection_t *sc; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4238 ngx_quic_stream_t *sn; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4239 ngx_quic_connection_t *qc; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4240 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4241 qc = ngx_quic_get_connection(c); |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4242 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4243 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4244 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED)) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4245 { |
8505
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4246 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4247 return NGX_ERROR; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4248 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4249 |
8505
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4250 sn = ngx_quic_find_stream(&qc->streams.tree, f->id); |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4251 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4252 if (sn == NULL) { |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4253 sn = ngx_quic_create_client_stream(c, f->id); |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4254 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4255 if (sn == NULL) { |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4256 return NGX_ERROR; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4257 } |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4258 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4259 if (sn == NGX_QUIC_STREAM_GONE) { |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4260 return NGX_OK; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4261 } |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4262 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4263 sc = sn->c; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4264 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4265 rev = sc->read; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4266 rev->error = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4267 rev->ready = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4268 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4269 sc->listening->handler(sc); |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4270 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4271 return NGX_OK; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4272 } |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4273 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4274 rev = sn->c->read; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4275 rev->error = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4276 rev->ready = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4277 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4278 if (rev->active) { |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4279 rev->handler(rev); |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4280 } |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4281 |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4282 return NGX_OK; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4283 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4284 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4285 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4286 static ngx_int_t |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4287 ngx_quic_handle_stop_sending_frame(ngx_connection_t *c, |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4288 ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4289 { |
8505
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4290 ngx_event_t *wev; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4291 ngx_connection_t *sc; |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4292 ngx_quic_stream_t *sn; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4293 ngx_quic_connection_t *qc; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4294 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4295 qc = ngx_quic_get_connection(c); |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4296 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4297 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4298 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4299 { |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4300 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4301 return NGX_ERROR; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4302 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4303 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4304 sn = ngx_quic_find_stream(&qc->streams.tree, f->id); |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4305 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4306 if (sn == NULL) { |
8505
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4307 sn = ngx_quic_create_client_stream(c, f->id); |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4308 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4309 if (sn == NULL) { |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4310 return NGX_ERROR; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4311 } |
8505
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4312 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4313 if (sn == NGX_QUIC_STREAM_GONE) { |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4314 return NGX_OK; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4315 } |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4316 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4317 sc = sn->c; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4318 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4319 wev = sc->write; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4320 wev->error = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4321 wev->ready = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4322 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4323 sc->listening->handler(sc); |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4324 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4325 return NGX_OK; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4326 } |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4327 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4328 wev = sn->c->write; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4329 wev->error = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4330 wev->ready = 1; |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4331 |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4332 if (wev->active) { |
240931629995
QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents:
8504
diff
changeset
|
4333 wev->handler(wev); |
8428
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4334 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4335 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4336 return NGX_OK; |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4337 } |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4338 |
953cf44708b0
Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8427
diff
changeset
|
4339 |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4340 static ngx_int_t |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4341 ngx_quic_handle_max_streams_frame(ngx_connection_t *c, |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4342 ngx_quic_header_t *pkt, ngx_quic_max_streams_frame_t *f) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4343 { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4344 ngx_quic_connection_t *qc; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4345 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4346 qc = ngx_quic_get_connection(c); |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4347 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4348 if (f->bidi) { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4349 if (qc->streams.server_max_streams_bidi < f->limit) { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4350 qc->streams.server_max_streams_bidi = f->limit; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4351 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4352 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4353 "quic max_streams_bidi:%uL", f->limit); |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4354 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4355 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4356 } else { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4357 if (qc->streams.server_max_streams_uni < f->limit) { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4358 qc->streams.server_max_streams_uni = f->limit; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4359 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4360 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4361 "quic max_streams_uni:%uL", f->limit); |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4362 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4363 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4364 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4365 return NGX_OK; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4366 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4367 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
4368 |
8531
4ff2a0b747d1
QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents:
8530
diff
changeset
|
4369 static ngx_int_t |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4370 ngx_quic_handle_new_connection_id_frame(ngx_connection_t *c, |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4371 ngx_quic_header_t *pkt, ngx_quic_new_conn_id_frame_t *f) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4372 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4373 ngx_queue_t *q; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4374 ngx_quic_client_id_t *cid, *item; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4375 ngx_quic_connection_t *qc; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4376 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4377 qc = ngx_quic_get_connection(c); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4378 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4379 if (f->seqnum < qc->max_retired_seqnum) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4380 /* |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4381 * An endpoint that receives a NEW_CONNECTION_ID frame with |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4382 * a sequence number smaller than the Retire Prior To field |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4383 * of a previously received NEW_CONNECTION_ID frame MUST send |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4384 * a corresponding RETIRE_CONNECTION_ID frame that retires |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4385 * the newly received connection ID, unless it has already |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4386 * done so for that sequence number. |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4387 */ |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4388 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4389 if (ngx_quic_retire_connection_id(c, pkt->level, f->seqnum) != NGX_OK) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4390 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4391 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4392 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4393 goto retire; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4394 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4395 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4396 cid = NULL; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4397 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4398 for (q = ngx_queue_head(&qc->client_ids); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4399 q != ngx_queue_sentinel(&qc->client_ids); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4400 q = ngx_queue_next(q)) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4401 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4402 item = ngx_queue_data(q, ngx_quic_client_id_t, queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4403 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4404 if (item->seqnum == f->seqnum) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4405 cid = item; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4406 break; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4407 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4408 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4409 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4410 if (cid) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4411 /* |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4412 * Transmission errors, timeouts and retransmissions might cause the |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4413 * same NEW_CONNECTION_ID frame to be received multiple times |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4414 */ |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4415 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4416 if (cid->len != f->len |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4417 || ngx_strncmp(cid->id, f->cid, f->len) != 0 |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
4418 || ngx_strncmp(cid->sr_token, f->srt, NGX_QUIC_SR_TOKEN_LEN) != 0) |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4419 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4420 /* |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4421 * ..a sequence number is used for different connection IDs, |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4422 * the endpoint MAY treat that receipt as a connection error |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4423 * of type PROTOCOL_VIOLATION. |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4424 */ |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4425 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4426 qc->error_reason = "seqnum refers to different connection id/token"; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4427 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4428 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4429 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4430 } else { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4431 |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
4432 cid = ngx_quic_alloc_client_id(c, qc); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4433 if (cid == NULL) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4434 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4435 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4436 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4437 cid->seqnum = f->seqnum; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4438 cid->len = f->len; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4439 ngx_memcpy(cid->id, f->cid, f->len); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4440 |
8562
b31c02454539
QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents:
8561
diff
changeset
|
4441 ngx_memcpy(cid->sr_token, f->srt, NGX_QUIC_SR_TOKEN_LEN); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4442 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4443 ngx_queue_insert_tail(&qc->client_ids, &cid->queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4444 qc->nclient_ids++; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4445 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4446 /* always use latest available connection id */ |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
4447 if (f->seqnum > qc->client_seqnum) { |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4448 qc->scid.len = cid->len; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4449 qc->scid.data = cid->id; |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
4450 qc->client_seqnum = f->seqnum; |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4451 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4452 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4453 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4454 retire: |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4455 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4456 if (qc->max_retired_seqnum && f->retire <= qc->max_retired_seqnum) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4457 /* |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4458 * Once a sender indicates a Retire Prior To value, smaller values sent |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4459 * in subsequent NEW_CONNECTION_ID frames have no effect. A receiver |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4460 * MUST ignore any Retire Prior To fields that do not increase the |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4461 * largest received Retire Prior To value. |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4462 */ |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4463 goto done; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4464 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4465 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4466 qc->max_retired_seqnum = f->retire; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4467 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4468 q = ngx_queue_head(&qc->client_ids); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4469 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4470 while (q != ngx_queue_sentinel(&qc->client_ids)) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4471 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4472 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4473 q = ngx_queue_next(q); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4474 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4475 if (cid->seqnum >= f->retire) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4476 continue; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4477 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4478 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4479 /* this connection id must be retired */ |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4480 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4481 if (ngx_quic_retire_connection_id(c, pkt->level, cid->seqnum) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4482 != NGX_OK) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4483 { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4484 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4485 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4486 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4487 ngx_queue_remove(&cid->queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4488 ngx_queue_insert_head(&qc->free_client_ids, &cid->queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4489 qc->nclient_ids--; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4490 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4491 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4492 done: |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4493 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4494 if (qc->nclient_ids > qc->tp.active_connection_id_limit) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4495 /* |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4496 * After processing a NEW_CONNECTION_ID frame and |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4497 * adding and retiring active connection IDs, if the number of active |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4498 * connection IDs exceeds the value advertised in its |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4499 * active_connection_id_limit transport parameter, an endpoint MUST |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4500 * close the connection with an error of type CONNECTION_ID_LIMIT_ERROR. |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4501 */ |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4502 qc->error = NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4503 qc->error_reason = "too many connection ids received"; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4504 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4505 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4506 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4507 return NGX_OK; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4508 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4509 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4510 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4511 static ngx_int_t |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4512 ngx_quic_retire_connection_id(ngx_connection_t *c, |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4513 enum ssl_encryption_level_t level, uint64_t seqnum) |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4514 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4515 ngx_quic_frame_t *frame; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4516 ngx_quic_connection_t *qc; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4517 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4518 qc = ngx_quic_get_connection(c); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4519 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4520 frame = ngx_quic_alloc_frame(c); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4521 if (frame == NULL) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4522 return NGX_ERROR; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4523 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4524 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4525 frame->level = level; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4526 frame->type = NGX_QUIC_FT_RETIRE_CONNECTION_ID; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4527 frame->u.retire_cid.sequence_number = seqnum; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4528 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4529 ngx_quic_queue_frame(qc, frame); |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4530 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4531 return NGX_OK; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4532 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4533 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4534 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4535 static ngx_int_t |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4536 ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4537 ngx_quic_header_t *pkt, ngx_quic_retire_cid_frame_t *f) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4538 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4539 ngx_queue_t *q; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4540 ngx_quic_server_id_t *sid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4541 ngx_quic_connection_t *qc; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4542 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4543 qc = ngx_quic_get_connection(c); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4544 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4545 for (q = ngx_queue_head(&qc->server_ids); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4546 q != ngx_queue_sentinel(&qc->server_ids); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4547 q = ngx_queue_next(q)) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4548 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4549 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4550 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4551 if (sid->seqnum == f->sequence_number) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4552 ngx_queue_remove(q); |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4553 ngx_queue_insert_tail(&qc->free_server_ids, &sid->queue); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4554 ngx_rbtree_delete(&c->listening->rbtree, &sid->udp.node); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4555 qc->nserver_ids--; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4556 break; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4557 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4558 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4559 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4560 return ngx_quic_issue_server_ids(c); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4561 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4562 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4563 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4564 static ngx_int_t |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4565 ngx_quic_issue_server_ids(ngx_connection_t *c) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4566 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4567 ngx_str_t dcid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4568 ngx_uint_t n; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4569 ngx_quic_frame_t *frame; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4570 ngx_quic_server_id_t *sid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4571 ngx_quic_connection_t *qc; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4572 u_char id[NGX_QUIC_SERVER_CID_LEN]; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4573 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4574 qc = ngx_quic_get_connection(c); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4575 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4576 n = ngx_min(NGX_QUIC_MAX_SERVER_IDS, qc->ctp.active_connection_id_limit); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4577 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4578 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4579 "quic issue server ids has:%ui max:%ui", qc->nserver_ids, n); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4580 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4581 while (qc->nserver_ids < n) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4582 if (ngx_quic_create_server_id(c, id) != NGX_OK) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4583 return NGX_ERROR; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4584 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4585 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4586 dcid.len = NGX_QUIC_SERVER_CID_LEN; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4587 dcid.data = id; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4588 |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4589 sid = ngx_quic_insert_server_id(c, qc, &dcid); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4590 if (sid == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4591 return NGX_ERROR; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4592 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4593 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
4594 frame = ngx_quic_alloc_frame(c); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4595 if (frame == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4596 return NGX_ERROR; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4597 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4598 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4599 frame->level = ssl_encryption_application; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4600 frame->type = NGX_QUIC_FT_NEW_CONNECTION_ID; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4601 frame->u.ncid.seqnum = sid->seqnum; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4602 frame->u.ncid.retire = 0; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4603 frame->u.ncid.len = NGX_QUIC_SERVER_CID_LEN; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4604 ngx_memcpy(frame->u.ncid.cid, id, NGX_QUIC_SERVER_CID_LEN); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4605 |
8694
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8693
diff
changeset
|
4606 if (ngx_quic_new_sr_token(c, &dcid, qc->conf->sr_token_key, |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4607 frame->u.ncid.srt) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4608 != NGX_OK) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4609 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4610 return NGX_ERROR; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4611 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4612 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4613 ngx_quic_queue_frame(qc, frame); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4614 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4615 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4616 return NGX_OK; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4617 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4618 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4619 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4620 static void |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4621 ngx_quic_clear_temp_server_ids(ngx_connection_t *c) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4622 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4623 ngx_queue_t *q, *next; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4624 ngx_quic_server_id_t *sid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4625 ngx_quic_connection_t *qc; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4626 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4627 qc = ngx_quic_get_connection(c); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4628 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4629 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4630 "quic clear temp server ids"); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4631 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4632 for (q = ngx_queue_head(&qc->server_ids); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4633 q != ngx_queue_sentinel(&qc->server_ids); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4634 q = next) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4635 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4636 next = ngx_queue_next(q); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4637 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4638 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4639 if (sid->seqnum != NGX_QUIC_UNSET_PN) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4640 continue; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4641 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4642 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4643 ngx_queue_remove(q); |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4644 ngx_queue_insert_tail(&qc->free_server_ids, &sid->queue); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4645 ngx_rbtree_delete(&c->listening->rbtree, &sid->udp.node); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4646 qc->nserver_ids--; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4647 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4648 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4649 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4650 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4651 static ngx_quic_server_id_t * |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4652 ngx_quic_insert_server_id(ngx_connection_t *c, ngx_quic_connection_t *qc, |
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4653 ngx_str_t *id) |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4654 { |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4655 ngx_str_t dcid; |
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4656 ngx_quic_server_id_t *sid; |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4657 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4658 sid = ngx_quic_alloc_server_id(c, qc); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4659 if (sid == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4660 return NULL; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4661 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4662 |
8735
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4663 sid->quic = qc; |
9ce6d80df113
QUIC: simplified quic connection dispatching.
Vladimir Homutov <vl@nginx.com>
parents:
8734
diff
changeset
|
4664 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4665 sid->seqnum = qc->server_seqnum; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4666 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4667 if (qc->server_seqnum != NGX_QUIC_UNSET_PN) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4668 qc->server_seqnum++; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4669 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4670 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4671 sid->len = id->len; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4672 ngx_memcpy(sid->id, id->data, id->len); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4673 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4674 ngx_queue_insert_tail(&qc->server_ids, &sid->queue); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4675 qc->nserver_ids++; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4676 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4677 dcid.data = sid->id; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4678 dcid.len = sid->len; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4679 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4680 ngx_insert_udp_connection(c, &sid->udp, &dcid); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4681 |
8651
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
4682 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
4683 "quic insert server id seqnum:%uL id len:%uz %xV", |
dbad2d6d1898
QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents:
8642
diff
changeset
|
4684 sid->seqnum, id->len, id); |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4685 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4686 return sid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4687 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4688 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4689 |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4690 static ngx_quic_client_id_t * |
8627
405b6e8eb523
QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents:
8626
diff
changeset
|
4691 ngx_quic_alloc_client_id(ngx_connection_t *c, ngx_quic_connection_t *qc) |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4692 { |
8561
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
4693 ngx_queue_t *q; |
b4ef79ef1c23
QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents:
8560
diff
changeset
|
4694 ngx_quic_client_id_t *cid; |
8538
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4695 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4696 if (!ngx_queue_empty(&qc->free_client_ids)) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4697 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4698 q = ngx_queue_head(&qc->free_client_ids); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4699 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4700 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4701 ngx_queue_remove(&cid->queue); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4702 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4703 ngx_memzero(cid, sizeof(ngx_quic_client_id_t)); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4704 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4705 } else { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4706 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4707 cid = ngx_pcalloc(c->pool, sizeof(ngx_quic_client_id_t)); |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4708 if (cid == NULL) { |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4709 return NULL; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4710 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4711 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4712 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4713 return cid; |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4714 } |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4715 |
3afaaaa930ab
QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents:
8536
diff
changeset
|
4716 |
8628
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4717 static ngx_quic_server_id_t * |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4718 ngx_quic_alloc_server_id(ngx_connection_t *c, ngx_quic_connection_t *qc) |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4719 { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4720 ngx_queue_t *q; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4721 ngx_quic_server_id_t *sid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4722 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4723 if (!ngx_queue_empty(&qc->free_server_ids)) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4724 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4725 q = ngx_queue_head(&qc->free_server_ids); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4726 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4727 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4728 ngx_queue_remove(&sid->queue); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4729 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4730 ngx_memzero(sid, sizeof(ngx_quic_server_id_t)); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4731 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4732 } else { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4733 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4734 sid = ngx_pcalloc(c->pool, sizeof(ngx_quic_server_id_t)); |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4735 if (sid == NULL) { |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4736 return NULL; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4737 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4738 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4739 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4740 return sid; |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4741 } |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4742 |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8627
diff
changeset
|
4743 |
8736
714e9af983de
QUIC: separate header for ngx_quic_connection_t.
Vladimir Homutov <vl@nginx.com>
parents:
8735
diff
changeset
|
4744 void |
8225 | 4745 ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame) |
4746 { | |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
4747 ngx_quic_send_ctx_t *ctx; |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
4748 |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
4749 ctx = ngx_quic_get_send_ctx(qc, frame->level); |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
4750 |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
4751 ngx_queue_insert_tail(&ctx->frames, &frame->queue); |
8309 | 4752 |
8476
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4753 frame->len = ngx_quic_create_frame(NULL, frame); |
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4754 /* always succeeds */ |
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4755 |
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4756 if (qc->closing) { |
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4757 return; |
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4758 } |
f9fbeb4ee0de
QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents:
8475
diff
changeset
|
4759 |
8517
924882f42dea
QUIC: do not artificially delay sending queued frames.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8516
diff
changeset
|
4760 ngx_post_event(&qc->push, &ngx_posted_events); |
8225 | 4761 } |
4762 | |
4763 | |
4764 static ngx_int_t | |
4765 ngx_quic_output(ngx_connection_t *c) | |
4766 { | |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4767 off_t max; |
8708
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4768 size_t len, min, in_flight; |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4769 ssize_t n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4770 u_char *p; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4771 ngx_uint_t i, pad; |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
4772 ngx_quic_send_ctx_t *ctx; |
8708
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4773 ngx_quic_congestion_t *cg; |
8225 | 4774 ngx_quic_connection_t *qc; |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4775 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; |
8225 | 4776 |
8275 | 4777 c->log->action = "sending frames"; |
4778 | |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4779 qc = ngx_quic_get_connection(c); |
8708
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4780 cg = &qc->congestion; |
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4781 |
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4782 in_flight = cg->in_flight; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4783 |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4784 for ( ;; ) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4785 p = dst; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4786 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4787 len = ngx_min(qc->ctp.max_udp_payload_size, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4788 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4789 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4790 if (!qc->validated) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4791 max = qc->received * 3; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4792 max = (c->sent >= max) ? 0 : max - c->sent; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4793 len = ngx_min(len, (size_t) max); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4794 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4795 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4796 pad = ngx_quic_get_padding_level(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4797 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4798 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4799 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4800 ctx = &qc->send_ctx[i]; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4801 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4802 if (ngx_quic_generate_ack(c, ctx) != NGX_OK) { |
8596
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
4803 return NGX_ERROR; |
38c7dd720774
QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents:
8595
diff
changeset
|
4804 } |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4805 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4806 min = (i == pad && p - dst < NGX_QUIC_MIN_INITIAL_SIZE) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4807 ? NGX_QUIC_MIN_INITIAL_SIZE - (p - dst) : 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4808 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4809 n = ngx_quic_output_packet(c, ctx, p, len, min); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4810 if (n == NGX_ERROR) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4811 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4812 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4813 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4814 p += n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4815 len -= n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4816 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4817 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4818 len = p - dst; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4819 if (len == 0) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4820 break; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4821 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4822 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4823 n = ngx_quic_send(c, dst, len); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4824 if (n == NGX_ERROR) { |
8225 | 4825 return NGX_ERROR; |
4826 } | |
8708
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4827 } |
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4828 |
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4829 if (in_flight != cg->in_flight && !qc->send_timer_set && !qc->closing) { |
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4830 qc->send_timer_set = 1; |
98bacfc65c61
QUIC: set idle timer when sending an ack-eliciting packet.
Roman Arutyunyan <arut@nginx.com>
parents:
8703
diff
changeset
|
4831 ngx_add_timer(c->read, qc->tp.max_idle_timeout); |
8271
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
4832 } |
8e54a17dabee
Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents:
8270
diff
changeset
|
4833 |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
4834 ngx_quic_set_lost_timer(c); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
4835 |
8225 | 4836 return NGX_OK; |
4837 } | |
4838 | |
4839 | |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4840 static ngx_uint_t |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4841 ngx_quic_get_padding_level(ngx_connection_t *c) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4842 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4843 ngx_queue_t *q; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4844 ngx_quic_frame_t *f; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4845 ngx_quic_send_ctx_t *ctx; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4846 ngx_quic_connection_t *qc; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4847 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4848 /* |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4849 * 14.1. Initial Datagram Size |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4850 * |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4851 * Similarly, a server MUST expand the payload of all UDP datagrams |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4852 * carrying ack-eliciting Initial packets to at least the smallest |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4853 * allowed maximum datagram size of 1200 bytes |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4854 */ |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4855 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4856 qc = ngx_quic_get_connection(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4857 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4858 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4859 for (q = ngx_queue_head(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4860 q != ngx_queue_sentinel(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4861 q = ngx_queue_next(q)) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4862 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4863 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4864 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4865 if (f->need_ack) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4866 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_handshake); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4867 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4868 if (ngx_queue_empty(&ctx->frames)) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4869 return 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4870 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4871 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4872 return 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4873 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4874 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4875 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4876 return NGX_QUIC_SEND_CTX_LAST; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4877 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4878 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4879 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4880 static ngx_int_t |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4881 ngx_quic_generate_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4882 { |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4883 ngx_msec_t delay; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4884 ngx_quic_connection_t *qc; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4885 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4886 if (!ctx->send_ack) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4887 return NGX_OK; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4888 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4889 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4890 if (ctx->level == ssl_encryption_application) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4891 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4892 delay = ngx_current_msec - ctx->ack_delay_start; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4893 qc = ngx_quic_get_connection(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4894 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4895 if (ctx->send_ack < NGX_QUIC_MAX_ACK_GAP |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4896 && delay < qc->tp.max_ack_delay) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4897 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4898 if (!qc->push.timer_set && !qc->closing) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4899 ngx_add_timer(&qc->push, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4900 qc->tp.max_ack_delay - delay); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4901 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4902 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4903 return NGX_OK; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4904 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4905 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4906 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4907 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4908 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4909 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4910 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4911 ctx->send_ack = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4912 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4913 return NGX_OK; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4914 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4915 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4916 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4917 static ssize_t |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4918 ngx_quic_output_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4919 u_char *data, size_t max, size_t min) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4920 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4921 size_t len, hlen, pad_len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4922 u_char *p; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4923 ssize_t flen; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4924 ngx_str_t out, res; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4925 ngx_int_t rc; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4926 ngx_uint_t nframes; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4927 ngx_msec_t now; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4928 ngx_queue_t *q; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4929 ngx_quic_frame_t *f; |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4930 ngx_quic_header_t pkt; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
4931 ngx_quic_congestion_t *cg; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4932 ngx_quic_connection_t *qc; |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4933 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4934 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4935 if (ngx_queue_empty(&ctx->frames)) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4936 return 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4937 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4938 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4939 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4940 "quic output %s packet max:%uz min:%uz", |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4941 ngx_quic_level_name(ctx->level), max, min); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4942 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
4943 qc = ngx_quic_get_connection(c); |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
4944 cg = &qc->congestion; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4945 |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4946 hlen = (ctx->level == ssl_encryption_application) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4947 ? NGX_QUIC_MAX_SHORT_HEADER |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4948 : NGX_QUIC_MAX_LONG_HEADER; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4949 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4950 hlen += EVP_GCM_TLS_TAG_LEN; |
8590
44991d728899
QUIC: account packet header length in amplification limit.
Vladimir Homutov <vl@nginx.com>
parents:
8589
diff
changeset
|
4951 hlen -= NGX_QUIC_MAX_CID_LEN - qc->scid.len; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4952 |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4953 ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4954 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4955 now = ngx_current_msec; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4956 nframes = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4957 p = src; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4958 len = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4959 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4960 for (q = ngx_queue_head(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4961 q != ngx_queue_sentinel(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4962 q = ngx_queue_next(q)) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4963 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4964 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4965 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4966 if (!pkt.need_ack && f->need_ack && max > cg->window) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4967 max = cg->window; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4968 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4969 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4970 if (hlen + len >= max) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4971 break; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4972 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4973 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4974 if (hlen + len + f->len > max) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4975 rc = ngx_quic_split_frame(c, f, max - hlen - len); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4976 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4977 if (rc == NGX_ERROR) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4978 return NGX_ERROR; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4979 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
4980 |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4981 if (rc == NGX_DECLINED) { |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
4982 break; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
4983 } |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4984 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4985 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4986 if (f->need_ack) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4987 pkt.need_ack = 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4988 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4989 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4990 ngx_quic_log_frame(c->log, f, 1); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4991 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4992 flen = ngx_quic_create_frame(p, f); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4993 if (flen == -1) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4994 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4995 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4996 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4997 len += flen; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4998 p += flen; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
4999 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5000 f->pnum = ctx->pnum; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5001 f->first = now; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5002 f->last = now; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5003 f->plen = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5004 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5005 nframes++; |
8698
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5006 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5007 if (f->flush) { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5008 break; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5009 } |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5010 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5011 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5012 if (nframes == 0) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5013 return 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5014 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5015 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5016 out.data = src; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5017 out.len = len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5018 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5019 pkt.keys = qc->keys; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5020 pkt.flags = NGX_QUIC_PKT_FIXED_BIT; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5021 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5022 if (ctx->level == ssl_encryption_initial) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5023 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5024 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5025 } else if (ctx->level == ssl_encryption_handshake) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5026 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5027 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5028 } else { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5029 if (qc->key_phase) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5030 pkt.flags |= NGX_QUIC_PKT_KPHASE; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5031 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5032 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5033 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5034 ngx_quic_set_packet_number(&pkt, ctx); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5035 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5036 pkt.version = qc->version; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5037 pkt.log = c->log; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5038 pkt.level = ctx->level; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5039 pkt.dcid = qc->scid; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5040 pkt.scid = qc->dcid; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5041 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5042 pad_len = 4; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5043 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5044 if (min) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5045 hlen = EVP_GCM_TLS_TAG_LEN |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5046 + ngx_quic_create_header(&pkt, NULL, out.len, NULL); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5047 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5048 if (min > hlen + pad_len) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5049 pad_len = min - hlen; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5050 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5051 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5052 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5053 if (out.len < pad_len) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5054 ngx_memset(p, NGX_QUIC_FT_PADDING, pad_len - out.len); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5055 out.len = pad_len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5056 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5057 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5058 pkt.payload = out; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5059 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5060 res.data = data; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5061 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5062 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5063 "quic packet tx %s bytes:%ui" |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5064 " need_ack:%d number:%L encoded nl:%d trunc:0x%xD", |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5065 ngx_quic_level_name(ctx->level), out.len, pkt.need_ack, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5066 pkt.number, pkt.num_len, pkt.trunc); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5067 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5068 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5069 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5070 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5071 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5072 ctx->pnum++; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5073 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5074 if (pkt.need_ack) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5075 /* move frames into the sent queue to wait for ack */ |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5076 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5077 if (!qc->closing) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5078 q = ngx_queue_head(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5079 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5080 f->plen = res.len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5081 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5082 do { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5083 q = ngx_queue_head(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5084 ngx_queue_remove(q); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5085 ngx_queue_insert_tail(&ctx->sent, q); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5086 } while (--nframes); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5087 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5088 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5089 cg->in_flight += res.len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5090 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5091 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5092 "quic congestion send if:%uz", cg->in_flight); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5093 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5094 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5095 while (nframes--) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5096 q = ngx_queue_head(&ctx->frames); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5097 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5098 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5099 ngx_queue_remove(q); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5100 ngx_quic_free_frame(c, f); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5101 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5102 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5103 return res.len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5104 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5105 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5106 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5107 static ngx_int_t |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5108 ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5109 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5110 size_t shrink; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5111 ngx_quic_frame_t *nf; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5112 ngx_quic_ordered_frame_t *of, *onf; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5113 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5114 switch (f->type) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5115 case NGX_QUIC_FT_CRYPTO: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5116 case NGX_QUIC_FT_STREAM0: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5117 case NGX_QUIC_FT_STREAM1: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5118 case NGX_QUIC_FT_STREAM2: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5119 case NGX_QUIC_FT_STREAM3: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5120 case NGX_QUIC_FT_STREAM4: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5121 case NGX_QUIC_FT_STREAM5: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5122 case NGX_QUIC_FT_STREAM6: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5123 case NGX_QUIC_FT_STREAM7: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5124 break; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5125 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5126 default: |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5127 return NGX_DECLINED; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5128 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5129 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5130 if ((size_t) f->len <= len) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5131 return NGX_OK; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5132 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5133 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5134 shrink = f->len - len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5135 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5136 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5137 "quic split frame now:%uz need:%uz shrink:%uz", |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5138 f->len, len, shrink); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5139 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5140 of = &f->u.ord; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5141 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5142 if (of->length <= shrink) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5143 return NGX_DECLINED; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5144 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5145 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5146 of->length -= shrink; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5147 f->len = ngx_quic_create_frame(NULL, f); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5148 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5149 if ((size_t) f->len > len) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5150 ngx_log_error(NGX_LOG_ERR, c->log, 0, "could not split QUIC frame"); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5151 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5152 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5153 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5154 nf = ngx_quic_alloc_frame(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5155 if (nf == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5156 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5157 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5158 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5159 *nf = *f; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5160 onf = &nf->u.ord; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5161 onf->offset += of->length; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5162 onf->length = shrink; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5163 nf->len = ngx_quic_create_frame(NULL, nf); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5164 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5165 nf->data = ngx_quic_split_bufs(c, f->data, of->length); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5166 if (nf->data == NGX_CHAIN_ERROR) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5167 return NGX_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5168 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5169 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
5170 ngx_queue_insert_after(&f->queue, &nf->queue); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5171 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5172 return NGX_OK; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5173 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5174 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5175 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5176 static void |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5177 ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames) |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5178 { |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5179 ngx_queue_t *q; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5180 ngx_quic_frame_t *f; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5181 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5182 do { |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5183 q = ngx_queue_head(frames); |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5184 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5185 if (q == ngx_queue_sentinel(frames)) { |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5186 break; |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5187 } |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5188 |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5189 ngx_queue_remove(q); |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5190 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5191 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5192 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5193 ngx_quic_free_frame(c, f); |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5194 } while (1); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5195 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5196 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5197 |
8656
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5198 static ssize_t |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5199 ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len) |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5200 { |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5201 ngx_buf_t b; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5202 ngx_chain_t cl, *res; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5203 |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5204 ngx_memzero(&b, sizeof(ngx_buf_t)); |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5205 |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5206 b.pos = b.start = buf; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5207 b.last = b.end = buf + len; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5208 b.last_buf = 1; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5209 b.temporary = 1; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5210 |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5211 cl.buf = &b; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5212 cl.next= NULL; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5213 |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5214 res = c->send_chain(c, &cl, 0); |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5215 if (res == NGX_CHAIN_ERROR) { |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5216 return NGX_ERROR; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5217 } |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5218 |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5219 return len; |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5220 } |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5221 |
43f3574b3e6f
QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents:
8655
diff
changeset
|
5222 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5223 static void |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5224 ngx_quic_set_packet_number(ngx_quic_header_t *pkt, ngx_quic_send_ctx_t *ctx) |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5225 { |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5226 uint64_t delta; |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5227 |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5228 delta = ctx->pnum - ctx->largest_ack; |
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5229 pkt->number = ctx->pnum; |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5230 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5231 if (delta <= 0x7F) { |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5232 pkt->num_len = 1; |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5233 pkt->trunc = ctx->pnum & 0xff; |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5234 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5235 } else if (delta <= 0x7FFF) { |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5236 pkt->num_len = 2; |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5237 pkt->flags |= 0x1; |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5238 pkt->trunc = ctx->pnum & 0xffff; |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5239 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5240 } else if (delta <= 0x7FFFFF) { |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5241 pkt->num_len = 3; |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5242 pkt->flags |= 0x2; |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5243 pkt->trunc = ctx->pnum & 0xffffff; |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5244 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5245 } else { |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5246 pkt->num_len = 4; |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5247 pkt->flags |= 0x3; |
8331
bda817d16cc2
Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents:
8328
diff
changeset
|
5248 pkt->trunc = ctx->pnum & 0xffffffff; |
8315
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5249 } |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5250 } |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5251 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5252 |
fdda518d10ba
Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents:
8314
diff
changeset
|
5253 static void |
8472 | 5254 ngx_quic_pto_handler(ngx_event_t *ev) |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5255 { |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5256 ngx_uint_t i; |
8698
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5257 ngx_msec_t now; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5258 ngx_queue_t *q, *next; |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5259 ngx_connection_t *c; |
8698
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5260 ngx_quic_frame_t *f; |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5261 ngx_quic_send_ctx_t *ctx; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5262 ngx_quic_connection_t *qc; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5263 |
8472 | 5264 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic pto timer"); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5265 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5266 c = ev->data; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5267 qc = ngx_quic_get_connection(c); |
8698
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5268 now = ngx_current_msec; |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5269 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5270 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5271 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5272 ctx = &qc->send_ctx[i]; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5273 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5274 if (ngx_queue_empty(&ctx->sent)) { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5275 continue; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5276 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5277 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5278 q = ngx_queue_head(&ctx->sent); |
8698
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5279 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5280 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5281 if (f->pnum <= ctx->largest_ack |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
5282 && ctx->largest_ack != NGX_QUIC_UNSET_PN) |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5283 { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5284 continue; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5285 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5286 |
8698
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5287 if ((ngx_msec_int_t) (f->last + ngx_quic_pto(c, ctx) - now) > 0) { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5288 continue; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5289 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5290 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5291 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5292 "quic pto %s pto_count:%ui", |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5293 ngx_quic_level_name(ctx->level), qc->pto_count); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5294 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5295 for (q = ngx_queue_head(&ctx->frames); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5296 q != ngx_queue_sentinel(&ctx->frames); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5297 /* void */) |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5298 { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5299 next = ngx_queue_next(q); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5300 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5301 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5302 if (f->type == NGX_QUIC_FT_PING) { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5303 ngx_queue_remove(q); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5304 ngx_quic_free_frame(c, f); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5305 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5306 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5307 q = next; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5308 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5309 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5310 for (q = ngx_queue_head(&ctx->sent); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5311 q != ngx_queue_sentinel(&ctx->sent); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5312 /* void */) |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5313 { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5314 next = ngx_queue_next(q); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5315 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5316 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5317 if (f->type == NGX_QUIC_FT_PING) { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5318 ngx_quic_congestion_lost(c, f); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5319 ngx_queue_remove(q); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5320 ngx_quic_free_frame(c, f); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5321 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5322 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5323 q = next; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5324 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5325 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5326 /* enforce 2 udp datagrams */ |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5327 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5328 f = ngx_quic_alloc_frame(c); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5329 if (f == NULL) { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5330 break; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5331 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5332 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5333 f->level = ctx->level; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5334 f->type = NGX_QUIC_FT_PING; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5335 f->flush = 1; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5336 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5337 ngx_quic_queue_frame(qc, f); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5338 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5339 f = ngx_quic_alloc_frame(c); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5340 if (f == NULL) { |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5341 break; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5342 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5343 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5344 f->level = ctx->level; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5345 f->type = NGX_QUIC_FT_PING; |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5346 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5347 ngx_quic_queue_frame(qc, f); |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5348 } |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5349 |
9ed95726b99b
QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents:
8697
diff
changeset
|
5350 qc->pto_count++; |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
5351 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
5352 ngx_quic_connstate_dbg(c); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5353 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5354 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5355 |
8309 | 5356 static void |
5357 ngx_quic_push_handler(ngx_event_t *ev) | |
5358 { | |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5359 ngx_connection_t *c; |
8309 | 5360 |
8359 | 5361 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic push timer"); |
8309 | 5362 |
5363 c = ev->data; | |
5364 | |
5365 if (ngx_quic_output(c) != NGX_OK) { | |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
5366 ngx_quic_close_connection(c, NGX_ERROR); |
8309 | 5367 return; |
5368 } | |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
5369 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
5370 ngx_quic_connstate_dbg(c); |
8309 | 5371 } |
5372 | |
5373 | |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5374 static |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5375 void ngx_quic_lost_handler(ngx_event_t *ev) |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5376 { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5377 ngx_connection_t *c; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5378 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5379 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic lost timer"); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5380 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5381 c = ev->data; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5382 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5383 if (ngx_quic_detect_lost(c) != NGX_OK) { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5384 ngx_quic_close_connection(c, NGX_ERROR); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5385 } |
8607
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
5386 |
21b7dac9de3b
QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents:
8606
diff
changeset
|
5387 ngx_quic_connstate_dbg(c); |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5388 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5389 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5390 |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5391 static ngx_int_t |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5392 ngx_quic_detect_lost(ngx_connection_t *c) |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5393 { |
8474
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5394 ngx_uint_t i; |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5395 ngx_msec_t now, wait, thr; |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5396 ngx_queue_t *q; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5397 ngx_quic_frame_t *start; |
8474
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5398 ngx_quic_send_ctx_t *ctx; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5399 ngx_quic_connection_t *qc; |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5400 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5401 qc = ngx_quic_get_connection(c); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5402 now = ngx_current_msec; |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5403 thr = ngx_quic_lost_threshold(qc); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5404 |
8474
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5405 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5406 |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5407 ctx = &qc->send_ctx[i]; |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5408 |
8598
85a550047eb5
QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents:
8597
diff
changeset
|
5409 if (ctx->largest_ack == NGX_QUIC_UNSET_PN) { |
8515
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5410 continue; |
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5411 } |
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5412 |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5413 while (!ngx_queue_empty(&ctx->sent)) { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5414 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5415 q = ngx_queue_head(&ctx->sent); |
8474
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5416 start = ngx_queue_data(q, ngx_quic_frame_t, queue); |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5417 |
8515
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5418 if (start->pnum > ctx->largest_ack) { |
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5419 break; |
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5420 } |
4e3a71621c9a
QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8514
diff
changeset
|
5421 |
8474
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5422 wait = start->last + thr - now; |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5423 |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5424 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8519
de7d6d943f68
QUIC: fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8518
diff
changeset
|
5425 "quic detect_lost pnum:%uL thr:%M wait:%i level:%d", |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5426 start->pnum, thr, (ngx_int_t) wait, start->level); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5427 |
8516
355e079c5eee
QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8515
diff
changeset
|
5428 if ((ngx_msec_int_t) wait > 0 |
355e079c5eee
QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8515
diff
changeset
|
5429 && ctx->largest_ack - start->pnum < NGX_QUIC_PKT_THR) |
355e079c5eee
QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8515
diff
changeset
|
5430 { |
355e079c5eee
QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8515
diff
changeset
|
5431 break; |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5432 } |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
5433 |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5434 ngx_quic_resend_frames(c, ctx); |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5435 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5436 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5437 |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5438 ngx_quic_set_lost_timer(c); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5439 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5440 return NGX_OK; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5441 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5442 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5443 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5444 static void |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5445 ngx_quic_set_lost_timer(ngx_connection_t *c) |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5446 { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5447 ngx_uint_t i; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5448 ngx_msec_t now; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5449 ngx_queue_t *q; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5450 ngx_msec_int_t lost, pto, w; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5451 ngx_quic_frame_t *f; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5452 ngx_quic_send_ctx_t *ctx; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5453 ngx_quic_connection_t *qc; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5454 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5455 qc = ngx_quic_get_connection(c); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5456 now = ngx_current_msec; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5457 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5458 lost = -1; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5459 pto = -1; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5460 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5461 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5462 ctx = &qc->send_ctx[i]; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5463 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5464 if (ngx_queue_empty(&ctx->sent)) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5465 continue; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5466 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5467 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5468 if (ctx->largest_ack != NGX_QUIC_UNSET_PN) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5469 q = ngx_queue_head(&ctx->sent); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5470 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5471 w = (ngx_msec_int_t) (f->last + ngx_quic_lost_threshold(qc) - now); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5472 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5473 if (f->pnum <= ctx->largest_ack) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5474 if (w < 0 || ctx->largest_ack - f->pnum >= NGX_QUIC_PKT_THR) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5475 w = 0; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5476 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5477 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5478 if (lost == -1 || w < lost) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5479 lost = w; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5480 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5481 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5482 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5483 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5484 q = ngx_queue_last(&ctx->sent); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5485 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5486 w = (ngx_msec_int_t) (f->last + ngx_quic_pto(c, ctx) - now); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5487 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5488 if (w < 0) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5489 w = 0; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5490 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5491 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5492 if (pto == -1 || w < pto) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5493 pto = w; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5494 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5495 } |
8474
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5496 |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5497 if (qc->pto.timer_set) { |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5498 ngx_del_timer(&qc->pto); |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5499 } |
909b989ec088
QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents:
8473
diff
changeset
|
5500 |
8697
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5501 if (lost != -1) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5502 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5503 "quic lost timer lost:%M", lost); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5504 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5505 qc->pto.handler = ngx_quic_lost_handler; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5506 ngx_add_timer(&qc->pto, lost); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5507 return; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5508 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5509 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5510 if (pto != -1) { |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5511 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5512 "quic lost timer pto:%M", pto); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5513 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5514 qc->pto.handler = ngx_quic_pto_handler; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5515 ngx_add_timer(&qc->pto, pto); |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5516 return; |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5517 } |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5518 |
faa3201ff351
QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents:
8696
diff
changeset
|
5519 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic lost timer unset"); |
8225 | 5520 } |
5521 | |
5522 | |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5523 static void |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5524 ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5525 { |
8617
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5526 size_t n; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5527 ngx_buf_t *b; |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5528 ngx_queue_t *q; |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5529 ngx_quic_frame_t *f, *start; |
8617
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5530 ngx_quic_stream_t *sn; |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5531 ngx_quic_connection_t *qc; |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5532 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5533 qc = ngx_quic_get_connection(c); |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5534 q = ngx_queue_head(&ctx->sent); |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5535 start = ngx_queue_data(q, ngx_quic_frame_t, queue); |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5536 |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5537 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5538 "quic resend packet pnum:%uL", start->pnum); |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5539 |
8616
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5540 ngx_quic_congestion_lost(c, start); |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5541 |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5542 do { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5543 f = ngx_queue_data(q, ngx_quic_frame_t, queue); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5544 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5545 if (f->pnum != start->pnum) { |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5546 break; |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5547 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5548 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5549 q = ngx_queue_next(q); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5550 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5551 ngx_queue_remove(&f->queue); |
8616
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5552 |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5553 switch (f->type) { |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5554 case NGX_QUIC_FT_ACK: |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5555 case NGX_QUIC_FT_ACK_ECN: |
8696
88c9c868a7c9
QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents:
8695
diff
changeset
|
5556 if (ctx->level == ssl_encryption_application) { |
88c9c868a7c9
QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents:
8695
diff
changeset
|
5557 /* force generation of most recent acknowledgment */ |
88c9c868a7c9
QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents:
8695
diff
changeset
|
5558 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; |
88c9c868a7c9
QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents:
8695
diff
changeset
|
5559 } |
88c9c868a7c9
QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents:
8695
diff
changeset
|
5560 |
8616
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5561 ngx_quic_free_frame(c, f); |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5562 break; |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5563 |
8617
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5564 case NGX_QUIC_FT_PING: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5565 case NGX_QUIC_FT_PATH_RESPONSE: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5566 case NGX_QUIC_FT_CONNECTION_CLOSE: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5567 ngx_quic_free_frame(c, f); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5568 break; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5569 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5570 case NGX_QUIC_FT_MAX_DATA: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5571 f->u.max_data.max_data = qc->streams.recv_max_data; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5572 ngx_quic_queue_frame(qc, f); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5573 break; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5574 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5575 case NGX_QUIC_FT_MAX_STREAMS: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5576 case NGX_QUIC_FT_MAX_STREAMS2: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5577 f->u.max_streams.limit = f->u.max_streams.bidi |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5578 ? qc->streams.client_max_streams_bidi |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5579 : qc->streams.client_max_streams_uni; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5580 ngx_quic_queue_frame(qc, f); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5581 break; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5582 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5583 case NGX_QUIC_FT_MAX_STREAM_DATA: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5584 sn = ngx_quic_find_stream(&qc->streams.tree, |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5585 f->u.max_stream_data.id); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5586 if (sn == NULL) { |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5587 ngx_quic_free_frame(c, f); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5588 break; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5589 } |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5590 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5591 b = sn->b; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5592 n = sn->fs.received + (b->pos - b->start) + (b->end - b->last); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5593 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5594 if (f->u.max_stream_data.limit < n) { |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5595 f->u.max_stream_data.limit = n; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5596 } |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5597 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5598 ngx_quic_queue_frame(qc, f); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5599 break; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5600 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5601 case NGX_QUIC_FT_STREAM0: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5602 case NGX_QUIC_FT_STREAM1: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5603 case NGX_QUIC_FT_STREAM2: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5604 case NGX_QUIC_FT_STREAM3: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5605 case NGX_QUIC_FT_STREAM4: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5606 case NGX_QUIC_FT_STREAM5: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5607 case NGX_QUIC_FT_STREAM6: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5608 case NGX_QUIC_FT_STREAM7: |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5609 sn = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5610 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5611 if (sn && sn->c->write->error) { |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5612 /* RESET_STREAM was sent */ |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5613 ngx_quic_free_frame(c, f); |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5614 break; |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5615 } |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5616 |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5617 /* fall through */ |
69dc750cf66f
QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents:
8616
diff
changeset
|
5618 |
8616
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5619 default: |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5620 ngx_queue_insert_tail(&ctx->frames, &f->queue); |
64405f970f6f
QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents:
8615
diff
changeset
|
5621 } |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5622 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5623 } while (q != ngx_queue_sentinel(&ctx->sent)); |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5624 |
8556
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5625 if (qc->closing) { |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5626 return; |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5627 } |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5628 |
b383120afca3
QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents:
8553
diff
changeset
|
5629 ngx_post_event(&qc->push, &ngx_posted_events); |
8513
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5630 } |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5631 |
38f1be6c603f
QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8512
diff
changeset
|
5632 |
8225 | 5633 ngx_connection_t * |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5634 ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi) |
8225 | 5635 { |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5636 size_t rcvbuf_size; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5637 uint64_t id; |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5638 ngx_quic_stream_t *qs, *sn; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5639 ngx_quic_connection_t *qc; |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5640 |
8630
279ad36f2f4b
QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents:
8629
diff
changeset
|
5641 qs = c->quic; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5642 qc = ngx_quic_get_connection(qs->parent); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5643 |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5644 if (bidi) { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5645 if (qc->streams.server_streams_bidi |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5646 >= qc->streams.server_max_streams_bidi) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5647 { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5648 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5649 "quic too many server bidi streams:%uL", |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5650 qc->streams.server_streams_bidi); |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5651 return NULL; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5652 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5653 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5654 id = (qc->streams.server_streams_bidi << 2) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5655 | NGX_QUIC_STREAM_SERVER_INITIATED; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5656 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5657 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5658 "quic creating server bidi stream" |
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5659 " streams:%uL max:%uL id:0x%xL", |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5660 qc->streams.server_streams_bidi, |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5661 qc->streams.server_max_streams_bidi, id); |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5662 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5663 qc->streams.server_streams_bidi++; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5664 rcvbuf_size = qc->tp.initial_max_stream_data_bidi_local; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5665 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5666 } else { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5667 if (qc->streams.server_streams_uni |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5668 >= qc->streams.server_max_streams_uni) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5669 { |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5670 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5671 "quic too many server uni streams:%uL", |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5672 qc->streams.server_streams_uni); |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5673 return NULL; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5674 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5675 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5676 id = (qc->streams.server_streams_uni << 2) |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5677 | NGX_QUIC_STREAM_SERVER_INITIATED |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5678 | NGX_QUIC_STREAM_UNIDIRECTIONAL; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5679 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5680 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5681 "quic creating server uni stream" |
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5682 " streams:%uL max:%uL id:0x%xL", |
8495
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5683 qc->streams.server_streams_uni, |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5684 qc->streams.server_max_streams_uni, id); |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5685 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5686 qc->streams.server_streams_uni++; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5687 rcvbuf_size = 0; |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5688 } |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5689 |
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8486
diff
changeset
|
5690 sn = ngx_quic_create_stream(qs->parent, id, rcvbuf_size); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5691 if (sn == NULL) { |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5692 return NULL; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5693 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5694 |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5695 return sn->c; |
8225 | 5696 } |
5697 | |
5698 | |
5699 static void | |
5700 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp, | |
5701 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) | |
5702 { | |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5703 ngx_rbtree_node_t **p; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5704 ngx_quic_stream_t *qn, *qnt; |
8225 | 5705 |
5706 for ( ;; ) { | |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5707 qn = (ngx_quic_stream_t *) node; |
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5708 qnt = (ngx_quic_stream_t *) temp; |
8225 | 5709 |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5710 p = (qn->id < qnt->id) ? &temp->left : &temp->right; |
8225 | 5711 |
5712 if (*p == sentinel) { | |
5713 break; | |
5714 } | |
5715 | |
5716 temp = *p; | |
5717 } | |
5718 | |
5719 *p = node; | |
5720 node->parent = temp; | |
5721 node->left = sentinel; | |
5722 node->right = sentinel; | |
5723 ngx_rbt_red(node); | |
5724 } | |
5725 | |
5726 | |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5727 static ngx_quic_stream_t * |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5728 ngx_quic_find_stream(ngx_rbtree_t *rbtree, uint64_t id) |
8225 | 5729 { |
5730 ngx_rbtree_node_t *node, *sentinel; | |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5731 ngx_quic_stream_t *qn; |
8225 | 5732 |
5733 node = rbtree->root; | |
5734 sentinel = rbtree->sentinel; | |
5735 | |
5736 while (node != sentinel) { | |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5737 qn = (ngx_quic_stream_t *) node; |
8225 | 5738 |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5739 if (id == qn->id) { |
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5740 return qn; |
8225 | 5741 } |
5742 | |
8284
2935a11c55b6
Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents:
8282
diff
changeset
|
5743 node = (id < qn->id) ? node->left : node->right; |
8225 | 5744 } |
5745 | |
5746 return NULL; | |
5747 } | |
5748 | |
5749 | |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5750 static ngx_quic_stream_t * |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5751 ngx_quic_create_client_stream(ngx_connection_t *c, uint64_t id) |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5752 { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5753 size_t n; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5754 uint64_t min_id; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5755 ngx_quic_stream_t *sn; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5756 ngx_quic_connection_t *qc; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5757 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5758 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5759 "quic stream id:0x%xL is new", id); |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5760 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5761 qc = ngx_quic_get_connection(c); |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5762 |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5763 if (qc->shutdown) { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5764 return NGX_QUIC_STREAM_GONE; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5765 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5766 |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5767 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5768 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5769 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5770 if ((id >> 2) < qc->streams.server_streams_uni) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5771 return NGX_QUIC_STREAM_GONE; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5772 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5773 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5774 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5775 return NULL; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5776 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5777 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5778 if ((id >> 2) < qc->streams.client_streams_uni) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5779 return NGX_QUIC_STREAM_GONE; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5780 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5781 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5782 if ((id >> 2) >= qc->streams.client_max_streams_uni) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5783 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5784 return NULL; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5785 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5786 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5787 min_id = (qc->streams.client_streams_uni << 2) |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5788 | NGX_QUIC_STREAM_UNIDIRECTIONAL; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5789 qc->streams.client_streams_uni = (id >> 2) + 1; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5790 n = qc->tp.initial_max_stream_data_uni; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5791 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5792 } else { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5793 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5794 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5795 if ((id >> 2) < qc->streams.server_streams_bidi) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5796 return NGX_QUIC_STREAM_GONE; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5797 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5798 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5799 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5800 return NULL; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5801 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5802 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5803 if ((id >> 2) < qc->streams.client_streams_bidi) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5804 return NGX_QUIC_STREAM_GONE; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5805 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5806 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5807 if ((id >> 2) >= qc->streams.client_max_streams_bidi) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5808 qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5809 return NULL; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5810 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5811 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5812 min_id = (qc->streams.client_streams_bidi << 2); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5813 qc->streams.client_streams_bidi = (id >> 2) + 1; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5814 n = qc->tp.initial_max_stream_data_bidi_remote; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5815 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5816 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5817 if (n < NGX_QUIC_STREAM_BUFSIZE) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5818 n = NGX_QUIC_STREAM_BUFSIZE; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5819 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5820 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5821 /* |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5822 * 2.1. Stream Types and Identifiers |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5823 * |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5824 * Within each type, streams are created with numerically increasing |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5825 * stream IDs. A stream ID that is used out of order results in all |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5826 * streams of that type with lower-numbered stream IDs also being |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5827 * opened. |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5828 */ |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5829 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5830 for ( /* void */ ; min_id < id; min_id += 0x04) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5831 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5832 sn = ngx_quic_create_stream(c, min_id, n); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5833 if (sn == NULL) { |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5834 return NULL; |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5835 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5836 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5837 sn->c->listening->handler(sn->c); |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5838 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5839 if (qc->shutdown) { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5840 return NGX_QUIC_STREAM_GONE; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
5841 } |
8504
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5842 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5843 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5844 return ngx_quic_create_stream(c, id, n); |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5845 } |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5846 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5847 |
d277e25e37fc
QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents:
8503
diff
changeset
|
5848 static ngx_quic_stream_t * |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5849 ngx_quic_create_stream(ngx_connection_t *c, uint64_t id, size_t rcvbuf_size) |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5850 { |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5851 ngx_log_t *log; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5852 ngx_pool_t *pool; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5853 ngx_quic_stream_t *sn; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5854 ngx_pool_cleanup_t *cln; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5855 ngx_quic_connection_t *qc; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5856 |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
5857 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5858 "quic stream id:0x%xL create", id); |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
5859 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5860 qc = ngx_quic_get_connection(c); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5861 |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5862 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log); |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5863 if (pool == NULL) { |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5864 return NULL; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5865 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5866 |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5867 sn = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t)); |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5868 if (sn == NULL) { |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5869 ngx_destroy_pool(pool); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5870 return NULL; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5871 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5872 |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5873 sn->node.key = id; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5874 sn->parent = c; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5875 sn->id = id; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5876 |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5877 sn->b = ngx_create_temp_buf(pool, rcvbuf_size); |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5878 if (sn->b == NULL) { |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5879 ngx_destroy_pool(pool); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5880 return NULL; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5881 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5882 |
8334
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5883 ngx_queue_init(&sn->fs.frames); |
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
8333
diff
changeset
|
5884 |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5885 log = ngx_palloc(pool, sizeof(ngx_log_t)); |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5886 if (log == NULL) { |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5887 ngx_destroy_pool(pool); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5888 return NULL; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5889 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5890 |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5891 *log = *c->log; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5892 pool->log = log; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5893 |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5894 sn->c = ngx_get_connection(-1, log); |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5895 if (sn->c == NULL) { |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5896 ngx_destroy_pool(pool); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5897 return NULL; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5898 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5899 |
8630
279ad36f2f4b
QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents:
8629
diff
changeset
|
5900 sn->c->quic = sn; |
8482
893b3313f53c
QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents:
8481
diff
changeset
|
5901 sn->c->type = SOCK_STREAM; |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5902 sn->c->pool = pool; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5903 sn->c->ssl = c->ssl; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5904 sn->c->sockaddr = c->sockaddr; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5905 sn->c->listening = c->listening; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5906 sn->c->addr_text = c->addr_text; |
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5907 sn->c->local_sockaddr = c->local_sockaddr; |
8579
d57cfdebe301
QUIC: set local_socklen in stream connections.
Roman Arutyunyan <arut@nginx.com>
parents:
8578
diff
changeset
|
5908 sn->c->local_socklen = c->local_socklen; |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5909 sn->c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5910 |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5911 sn->c->recv = ngx_quic_stream_recv; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5912 sn->c->send = ngx_quic_stream_send; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5913 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
|
5914 |
8479
b250b515e5b6
QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents:
8478
diff
changeset
|
5915 sn->c->read->log = log; |
b250b515e5b6
QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents:
8478
diff
changeset
|
5916 sn->c->write->log = log; |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5917 |
8362
44cac24aaa44
Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents:
8361
diff
changeset
|
5918 log->connection = sn->c->number; |
44cac24aaa44
Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents:
8361
diff
changeset
|
5919 |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
5920 if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
5921 || (id & NGX_QUIC_STREAM_SERVER_INITIATED)) |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
5922 { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
5923 sn->c->write->ready = 1; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
5924 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
5925 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5926 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5927 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5928 sn->send_max_data = qc->ctp.initial_max_stream_data_uni; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5929 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5930 |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5931 } else { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5932 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5933 sn->send_max_data = qc->ctp.initial_max_stream_data_bidi_remote; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5934 } else { |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5935 sn->send_max_data = qc->ctp.initial_max_stream_data_bidi_local; |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5936 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5937 } |
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5938 |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5939 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
|
5940 if (cln == NULL) { |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5941 ngx_close_connection(sn->c); |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5942 ngx_destroy_pool(pool); |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5943 return NULL; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5944 } |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5945 |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5946 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
|
5947 cln->data = sn->c; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
5948 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5949 ngx_rbtree_insert(&qc->streams.tree, &sn->node); |
8282
4cf00c14f11a
Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents:
8281
diff
changeset
|
5950 |
8229
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5951 return sn; |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5952 } |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5953 |
cfc429911c0d
Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents:
8225
diff
changeset
|
5954 |
8225 | 5955 static ssize_t |
5956 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size) | |
5957 { | |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5958 ssize_t len; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5959 ngx_buf_t *b; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5960 ngx_event_t *rev; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5961 ngx_connection_t *pc; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5962 ngx_quic_frame_t *frame; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5963 ngx_quic_stream_t *qs; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5964 ngx_quic_connection_t *qc; |
8225 | 5965 |
8630
279ad36f2f4b
QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents:
8629
diff
changeset
|
5966 qs = c->quic; |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
5967 b = qs->b; |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
5968 pc = qs->parent; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
5969 qc = ngx_quic_get_connection(pc); |
8279
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5970 rev = c->read; |
8225 | 5971 |
8503
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
5972 if (rev->error) { |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
5973 return NGX_ERROR; |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
5974 } |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
5975 |
8359 | 5976 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5977 "quic stream recv id:0x%xL eof:%d avail:%z", |
8359 | 5978 qs->id, rev->pending_eof, b->last - b->pos); |
8279
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5979 |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
5980 if (b->pos == b->last) { |
8279
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5981 rev->ready = 0; |
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5982 |
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5983 if (rev->pending_eof) { |
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5984 rev->eof = 1; |
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5985 return 0; |
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5986 } |
5f223cdad40e
Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8278
diff
changeset
|
5987 |
8359 | 5988 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
5989 "quic stream id:0x%xL recv() not ready", qs->id); |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
5990 return NGX_AGAIN; |
8225 | 5991 } |
5992 | |
5993 len = ngx_min(b->last - b->pos, (ssize_t) size); | |
5994 | |
5995 ngx_memcpy(buf, b->pos, len); | |
5996 | |
5997 b->pos += len; | |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
5998 qc->streams.received += len; |
8225 | 5999 |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
6000 if (b->pos == b->last) { |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
6001 b->pos = b->start; |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
6002 b->last = b->start; |
8294
32db41d603cd
Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents:
8293
diff
changeset
|
6003 rev->ready = rev->pending_eof; |
8266
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
6004 } |
f92e583fc256
Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8265
diff
changeset
|
6005 |
8359 | 6006 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
6007 "quic stream id:0x%xL recv len:%z of size:%uz", |
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
6008 qs->id, len, size); |
8225 | 6009 |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6010 if (!rev->pending_eof) { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6011 frame = ngx_quic_alloc_frame(pc); |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6012 if (frame == NULL) { |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6013 return NGX_ERROR; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6014 } |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6015 |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6016 frame->level = ssl_encryption_application; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6017 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6018 frame->u.max_stream_data.id = qs->id; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6019 frame->u.max_stream_data.limit = qs->fs.received + (b->pos - b->start) |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6020 + (b->end - b->last); |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6021 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6022 ngx_quic_queue_frame(qc, frame); |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6023 } |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6024 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
6025 if ((qc->streams.recv_max_data / 2) < qc->streams.received) { |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6026 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6027 frame = ngx_quic_alloc_frame(pc); |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6028 |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6029 if (frame == NULL) { |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6030 return NGX_ERROR; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6031 } |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6032 |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
6033 qc->streams.recv_max_data *= 2; |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6034 |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6035 frame->level = ssl_encryption_application; |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6036 frame->type = NGX_QUIC_FT_MAX_DATA; |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
6037 frame->u.max_data.max_data = qc->streams.recv_max_data; |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6038 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6039 ngx_quic_queue_frame(qc, frame); |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6040 |
8359 | 6041 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
6042 "quic stream id:0x%xL recv: increased max_data:%uL", |
8365
fab75acb1f72
Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents:
8364
diff
changeset
|
6043 qs->id, qc->streams.recv_max_data); |
8338
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6044 } |
0f9e9786b90d
Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents:
8337
diff
changeset
|
6045 |
8225 | 6046 return len; |
6047 } | |
6048 | |
6049 | |
6050 static ssize_t | |
6051 ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size) | |
6052 { | |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6053 ngx_buf_t b; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6054 ngx_chain_t cl; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6055 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6056 ngx_memzero(&b, sizeof(ngx_buf_t)); |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6057 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6058 b.memory = 1; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6059 b.pos = buf; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6060 b.last = buf + size; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6061 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6062 cl.buf = &b; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6063 cl.next = NULL; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6064 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6065 if (ngx_quic_stream_send_chain(c, &cl, 0) == NGX_CHAIN_ERROR) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6066 return NGX_ERROR; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6067 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6068 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6069 if (b.pos == buf) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6070 return NGX_AGAIN; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6071 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6072 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6073 return b.pos - buf; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6074 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6075 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6076 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6077 static ngx_chain_t * |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6078 ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6079 { |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6080 size_t n, flow; |
8503
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
6081 ngx_event_t *wev; |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6082 ngx_chain_t *cl; |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6083 ngx_connection_t *pc; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6084 ngx_quic_frame_t *frame; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6085 ngx_quic_stream_t *qs; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6086 ngx_quic_connection_t *qc; |
8225 | 6087 |
8630
279ad36f2f4b
QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents:
8629
diff
changeset
|
6088 qs = c->quic; |
8225 | 6089 pc = qs->parent; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6090 qc = ngx_quic_get_connection(pc); |
8503
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
6091 wev = c->write; |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
6092 |
b66a2a041d7e
QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8502
diff
changeset
|
6093 if (wev->error) { |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6094 return NGX_CHAIN_ERROR; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6095 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6096 |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6097 flow = ngx_quic_max_stream_flow(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6098 if (flow == 0) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6099 wev->ready = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6100 return in; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6101 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6102 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6103 n = (limit && (size_t) limit < flow) ? (size_t) limit : flow; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6104 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6105 frame = ngx_quic_alloc_frame(pc); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6106 if (frame == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6107 return NGX_CHAIN_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6108 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6109 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6110 frame->data = ngx_quic_copy_chain(pc, in, n); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6111 if (frame->data == NGX_CHAIN_ERROR) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6112 return NGX_CHAIN_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6113 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6114 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6115 for (n = 0, cl = frame->data; cl; cl = cl->next) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6116 n += ngx_buf_size(cl->buf); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6117 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6118 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6119 while (in && ngx_buf_size(in->buf) == 0) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6120 in = in->next; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6121 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6122 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6123 frame->level = ssl_encryption_application; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6124 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */ |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6125 frame->u.stream.off = 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6126 frame->u.stream.len = 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6127 frame->u.stream.fin = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6128 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6129 frame->u.stream.type = frame->type; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6130 frame->u.stream.stream_id = qs->id; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6131 frame->u.stream.offset = c->sent; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6132 frame->u.stream.length = n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6133 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6134 c->sent += n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6135 qc->streams.sent += n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6136 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6137 ngx_quic_queue_frame(qc, frame); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6138 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6139 wev->ready = (n < flow) ? 1 : 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6140 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6141 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6142 "quic send_chain sent:%uz", n); |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6143 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6144 return in; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6145 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6146 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6147 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6148 static size_t |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6149 ngx_quic_max_stream_flow(ngx_connection_t *c) |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6150 { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6151 size_t size; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6152 uint64_t sent, unacked; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6153 ngx_quic_stream_t *qs; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6154 ngx_quic_connection_t *qc; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6155 |
8630
279ad36f2f4b
QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents:
8629
diff
changeset
|
6156 qs = c->quic; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6157 qc = ngx_quic_get_connection(qs->parent); |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6158 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6159 size = NGX_QUIC_STREAM_BUFSIZE; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6160 sent = c->sent; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6161 unacked = sent - qs->acked; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6162 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6163 if (qc->streams.send_max_data == 0) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6164 qc->streams.send_max_data = qc->ctp.initial_max_data; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6165 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6166 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6167 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6168 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6169 "quic send flow hit buffer size"); |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6170 return 0; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6171 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6172 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6173 if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6174 size = NGX_QUIC_STREAM_BUFSIZE - unacked; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6175 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6176 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6177 if (qc->streams.sent >= qc->streams.send_max_data) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6178 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6179 "quic send flow hit MAX_DATA"); |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6180 return 0; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6181 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6182 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6183 if (qc->streams.sent + size > qc->streams.send_max_data) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6184 size = qc->streams.send_max_data - qc->streams.sent; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6185 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6186 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6187 if (sent >= qs->send_max_data) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6188 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6189 "quic send flow hit MAX_STREAM_DATA"); |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6190 return 0; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6191 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6192 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6193 if (sent + size > qs->send_max_data) { |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6194 size = qs->send_max_data - sent; |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6195 } |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6196 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6197 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
6198 "quic send flow:%uz", size); |
8509
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6199 |
bce9e9643444
QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
6200 return size; |
8225 | 6201 } |
6202 | |
6203 | |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6204 static void |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6205 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
|
6206 { |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6207 ngx_connection_t *c = data; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6208 |
8280
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6209 ngx_connection_t *pc; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6210 ngx_quic_frame_t *frame; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6211 ngx_quic_stream_t *qs; |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8279
diff
changeset
|
6212 ngx_quic_connection_t *qc; |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6213 |
8630
279ad36f2f4b
QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents:
8629
diff
changeset
|
6214 qs = c->quic; |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6215 pc = qs->parent; |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6216 qc = ngx_quic_get_connection(pc); |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6217 |
8359 | 6218 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
6219 "quic stream id:0x%xL cleanup", qs->id); |
8281
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6220 |
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6221 ngx_rbtree_delete(&qc->streams.tree, &qs->node); |
8348
d42b50d239f4
Fixed memory leak with reordered stream frames.
Vladimir Homutov <vl@nginx.com>
parents:
8346
diff
changeset
|
6222 ngx_quic_free_frames(pc, &qs->fs.frames); |
8281
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6223 |
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6224 if (qc->closing) { |
8355
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
8354
diff
changeset
|
6225 /* schedule handler call to continue ngx_quic_close_connection() */ |
8281
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6226 ngx_post_event(pc->read, &ngx_posted_events); |
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6227 return; |
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6228 } |
618a65de08b3
When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents:
8280
diff
changeset
|
6229 |
8528
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6230 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0 |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6231 || (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6232 { |
8539
62db595a86b5
QUIC: do not send STOP_SENDING after STREAM fin.
Roman Arutyunyan <arut@nginx.com>
parents:
8538
diff
changeset
|
6233 if (!c->read->pending_eof && !c->read->error) { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6234 frame = ngx_quic_alloc_frame(pc); |
8528
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6235 if (frame == NULL) { |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6236 goto done; |
8528
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6237 } |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6238 |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6239 frame->level = ssl_encryption_application; |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6240 frame->type = NGX_QUIC_FT_STOP_SENDING; |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6241 frame->u.stop_sending.id = qs->id; |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6242 frame->u.stop_sending.error_code = 0x100; /* HTTP/3 no error */ |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6243 |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6244 ngx_quic_queue_frame(qc, frame); |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6245 } |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6246 } |
97da6521657c
QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents:
8526
diff
changeset
|
6247 |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6248 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) { |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6249 frame = ngx_quic_alloc_frame(pc); |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6250 if (frame == NULL) { |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6251 goto done; |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6252 } |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6253 |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6254 frame->level = ssl_encryption_application; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6255 frame->type = NGX_QUIC_FT_MAX_STREAMS; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6256 |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6257 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6258 frame->u.max_streams.limit = ++qc->streams.client_max_streams_uni; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6259 frame->u.max_streams.bidi = 0; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6260 |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6261 } else { |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6262 frame->u.max_streams.limit = ++qc->streams.client_max_streams_bidi; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6263 frame->u.max_streams.bidi = 1; |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6264 } |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6265 |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6266 ngx_quic_queue_frame(qc, frame); |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6267 |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6268 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { |
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6269 /* do not send fin for client unidirectional streams */ |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6270 goto done; |
8496
c5324bb3a704
QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8495
diff
changeset
|
6271 } |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6272 } |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6273 |
8703
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
6274 if (c->write->error) { |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6275 goto done; |
8703
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
6276 } |
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
6277 |
8359 | 6278 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8605
eed49b83e18f
QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents:
8604
diff
changeset
|
6279 "quic stream id:0x%xL send fin", qs->id); |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6280 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6281 frame = ngx_quic_alloc_frame(pc); |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6282 if (frame == NULL) { |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6283 goto done; |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6284 } |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6285 |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6286 frame->level = ssl_encryption_application; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6287 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
|
6288 frame->u.stream.off = 1; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6289 frame->u.stream.len = 1; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6290 frame->u.stream.fin = 1; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6291 |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6292 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
|
6293 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
|
6294 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
|
6295 frame->u.stream.length = 0; |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6296 |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6297 ngx_quic_queue_frame(qc, frame); |
8293
1ec905f4d851
Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents:
8290
diff
changeset
|
6298 |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6299 done: |
8703
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8702
diff
changeset
|
6300 |
8293
1ec905f4d851
Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents:
8290
diff
changeset
|
6301 (void) ngx_quic_output(pc); |
8724
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6302 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6303 if (qc->shutdown) { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6304 ngx_quic_shutdown_quic(pc); |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6305 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6306 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6307 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6308 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6309 static void |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6310 ngx_quic_shutdown_quic(ngx_connection_t *c) |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6311 { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6312 ngx_rbtree_t *tree; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6313 ngx_rbtree_node_t *node; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6314 ngx_quic_stream_t *qs; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6315 ngx_quic_connection_t *qc; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6316 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6317 qc = ngx_quic_get_connection(c); |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6318 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6319 if (qc->closing) { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6320 return; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6321 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6322 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6323 tree = &qc->streams.tree; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6324 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6325 if (tree->root != tree->sentinel) { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6326 for (node = ngx_rbtree_min(tree->root, tree->sentinel); |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6327 node; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6328 node = ngx_rbtree_next(tree, node)) |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6329 { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6330 qs = (ngx_quic_stream_t *) node; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6331 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6332 if (!qs->cancelable) { |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6333 return; |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6334 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6335 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6336 } |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6337 |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8717
diff
changeset
|
6338 ngx_quic_finalize_connection(c, qc->shutdown_code, qc->shutdown_reason); |
8239
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6339 } |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6340 |
5ad7bffd3850
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents:
8237
diff
changeset
|
6341 |
8736
714e9af983de
QUIC: separate header for ngx_quic_connection_t.
Vladimir Homutov <vl@nginx.com>
parents:
8735
diff
changeset
|
6342 ngx_quic_frame_t * |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6343 ngx_quic_alloc_frame(ngx_connection_t *c) |
8286 | 6344 { |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6345 ngx_queue_t *q; |
8286 | 6346 ngx_quic_frame_t *frame; |
6347 ngx_quic_connection_t *qc; | |
6348 | |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6349 qc = ngx_quic_get_connection(c); |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6350 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6351 if (!ngx_queue_empty(&qc->free_frames)) { |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6352 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6353 q = ngx_queue_head(&qc->free_frames); |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6354 frame = ngx_queue_data(q, ngx_quic_frame_t, queue); |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6355 |
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6356 ngx_queue_remove(&frame->queue); |
8286 | 6357 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6358 #ifdef NGX_QUIC_DEBUG_ALLOC |
8286 | 6359 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 6360 "quic reuse frame n:%ui", qc->nframes); |
6361 #endif | |
8286 | 6362 |
6363 } else { | |
6364 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t)); | |
6365 if (frame == NULL) { | |
6366 return NULL; | |
6367 } | |
6368 | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6369 #ifdef NGX_QUIC_DEBUG_ALLOC |
8286 | 6370 ++qc->nframes; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6371 |
8286 | 6372 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 6373 "quic alloc frame n:%ui", qc->nframes); |
6374 #endif | |
8286 | 6375 } |
6376 | |
6377 ngx_memzero(frame, sizeof(ngx_quic_frame_t)); | |
6378 | |
6379 return frame; | |
6380 } | |
6381 | |
6382 | |
6383 static void | |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6384 ngx_quic_congestion_ack(ngx_connection_t *c, ngx_quic_frame_t *f) |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6385 { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6386 ngx_msec_t timer; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6387 ngx_quic_congestion_t *cg; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6388 ngx_quic_connection_t *qc; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6389 |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6390 if (f->plen == 0) { |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6391 return; |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6392 } |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6393 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6394 qc = ngx_quic_get_connection(c); |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6395 cg = &qc->congestion; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6396 |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6397 cg->in_flight -= f->plen; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6398 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6399 timer = f->last - cg->recovery_start; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6400 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6401 if ((ngx_msec_int_t) timer <= 0) { |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6402 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
6403 "quic congestion ack recovery win:%uz ss:%z if:%uz", |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6404 cg->window, cg->ssthresh, cg->in_flight); |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6405 |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6406 return; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6407 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6408 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6409 if (cg->window < cg->ssthresh) { |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6410 cg->window += f->plen; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6411 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6412 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
6413 "quic congestion slow start win:%uz ss:%z if:%uz", |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6414 cg->window, cg->ssthresh, cg->in_flight); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6415 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6416 } else { |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6417 cg->window += qc->tp.max_udp_payload_size * f->plen / cg->window; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6418 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6419 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
6420 "quic congestion avoidance win:%uz ss:%z if:%uz", |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6421 cg->window, cg->ssthresh, cg->in_flight); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6422 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6423 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6424 /* prevent recovery_start from wrapping */ |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6425 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6426 timer = cg->recovery_start - ngx_current_msec + qc->tp.max_idle_timeout * 2; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6427 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6428 if ((ngx_msec_int_t) timer < 0) { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6429 cg->recovery_start = ngx_current_msec - qc->tp.max_idle_timeout * 2; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6430 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6431 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6432 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6433 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6434 static void |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6435 ngx_quic_congestion_lost(ngx_connection_t *c, ngx_quic_frame_t *f) |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6436 { |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6437 ngx_msec_t timer; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6438 ngx_quic_congestion_t *cg; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6439 ngx_quic_connection_t *qc; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6440 |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6441 if (f->plen == 0) { |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6442 return; |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6443 } |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6444 |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6445 qc = ngx_quic_get_connection(c); |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6446 cg = &qc->congestion; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6447 |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6448 cg->in_flight -= f->plen; |
8612
b1676cd64dc9
QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents:
8611
diff
changeset
|
6449 f->plen = 0; |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6450 |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6451 timer = f->last - cg->recovery_start; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6452 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6453 if ((ngx_msec_int_t) timer <= 0) { |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6454 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
6455 "quic congestion lost recovery win:%uz ss:%z if:%uz", |
8508
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6456 cg->window, cg->ssthresh, cg->in_flight); |
4604e6043657
QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8507
diff
changeset
|
6457 |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6458 return; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6459 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6460 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6461 cg->recovery_start = ngx_current_msec; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6462 cg->window /= 2; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6463 |
8415
125cbfa77013
Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8413
diff
changeset
|
6464 if (cg->window < qc->tp.max_udp_payload_size * 2) { |
125cbfa77013
Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8413
diff
changeset
|
6465 cg->window = qc->tp.max_udp_payload_size * 2; |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6466 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6467 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6468 cg->ssthresh = cg->window; |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6469 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6470 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8623
8550b91e8e35
QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents:
8622
diff
changeset
|
6471 "quic congestion lost win:%uz ss:%z if:%uz", |
8364
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6472 cg->window, cg->ssthresh, cg->in_flight); |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6473 } |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6474 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6475 |
eee307399229
QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents:
8363
diff
changeset
|
6476 static void |
8286 | 6477 ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame) |
6478 { | |
6479 ngx_quic_connection_t *qc; | |
6480 | |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6481 qc = ngx_quic_get_connection(c); |
8286 | 6482 |
6483 if (frame->data) { | |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6484 ngx_quic_free_bufs(c, frame->data); |
8286 | 6485 } |
6486 | |
8308
e10b4c61420f
Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents:
8307
diff
changeset
|
6487 ngx_queue_insert_head(&qc->free_frames, &frame->queue); |
8286 | 6488 |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6489 #ifdef NGX_QUIC_DEBUG_ALLOC |
8286 | 6490 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
8359 | 6491 "quic free frame n:%ui", qc->nframes); |
6492 #endif | |
8286 | 6493 } |
8626
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6494 |
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6495 |
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6496 uint32_t |
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6497 ngx_quic_version(ngx_connection_t *c) |
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6498 { |
8629
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6499 uint32_t version; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6500 ngx_quic_connection_t *qc; |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6501 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6502 qc = ngx_quic_get_connection(c); |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6503 |
feec2cc762f6
QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents:
8628
diff
changeset
|
6504 version = qc->version; |
8626
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6505 |
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6506 return (version & 0xff000000) == 0xff000000 ? version & 0xff : version; |
e0947c952d43
QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
6507 } |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6508 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6509 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6510 static ngx_chain_t * |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6511 ngx_quic_alloc_buf(ngx_connection_t *c) |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6512 { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6513 ngx_buf_t *b; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6514 ngx_chain_t *cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6515 ngx_quic_connection_t *qc; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6516 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6517 qc = ngx_quic_get_connection(c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6518 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6519 if (qc->free_bufs) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6520 cl = qc->free_bufs; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6521 qc->free_bufs = cl->next; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6522 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6523 b = cl->buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6524 b->pos = b->start; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6525 b->last = b->start; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6526 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6527 #ifdef NGX_QUIC_DEBUG_ALLOC |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6528 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6529 "quic reuse buffer n:%ui", qc->nbufs); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6530 #endif |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6531 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6532 return cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6533 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6534 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6535 cl = ngx_alloc_chain_link(c->pool); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6536 if (cl == NULL) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6537 return NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6538 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6539 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6540 b = ngx_create_temp_buf(c->pool, NGX_QUIC_BUFFER_SIZE); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6541 if (b == NULL) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6542 return NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6543 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6544 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6545 b->tag = (ngx_buf_tag_t) &ngx_quic_alloc_buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6546 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6547 cl->buf = b; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6548 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6549 #ifdef NGX_QUIC_DEBUG_ALLOC |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6550 ++qc->nbufs; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6551 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6552 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6553 "quic alloc buffer n:%ui", qc->nbufs); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6554 #endif |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6555 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6556 return cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6557 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6558 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6559 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6560 static void |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6561 ngx_quic_free_bufs(ngx_connection_t *c, ngx_chain_t *in) |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6562 { |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6563 ngx_buf_t *b, *shadow; |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6564 ngx_chain_t *cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6565 ngx_quic_connection_t *qc; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6566 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6567 qc = ngx_quic_get_connection(c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6568 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6569 while (in) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6570 #ifdef NGX_QUIC_DEBUG_ALLOC |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6571 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6572 "quic free buffer n:%ui", qc->nbufs); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6573 #endif |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6574 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6575 cl = in; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6576 in = in->next; |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6577 b = cl->buf; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6578 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6579 if (b->shadow) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6580 if (!b->last_shadow) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6581 b->recycled = 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6582 ngx_free_chain(c->pool, cl); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6583 continue; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6584 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6585 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6586 do { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6587 shadow = b->shadow; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6588 b->shadow = qc->free_shadow_bufs; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6589 qc->free_shadow_bufs = b; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6590 b = shadow; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6591 } while (b->recycled); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6592 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6593 if (b->shadow) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6594 b->last_shadow = 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6595 ngx_free_chain(c->pool, cl); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6596 continue; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6597 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6598 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6599 cl->buf = b; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6600 } |
8657
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6601 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6602 cl->next = qc->free_bufs; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6603 qc->free_bufs = cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6604 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6605 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6606 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6607 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6608 static ngx_chain_t * |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6609 ngx_quic_copy_buf(ngx_connection_t *c, u_char *data, size_t len) |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6610 { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6611 size_t n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6612 ngx_buf_t *b; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6613 ngx_chain_t *cl, *out, **ll; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6614 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6615 out = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6616 ll = &out; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6617 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6618 while (len) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6619 cl = ngx_quic_alloc_buf(c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6620 if (cl == NULL) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6621 return NGX_CHAIN_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6622 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6623 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6624 b = cl->buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6625 n = ngx_min((size_t) (b->end - b->last), len); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6626 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6627 b->last = ngx_cpymem(b->last, data, n); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6628 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6629 data += n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6630 len -= n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6631 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6632 *ll = cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6633 ll = &cl->next; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6634 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6635 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6636 *ll = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6637 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6638 return out; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6639 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6640 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6641 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6642 static ngx_chain_t * |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6643 ngx_quic_copy_chain(ngx_connection_t *c, ngx_chain_t *in, size_t limit) |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6644 { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6645 size_t n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6646 ngx_buf_t *b; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6647 ngx_chain_t *cl, *out, **ll; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6648 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6649 out = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6650 ll = &out; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6651 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6652 while (in) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6653 if (!ngx_buf_in_memory(in->buf) || ngx_buf_size(in->buf) == 0) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6654 in = in->next; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6655 continue; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6656 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6657 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6658 cl = ngx_quic_alloc_buf(c); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6659 if (cl == NULL) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6660 return NGX_CHAIN_ERROR; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6661 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6662 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6663 *ll = cl; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6664 ll = &cl->next; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6665 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6666 b = cl->buf; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6667 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6668 while (in && b->last != b->end) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6669 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6670 n = ngx_min(in->buf->last - in->buf->pos, b->end - b->last); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6671 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6672 if (limit > 0 && n > limit) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6673 n = limit; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6674 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6675 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6676 b->last = ngx_cpymem(b->last, in->buf->pos, n); |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6677 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6678 in->buf->pos += n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6679 if (in->buf->pos == in->buf->last) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6680 in = in->next; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6681 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6682 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6683 if (limit > 0) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6684 if (limit == n) { |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6685 goto done; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6686 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6687 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6688 limit -= n; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6689 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6690 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6691 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6692 } |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6693 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6694 done: |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6695 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6696 *ll = NULL; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6697 |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6698 return out; |
2dfc5ef29973
QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents:
8656
diff
changeset
|
6699 } |
8658
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6700 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6701 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6702 static ngx_chain_t * |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6703 ngx_quic_split_bufs(ngx_connection_t *c, ngx_chain_t *in, size_t len) |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6704 { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6705 size_t n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6706 ngx_buf_t *b; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6707 ngx_chain_t *out; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6708 ngx_quic_connection_t *qc; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6709 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6710 qc = ngx_quic_get_connection(c); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6711 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6712 while (in) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6713 n = ngx_buf_size(in->buf); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6714 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6715 if (n == len) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6716 out = in->next; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6717 in->next = NULL; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6718 return out; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6719 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6720 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6721 if (n > len) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6722 break; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6723 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6724 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6725 len -= n; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6726 in = in->next; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6727 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6728 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6729 if (in == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6730 return NULL; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6731 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6732 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6733 /* split in->buf by creating shadow bufs which reference it */ |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6734 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6735 if (in->buf->shadow == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6736 if (qc->free_shadow_bufs) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6737 b = qc->free_shadow_bufs; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6738 qc->free_shadow_bufs = b->shadow; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6739 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6740 } else { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6741 b = ngx_alloc_buf(c->pool); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6742 if (b == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6743 return NGX_CHAIN_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6744 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6745 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6746 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6747 *b = *in->buf; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6748 b->shadow = in->buf; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6749 b->last_shadow = 1; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6750 in->buf = b; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6751 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6752 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6753 out = ngx_alloc_chain_link(c->pool); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6754 if (out == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6755 return NGX_CHAIN_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6756 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6757 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6758 if (qc->free_shadow_bufs) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6759 b = qc->free_shadow_bufs; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6760 qc->free_shadow_bufs = b->shadow; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6761 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6762 } else { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6763 b = ngx_alloc_buf(c->pool); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6764 if (b == NULL) { |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6765 ngx_free_chain(c->pool, out); |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6766 return NGX_CHAIN_ERROR; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6767 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6768 } |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6769 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6770 out->buf = b; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6771 out->next = in->next; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6772 in->next = NULL; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6773 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6774 *b = *in->buf; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6775 b->last_shadow = 0; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6776 b->pos = b->pos + len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6777 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6778 in->buf->shadow = b; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6779 in->buf->last = in->buf->pos + len; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6780 |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6781 return out; |
0af4ec6d1f92
QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents:
8657
diff
changeset
|
6782 } |