annotate src/event/ngx_event_quic.c @ 8147:018baa412c0d quic

try: --skiptests
author Vladimir Homutov <vl@nginx.com>
date Mon, 19 Oct 2020 10:10:21 +0300
parents 61f1c6ac8967
children 93be5658a250
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2 /*
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
3 * Copyright (C) Nginx, Inc.
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
4 */
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
5
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
6
7637
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
9 #include <ngx_event.h>
8004
d0ac4449a07f QUIC: fixed bulding perl module by reducing header pollution.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8001
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: 8001
diff changeset
11 #include <ngx_event_quic_protection.h>
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
12
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
13
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
14 /* 0-RTT and 1-RTT data exist in the same packet number space,
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
15 * so we have 3 packet number spaces:
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
16 *
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
17 * 0 - Initial
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
18 * 1 - Handshake
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
19 * 2 - 0-RTT and 1-RTT
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
20 */
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
21 #define ngx_quic_get_send_ctx(qc, level) \
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
22 ((level) == ssl_encryption_initial) ? &((qc)->send_ctx[0]) \
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
23 : (((level) == ssl_encryption_handshake) ? &((qc)->send_ctx[1]) \
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
24 : &((qc)->send_ctx[2]))
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
25
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
26 #define NGX_QUIC_SEND_CTX_LAST (NGX_QUIC_ENCRYPTION_LAST - 1)
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
27
7780
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
28 #define NGX_QUIC_STREAMS_INC 16
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
29 #define NGX_QUIC_STREAMS_LIMIT (1ULL < 60)
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
30
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
31 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
32 * 7.4. Cryptographic Message Buffering
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
33 * Implementations MUST support buffering at least 4096 bytes of data
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
34 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
35 #define NGX_QUIC_MAX_BUFFERED 65535
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
36
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
37 #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: 8021
diff changeset
38
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
39 /*
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
40 * Endpoints MUST discard packets that are too small to be valid QUIC
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
41 * packets. With the set of AEAD functions defined in [QUIC-TLS],
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
42 * packets that are smaller than 21 bytes are never valid.
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
43 */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
44 #define NGX_QUIC_MIN_PKT_LEN 21
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
45
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
46 #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: 8099
diff changeset
47 #define NGX_QUIC_MAX_SR_PACKET 1200
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
48
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
49 #define ngx_quic_level_name(lvl) \
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
50 (lvl == ssl_encryption_application) ? "application" \
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
51 : (lvl == ssl_encryption_initial) ? "initial" \
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
52 : (lvl == ssl_encryption_handshake) ? "handshake" : "early_data"
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
53
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
54
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
55 typedef struct {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
56 ngx_rbtree_t tree;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
57 ngx_rbtree_node_t sentinel;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
58
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
59 uint64_t received;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
60 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
61 uint64_t recv_max_data;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
62 uint64_t send_max_data;
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
63
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
64 uint64_t server_max_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
65 uint64_t server_max_streams_bidi;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
66 uint64_t server_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
67 uint64_t server_streams_bidi;
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
68
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
69 uint64_t client_max_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
70 uint64_t client_max_streams_bidi;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
71 uint64_t client_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
72 uint64_t client_streams_bidi;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
73 } ngx_quic_streams_t;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
74
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
75
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
76 typedef struct {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
77 size_t in_flight;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
78 size_t window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
79 size_t ssthresh;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
80 ngx_msec_t recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
81 } ngx_quic_congestion_t;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
82
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
83
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
84 /*
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
85 * 12.3. Packet Numbers
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
86 *
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
87 * Conceptually, a packet number space is the context in which a packet
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
88 * can be processed and acknowledged. Initial packets can only be sent
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
89 * with Initial packet protection keys and acknowledged in packets which
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
90 * are also Initial packets.
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
91 */
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
92 typedef struct {
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
93 ngx_quic_secret_t client_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
94 ngx_quic_secret_t server_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
95
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
96 enum ssl_encryption_level_t level;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
97
7878
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
98 uint64_t pnum; /* to be sent */
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
99 uint64_t largest_ack; /* received from peer */
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
100 uint64_t largest_pn; /* received from peer */
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
101
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
102 ngx_queue_t frames;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
103 ngx_queue_t sent;
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
104
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
105 uint64_t largest_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
106 uint64_t first_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
107 ngx_uint_t nranges;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
108 ngx_quic_ack_range_t ranges[NGX_QUIC_MAX_RANGES];
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
109 struct timeval ack_received;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
110 ngx_uint_t send_ack; /* unsigned send_ack:1 */
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
111 } ngx_quic_send_ctx_t;
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
112
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
113
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
114 struct ngx_quic_connection_s {
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
115 ngx_str_t scid; /* initial client ID */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
116 ngx_str_t dcid; /* server (our own) ID */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
117 ngx_str_t odcid; /* original server ID */
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
118 ngx_str_t token;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
119
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
120 ngx_queue_t client_ids;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
121 ngx_queue_t free_client_ids;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
122 ngx_uint_t nclient_ids;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
123 uint64_t max_retired_seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
124 uint64_t curr_seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
125
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
126 ngx_uint_t client_tp_done;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
127 ngx_quic_tp_t tp;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
128 ngx_quic_tp_t ctp;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
129
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
130 ngx_quic_send_ctx_t send_ctx[NGX_QUIC_SEND_CTX_LAST];
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
131 ngx_quic_secrets_t keys[NGX_QUIC_ENCRYPTION_LAST];
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
132 ngx_quic_secrets_t next_key;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
133 ngx_quic_frames_stream_t crypto[NGX_QUIC_ENCRYPTION_LAST];
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
134
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
135 ngx_quic_conf_t *conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
136
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
137 ngx_event_t push;
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
138 ngx_event_t pto;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
139 ngx_event_t close;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
140 ngx_queue_t free_frames;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
141 ngx_msec_t last_cc;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
142
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
143 ngx_msec_t latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
144 ngx_msec_t avg_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
145 ngx_msec_t min_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
146 ngx_msec_t rttvar;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
147
8056
f9b1a4e52597 QUIC: changed c->quic->pto_count type to ngx_uint_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8055
diff changeset
148 ngx_uint_t pto_count;
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
149
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
150 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
151 ngx_uint_t nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
152 #endif
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
153
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
154 ngx_quic_streams_t streams;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
155 ngx_quic_congestion_t congestion;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
156 size_t received;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
157
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
158 ngx_uint_t error;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
159 enum ssl_encryption_level_t error_level;
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
160 ngx_uint_t error_ftype;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
161 const char *error_reason;
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
162
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
163 unsigned error_app:1;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
164 unsigned send_timer_set:1;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
165 unsigned closing:1;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
166 unsigned draining:1;
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
167 unsigned key_phase:1;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
168 unsigned in_retry:1;
7874
1245e274b9ba Avoided excessive definitions for connection state.
Vladimir Homutov <vl@nginx.com>
parents: 7871
diff changeset
169 unsigned initialized:1;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
170 unsigned validated:1;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
171 };
7672
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 7671
diff changeset
172
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
173
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
174 typedef struct {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
175 ngx_queue_t queue;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
176 uint64_t seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
177 size_t len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
178 u_char id[NGX_QUIC_CID_LEN_MAX];
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
179 u_char sr_token[NGX_QUIC_SR_TOKEN_LEN];
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
180 } ngx_quic_client_id_t;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
181
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
182
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
183 typedef ngx_int_t (*ngx_quic_frame_handler_pt)(ngx_connection_t *c,
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
184 ngx_quic_frame_t *frame, void *data);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
185
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
186
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
187 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
188 static int ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
189 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
190 const uint8_t *secret, size_t secret_len);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
191 static int ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
192 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
193 const uint8_t *secret, size_t secret_len);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
194 #else
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
195 static int ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
196 enum ssl_encryption_level_t level, const uint8_t *read_secret,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
197 const uint8_t *write_secret, size_t secret_len);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
198 #endif
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
199
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
200 static int ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
201 enum ssl_encryption_level_t level, const uint8_t *data, size_t len);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
202 static int ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
203 static int ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
204 enum ssl_encryption_level_t level, uint8_t alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
205
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
206
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
207 static ngx_quic_connection_t *ngx_quic_new_connection(ngx_connection_t *c,
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
208 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
209 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: 8099
diff changeset
210 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
211 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: 8099
diff changeset
212 ngx_quic_header_t *pkt);
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
213 static ngx_int_t ngx_quic_negotiate_version(ngx_connection_t *c,
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
214 ngx_quic_header_t *inpkt);
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
215 static ngx_int_t ngx_quic_new_dcid(ngx_connection_t *c,
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
216 ngx_quic_connection_t *qc, ngx_str_t *odcid);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
217 static ngx_int_t ngx_quic_send_retry(ngx_connection_t *c);
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
218 static ngx_int_t ngx_quic_new_token(ngx_connection_t *c, ngx_str_t *token);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
219 static ngx_int_t ngx_quic_validate_token(ngx_connection_t *c,
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
220 ngx_quic_header_t *pkt);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
221 static ngx_int_t ngx_quic_init_connection(ngx_connection_t *c);
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
222 static ngx_inline size_t ngx_quic_max_udp_payload(ngx_connection_t *c);
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
223 static void ngx_quic_input_handler(ngx_event_t *rev);
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
224
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
225 static void ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
226 static ngx_int_t ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
227 static void ngx_quic_close_timer_handler(ngx_event_t *ev);
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
228 static ngx_int_t ngx_quic_close_streams(ngx_connection_t *c,
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
229 ngx_quic_connection_t *qc);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
230
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
231 static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b,
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
232 ngx_quic_conf_t *conf);
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
233 static ngx_int_t ngx_quic_process_packet(ngx_connection_t *c,
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
234 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
235 static ngx_int_t ngx_quic_init_secrets(ngx_connection_t *c);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
236 static void ngx_quic_discard_ctx(ngx_connection_t *c,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
237 enum ssl_encryption_level_t level);
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
238 static ngx_int_t ngx_quic_check_peer(ngx_quic_connection_t *qc,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
239 ngx_quic_header_t *pkt);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
240 static ngx_int_t ngx_quic_payload_handler(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
241 ngx_quic_header_t *pkt);
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
242 static ngx_int_t ngx_quic_ack_packet(ngx_connection_t *c,
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
243 ngx_quic_header_t *pkt);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
244 static ngx_int_t ngx_quic_send_ack_range(ngx_connection_t *c,
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
245 ngx_quic_send_ctx_t *ctx, uint64_t smallest, uint64_t largest);
8147
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
246 static void ngx_quic_drop_ack_ranges(ngx_connection_t *c,
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
247 ngx_quic_send_ctx_t *ctx, uint64_t pn);
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
248 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c,
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
249 ngx_quic_send_ctx_t *ctx);
7988
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
250 static ngx_int_t ngx_quic_ack_delay(ngx_connection_t *c,
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
251 struct timeval *received, enum ssl_encryption_level_t level);
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
252 static ngx_int_t ngx_quic_send_cc(ngx_connection_t *c);
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
253 static ngx_int_t ngx_quic_send_new_token(ngx_connection_t *c);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
254
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
255 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
256 ngx_quic_header_t *pkt, ngx_quic_ack_frame_t *f);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
257 static ngx_int_t ngx_quic_handle_ack_frame_range(ngx_connection_t *c,
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
258 ngx_quic_send_ctx_t *ctx, uint64_t min, uint64_t max,
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
259 ngx_msec_t *send_time);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
260 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: 7953
diff changeset
261 enum ssl_encryption_level_t level, ngx_msec_t send_time);
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
262 static ngx_inline ngx_msec_t ngx_quic_pto(ngx_connection_t *c,
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
263 ngx_quic_send_ctx_t *ctx);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
264 static void ngx_quic_handle_stream_ack(ngx_connection_t *c,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
265 ngx_quic_frame_t *f);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
266
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
267 static ngx_int_t ngx_quic_handle_ordered_frame(ngx_connection_t *c,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
268 ngx_quic_frames_stream_t *fs, ngx_quic_frame_t *frame,
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
269 ngx_quic_frame_handler_pt handler, void *data);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
270 static ngx_int_t ngx_quic_adjust_frame_offset(ngx_connection_t *c,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
271 ngx_quic_frame_t *f, uint64_t offset_in);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
272 static ngx_int_t ngx_quic_buffer_frame(ngx_connection_t *c,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
273 ngx_quic_frames_stream_t *stream, ngx_quic_frame_t *f);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
274
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
275 static ngx_int_t ngx_quic_handle_crypto_frame(ngx_connection_t *c,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
276 ngx_quic_header_t *pkt, ngx_quic_frame_t *frame);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
277 static ngx_int_t ngx_quic_crypto_input(ngx_connection_t *c,
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
278 ngx_quic_frame_t *frame, void *data);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
279 static ngx_int_t ngx_quic_handle_stream_frame(ngx_connection_t *c,
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
280 ngx_quic_header_t *pkt, ngx_quic_frame_t *frame);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
281 static ngx_int_t ngx_quic_stream_input(ngx_connection_t *c,
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
282 ngx_quic_frame_t *frame, void *data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
283
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
284 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: 7841
diff changeset
285 ngx_quic_max_data_frame_t *f);
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
286 static ngx_int_t ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
287 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f);
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
288 static ngx_int_t ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
289 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f);
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
290 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: 7841
diff changeset
291 ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f);
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
292 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: 7922
diff changeset
293 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: 7922
diff changeset
294 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: 7922
diff changeset
295 ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f);
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
296 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: 8004
diff changeset
297 ngx_quic_header_t *pkt, ngx_quic_max_streams_frame_t *f);
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
298 static ngx_int_t ngx_quic_handle_path_challenge_frame(ngx_connection_t *c,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
299 ngx_quic_header_t *pkt, ngx_quic_path_challenge_frame_t *f);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
300 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: 8074
diff changeset
301 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: 8074
diff changeset
302 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: 8074
diff changeset
303 enum ssl_encryption_level_t level, uint64_t seqnum);
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
304 static ngx_quic_client_id_t *ngx_quic_alloc_connection_id(ngx_connection_t *c,
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
305 ngx_quic_connection_t *qc);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
306
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
307 static void ngx_quic_queue_frame(ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
308 ngx_quic_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
309
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
310 static ngx_int_t ngx_quic_output(ngx_connection_t *c);
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
311 static ngx_int_t ngx_quic_output_frames(ngx_connection_t *c,
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
312 ngx_quic_send_ctx_t *ctx);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
313 static void ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames);
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
314 static ngx_int_t ngx_quic_send_frames(ngx_connection_t *c,
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
315 ngx_quic_send_ctx_t *ctx, ngx_queue_t *frames);
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
316
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
317 static void ngx_quic_set_packet_number(ngx_quic_header_t *pkt,
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
318 ngx_quic_send_ctx_t *ctx);
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
319 static void ngx_quic_pto_handler(ngx_event_t *ev);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
320 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: 8050
diff changeset
321 static ngx_int_t ngx_quic_detect_lost(ngx_connection_t *c);
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
322 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: 8091
diff changeset
323 ngx_quic_send_ctx_t *ctx);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
324 static void ngx_quic_push_handler(ngx_event_t *ev);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
325
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
326 static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
327 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
328 static ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree,
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
329 uint64_t id);
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
330 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: 8021
diff changeset
331 uint64_t id);
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
332 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c,
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
333 uint64_t id, size_t rcvbuf_size);
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
334 static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
335 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
336 static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
337 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
338 static ngx_chain_t *ngx_quic_stream_send_chain(ngx_connection_t *c,
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
339 ngx_chain_t *in, off_t limit);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
340 static size_t ngx_quic_max_stream_frame(ngx_quic_connection_t *qc);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
341 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: 8026
diff changeset
342 static void ngx_quic_stream_cleanup_handler(void *data);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
343 static ngx_quic_frame_t *ngx_quic_alloc_frame(ngx_connection_t *c, size_t size);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
344 static void ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame);
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
345
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
346 static void ngx_quic_congestion_ack(ngx_connection_t *c,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
347 ngx_quic_frame_t *frame);
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
348 static void ngx_quic_congestion_lost(ngx_connection_t *c,
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
349 ngx_quic_frame_t *frame);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
350
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
351
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
352 static SSL_QUIC_METHOD quic_method = {
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
353 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
354 ngx_quic_set_read_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
355 ngx_quic_set_write_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
356 #else
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
357 ngx_quic_set_encryption_secrets,
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
358 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
359 ngx_quic_add_handshake_data,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
360 ngx_quic_flush_flight,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
361 ngx_quic_send_alert,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
362 };
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
363
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
364
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
365 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
366
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
367 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
368 ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
369 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
370 const uint8_t *rsecret, size_t secret_len)
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
371 {
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
372 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
373 ngx_quic_secrets_t *keys;
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
374
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
375 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
376
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
377 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
378 "quic ngx_quic_set_read_secret() level:%d", level);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
379 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
380 ngx_quic_hexdump(c->log, "quic read secret", rsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
381 #endif
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
382
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
383 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
384
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
385 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
386 rsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
387 &keys->client);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
388 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
389
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
390
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
391 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
392 ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
393 enum ssl_encryption_level_t level, const SSL_CIPHER *cipher,
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
394 const uint8_t *wsecret, size_t secret_len)
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
395 {
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
396 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
397 ngx_quic_secrets_t *keys;
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
398
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
399 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
400
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
401 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
402 "quic ngx_quic_set_write_secret() level:%d", level);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
403 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
404 ngx_quic_hexdump(c->log, "quic write secret", wsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
405 #endif
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
406
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
407 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
408
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
409 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
410 wsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
411 &keys->server);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
412 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
413
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
414 #else
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
415
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
416 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
417 ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
418 enum ssl_encryption_level_t level, const uint8_t *rsecret,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
419 const uint8_t *wsecret, size_t secret_len)
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
420 {
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
421 ngx_int_t rc;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
422 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
423 ngx_quic_secrets_t *keys;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
424
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
425 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
426
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
427 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
428 "quic ngx_quic_set_encryption_secrets() level:%d", level);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
429 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
430 ngx_quic_hexdump(c->log, "quic read", rsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
431 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
432
7793
0ae50d90658a Fixed build with OpenSSL using old callbacks API.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7792
diff changeset
433 keys = &c->quic->keys[level];
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
434
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
435 rc = ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
436 rsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
437 &keys->client);
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
438 if (rc != 1) {
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
439 return rc;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
440 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
441
7769
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
442 if (level == ssl_encryption_early_data) {
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
443 return 1;
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
444 }
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
445
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
446 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
447 ngx_quic_hexdump(c->log, "quic write", wsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
448 #endif
7769
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
449
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
450 return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
451 wsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
452 &keys->server);
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
453 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
454
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
455 #endif
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
456
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
457
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
458 static int
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
459 ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn,
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
460 enum ssl_encryption_level_t level, const uint8_t *data, size_t len)
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
461 {
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
462 u_char *p, *end;
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
463 size_t client_params_len, fsize, limit;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
464 const uint8_t *client_params;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
465 ngx_quic_frame_t *frame;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
466 ngx_connection_t *c;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
467 ngx_quic_connection_t *qc;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
468 ngx_quic_frames_stream_t *fs;
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
469
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
470 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
471 qc = c->quic;
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
472
7652
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 7651
diff changeset
473 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
474 "quic ngx_quic_add_handshake_data");
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
475
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
476 if (!qc->client_tp_done) {
7933
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
477 /*
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
478 * things to do once during handshake: check ALPN and transport
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
479 * parameters; we want to break handshake if something is wrong
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
480 * here;
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
481 */
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
482
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
483 #if defined(TLSEXT_TYPE_application_layer_protocol_negotiation)
8000
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
484 if (qc->conf->require_alpn) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
485 unsigned int len;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
486 const unsigned char *data;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
487
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
488 SSL_get0_alpn_selected(c->ssl->connection, &data, &len);
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
489
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
490 if (len == 0) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
491 qc->error = 0x100 + SSL_AD_NO_APPLICATION_PROTOCOL;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
492 qc->error_reason = "unsupported protocol in ALPN extension";
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
493
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
494 ngx_log_error(NGX_LOG_INFO, c->log, 0,
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
495 "quic unsupported protocol in ALPN extension");
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
496 return 0;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
497 }
7933
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
498 }
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
499 #endif
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
500
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
501 SSL_get_peer_quic_transport_params(ssl_conn, &client_params,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
502 &client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
503
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
504 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
505 "quic SSL_get_peer_quic_transport_params():"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
506 " params_len %ui", client_params_len);
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
507
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
508 if (client_params_len == 0) {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
509 /* quic-tls 8.2 */
7942
97adb87f149b Get rid of hardcoded numbers used for quic handshake errors.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7941
diff changeset
510 qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_MISSING_EXTENSION);
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
511 qc->error_reason = "missing transport parameters";
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
512
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
513 ngx_log_error(NGX_LOG_INFO, c->log, 0,
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
514 "missing transport parameters");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
515 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
516 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
517
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
518 p = (u_char *) client_params;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
519 end = p + client_params_len;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
520
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
521 if (ngx_quic_parse_transport_params(p, end, &qc->ctp, c->log)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
522 != NGX_OK)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
523 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
524 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
525 qc->error_reason = "failed to process transport parameters";
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
526
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
527 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
528 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
529
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
530 if (qc->ctp.max_idle_timeout > 0
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
531 && qc->ctp.max_idle_timeout < qc->tp.max_idle_timeout)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
532 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
533 qc->tp.max_idle_timeout = qc->ctp.max_idle_timeout;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
534 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
535
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
536 if (qc->ctp.max_udp_payload_size < NGX_QUIC_MIN_INITIAL_SIZE
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
537 || qc->ctp.max_udp_payload_size > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
538 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
539 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
540 qc->error_reason = "invalid maximum packet size";
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
541
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
542 ngx_log_error(NGX_LOG_INFO, c->log, 0,
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
543 "quic maximum packet size is invalid");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
544 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
545 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
546
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
547 if (qc->ctp.max_udp_payload_size > ngx_quic_max_udp_payload(c)) {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
548 qc->ctp.max_udp_payload_size = ngx_quic_max_udp_payload(c);
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
549 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
550 "quic client maximum packet size truncated");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
551 }
7927
391d06a51bc0 Limited max udp payload size for outgoing packets.
Vladimir Homutov <vl@nginx.com>
parents: 7926
diff changeset
552
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
553 #if (NGX_QUIC_DRAFT_VERSION >= 28)
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
554 if (qc->scid.len != qc->ctp.initial_scid.len
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
555 || ngx_memcmp(qc->scid.data, qc->ctp.initial_scid.data,
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
556 qc->scid.len) != 0)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
557 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
558 ngx_log_error(NGX_LOG_INFO, c->log, 0,
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
559 "quic client initial_source_connection_id "
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
560 "mismatch");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
561 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
562 }
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
563 #endif
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
564
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
565 qc->streams.server_max_streams_bidi = qc->ctp.initial_max_streams_bidi;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
566 qc->streams.server_max_streams_uni = qc->ctp.initial_max_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
567
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
568 qc->client_tp_done = 1;
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
569 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
570
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
571 /*
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
572 * we need to fit at least 1 frame into a packet, thus account head/tail;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
573 * 17 = 1 + 8x2 is max header for CRYPTO frame, with 1 byte for frame type
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
574 */
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
575 limit = qc->ctp.max_udp_payload_size - NGX_QUIC_MAX_LONG_HEADER - 17
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
576 - EVP_GCM_TLS_TAG_LEN;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
577
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
578 fs = &qc->crypto[level];
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
579
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
580 p = (u_char *) data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
581 end = (u_char *) data + len;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
582
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
583 while (p < end) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
584
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
585 fsize = ngx_min(limit, (size_t) (end - p));
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
586
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
587 frame = ngx_quic_alloc_frame(c, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
588 if (frame == NULL) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
589 return 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
590 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
591
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
592 ngx_memcpy(frame->data, p, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
593
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
594 frame->level = level;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
595 frame->type = NGX_QUIC_FT_CRYPTO;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
596 frame->u.crypto.offset = fs->sent;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
597 frame->u.crypto.length = fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
598 frame->u.crypto.data = frame->data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
599
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
600 fs->sent += fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
601 p += fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
602
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
603 ngx_sprintf(frame->info, "crypto, generated by SSL len=%ui level=%d",
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
604 fsize, level);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
605
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
606 ngx_quic_queue_frame(qc, frame);
7652
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 7651
diff changeset
607 }
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
608
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
609 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
610 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
611
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
612
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
613 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
614 ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
615 {
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
616 #if (NGX_DEBUG)
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
617 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
618
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
619 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
620
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
621 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
622 "quic ngx_quic_flush_flight()");
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
623 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
624 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
625 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
626
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
627
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
628 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
629 ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
630 uint8_t alert)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
631 {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
632 ngx_connection_t *c;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
633 ngx_quic_connection_t *qc;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
634
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
635 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
636
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
637 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
638 "quic ngx_quic_send_alert(), lvl=%d, alert=%d",
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
639 (int) level, (int) alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
640
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
641 qc = c->quic;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
642 if (qc == NULL) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
643 return 1;
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
644 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
645
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
646 qc->error_level = level;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
647 qc->error = NGX_QUIC_ERR_CRYPTO(alert);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
648 qc->error_reason = "TLS alert";
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
649 qc->error_app = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
650 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
651
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
652 if (ngx_quic_send_cc(c) != NGX_OK) {
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
653 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
654 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
655
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
656 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
657 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
658
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
659
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
660 void
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
661 ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
662 {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
663 ngx_int_t rc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
664
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
665 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run");
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
666
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
667 rc = ngx_quic_input(c, c->buffer, conf);
8074
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
668 if (rc != NGX_OK) {
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
669 ngx_quic_close_connection(c, rc == NGX_DECLINED ? NGX_DONE : NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
670 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
671 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
672
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
673 ngx_add_timer(c->read, c->quic->in_retry ? NGX_QUIC_RETRY_TIMEOUT
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
674 : c->quic->tp.max_idle_timeout);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
675
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
676 c->read->handler = ngx_quic_input_handler;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
677
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
678 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
679 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
680
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
681
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
682 static ngx_quic_connection_t *
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
683 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: 8100
diff changeset
684 ngx_quic_header_t *pkt)
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
685 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
686 ngx_uint_t i;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
687 ngx_quic_tp_t *ctp;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
688 ngx_quic_client_id_t *cid;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
689 ngx_quic_connection_t *qc;
7864
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 7863
diff changeset
690
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
691 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
692 if (qc == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
693 return NULL;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
694 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
695
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
696 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
697 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
698
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
699 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
700 ngx_queue_init(&qc->send_ctx[i].frames);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
701 ngx_queue_init(&qc->send_ctx[i].sent);
7816
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7815
diff changeset
702 qc->send_ctx[i].largest_pn = (uint64_t) -1;
8050
6e1c88f82280 QUIC: changed ctx->largest_ack initial value to type maximum.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8027
diff changeset
703 qc->send_ctx[i].largest_ack = (uint64_t) -1;
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
704 qc->send_ctx[i].largest_range = (uint64_t) -1;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
705 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
706
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
707 qc->send_ctx[0].level = ssl_encryption_initial;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
708 qc->send_ctx[1].level = ssl_encryption_handshake;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
709 qc->send_ctx[2].level = ssl_encryption_application;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
710
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
711 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
712 ngx_queue_init(&qc->crypto[i].frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
713 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
714
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
715 ngx_queue_init(&qc->free_frames);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
716 ngx_queue_init(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
717 ngx_queue_init(&qc->free_client_ids);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
718
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
719 qc->avg_rtt = NGX_QUIC_INITIAL_RTT;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
720 qc->rttvar = NGX_QUIC_INITIAL_RTT / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
721 qc->min_rtt = NGX_TIMER_INFINITE;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
722
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
723 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
724 * qc->latest_rtt = 0
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
725 * qc->nclient_ids = 0
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
726 * qc->max_retired_seqnum = 0
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
727 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
728
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
729 qc->received = pkt->raw->last - pkt->raw->start;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
730
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
731 qc->pto.log = c->log;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
732 qc->pto.data = c;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
733 qc->pto.handler = ngx_quic_pto_handler;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
734 qc->pto.cancelable = 1;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
735
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
736 qc->push.log = c->log;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
737 qc->push.data = c;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
738 qc->push.handler = ngx_quic_push_handler;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
739 qc->push.cancelable = 1;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
740
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
741 qc->conf = conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
742 qc->tp = conf->tp;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
743
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
744 ctp = &qc->ctp;
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
745 ctp->max_udp_payload_size = ngx_quic_max_udp_payload(c);
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
746 ctp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
747 ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
748
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
749 qc->streams.recv_max_data = qc->tp.initial_max_data;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
750
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
751 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: 8013
diff changeset
752 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: 8013
diff changeset
753
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
754 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: 7908
diff changeset
755 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: 7908
diff changeset
756 14720));
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
757 qc->congestion.ssthresh = NGX_MAX_SIZE_T_VALUE;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
758 qc->congestion.recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
759
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
760 if (ngx_quic_new_dcid(c, qc, &pkt->dcid) != NGX_OK) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
761 return NULL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
762 }
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
763
7916
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
764 #if (NGX_QUIC_DRAFT_VERSION >= 28)
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
765 qc->tp.original_dcid = qc->odcid;
7916
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
766 #endif
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
767 qc->tp.initial_scid = qc->dcid;
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
768
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
769 qc->scid.len = pkt->scid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
770 qc->scid.data = ngx_pnalloc(c->pool, qc->scid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
771 if (qc->scid.data == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
772 return NULL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
773 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
774 ngx_memcpy(qc->scid.data, pkt->scid.data, qc->scid.len);
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
775
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
776 cid = ngx_quic_alloc_connection_id(c, qc);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
777 if (cid == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
778 return NULL;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
779 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
780
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
781 cid->seqnum = 0;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
782 cid->len = pkt->scid.len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
783 ngx_memcpy(cid->id, pkt->scid.data, pkt->scid.len);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
784
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
785 ngx_queue_insert_tail(&qc->client_ids, &cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
786 qc->nclient_ids++;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
787 qc->curr_seqnum = 0;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
788
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
789 return qc;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
790 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
791
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
792
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
793 static ngx_int_t
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
794 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: 8099
diff changeset
795 ngx_quic_header_t *pkt)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
796 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
797 u_char *token;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
798 size_t len, max;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
799 uint16_t rndbytes;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
800 u_char buf[NGX_QUIC_MAX_SR_PACKET];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
801
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
802 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
803 "quic handle stateless reset output");
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
804
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
805 if (conf->sr_token_key.len == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
806 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
807 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
808
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
809 if (pkt->len <= NGX_QUIC_MIN_PKT_LEN) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
810 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
811 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
812
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
813 if (pkt->len <= NGX_QUIC_MIN_SR_PACKET) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
814 len = pkt->len - 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
815
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
816 } else {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
817 max = ngx_min(NGX_QUIC_MAX_SR_PACKET, pkt->len * 3);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
818
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
819 if (RAND_bytes((u_char *) &rndbytes, sizeof(rndbytes)) != 1) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
820 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
821 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
822
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
823 len = (rndbytes % (max - NGX_QUIC_MIN_SR_PACKET + 1))
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
824 + NGX_QUIC_MIN_SR_PACKET;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
825 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
826
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
827 if (RAND_bytes(buf, len - NGX_QUIC_SR_TOKEN_LEN) != 1) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
828 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
829 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
830
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
831 buf[0] &= ~NGX_QUIC_PKT_LONG;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
832 buf[0] |= NGX_QUIC_PKT_FIXED_BIT;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
833
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
834 token = &buf[len - NGX_QUIC_SR_TOKEN_LEN];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
835
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
836 if (ngx_quic_new_sr_token(c, &pkt->dcid, &conf->sr_token_key, token)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
837 != NGX_OK)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
838 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
839 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
840 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
841
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
842 (void) c->send(c, buf, len);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
843
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
844 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
845 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
846
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
847
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
848 static ngx_int_t
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
849 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: 8099
diff changeset
850 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
851 u_char *tail, ch;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
852 ngx_uint_t i;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
853 ngx_queue_t *q;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
854 ngx_quic_client_id_t *cid;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
855 ngx_quic_connection_t *qc;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
856
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
857 qc = c->quic;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
858
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
859 /* A stateless reset uses an entire UDP datagram */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
860 if (pkt->raw->start != pkt->data) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
861 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
862 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
863
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
864 tail = pkt->raw->last - NGX_QUIC_SR_TOKEN_LEN;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
865
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
866 for (q = ngx_queue_head(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
867 q != ngx_queue_sentinel(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
868 q = ngx_queue_next(q))
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
869 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
870 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
871
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
872 if (cid->seqnum == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
873 /* no stateless reset token in initial connection id */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
874 continue;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
875 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
876
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
877 /* constant time comparison */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
878
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
879 for (ch = 0, i = 0; i < NGX_QUIC_SR_TOKEN_LEN; i++) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
880 ch |= tail[i] ^ cid->sr_token[i];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
881 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
882
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
883 if (ch == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
884 return NGX_OK;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
885 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
886 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
887
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
888 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
889 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
890
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
891
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
892 static ngx_int_t
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
893 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: 8057
diff changeset
894 {
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
895 size_t len;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
896 ngx_quic_header_t pkt;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
897
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
898 /* buffer size is calculated assuming a single supported version */
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
899 static u_char buf[NGX_QUIC_MAX_LONG_HEADER + sizeof(uint32_t)];
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
900
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
901 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
902 "sending version negotiation packet");
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
903
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
904 pkt.log = c->log;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
905 pkt.flags = NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_FIXED_BIT;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
906 pkt.dcid = inpkt->scid;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
907 pkt.scid = inpkt->dcid;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
908
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
909 len = ngx_quic_create_version_negotiation(&pkt, buf);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
910
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
911 #ifdef NGX_QUIC_DEBUG_PACKETS
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
912 ngx_quic_hexdump(c->log, "quic vnego packet to send", buf, len);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
913 #endif
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
914
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
915 (void) c->send(c, buf, len);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
916
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
917 return NGX_ERROR;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
918 }
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
919
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
920
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
921 static ngx_int_t
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
922 ngx_quic_new_dcid(ngx_connection_t *c, ngx_quic_connection_t *qc,
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
923 ngx_str_t *odcid)
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
924 {
8095
2727d402e5a5 QUIC: switched to using fixed-length server connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8094
diff changeset
925 qc->dcid.len = NGX_QUIC_SERVER_CID_LEN;
2727d402e5a5 QUIC: switched to using fixed-length server connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8094
diff changeset
926 qc->dcid.data = ngx_pnalloc(c->pool, NGX_QUIC_SERVER_CID_LEN);
7859
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
927 if (qc->dcid.data == NULL) {
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
928 return NGX_ERROR;
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
929 }
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
930
8095
2727d402e5a5 QUIC: switched to using fixed-length server connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8094
diff changeset
931 if (RAND_bytes(qc->dcid.data, NGX_QUIC_SERVER_CID_LEN) != 1) {
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
932 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
933 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
934
7859
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
935 ngx_quic_hexdump(c->log, "quic server CID", qc->dcid.data, qc->dcid.len);
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
936
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
937 qc->odcid.len = odcid->len;
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
938 qc->odcid.data = ngx_pstrdup(c->pool, odcid);
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
939 if (qc->odcid.data == NULL) {
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
940 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
941 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
942
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
943 return NGX_OK;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
944 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
945
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
946
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
947 static ngx_int_t
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
948 ngx_quic_send_retry(ngx_connection_t *c)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
949 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
950 ssize_t len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
951 ngx_str_t res, token;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
952 ngx_quic_header_t pkt;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
953 u_char buf[NGX_QUIC_RETRY_BUFFER_SIZE];
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
954
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
955 if (ngx_quic_new_token(c, &token) != NGX_OK) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
956 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
957 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
958
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
959 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
960 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_RETRY;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
961 pkt.log = c->log;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
962 pkt.odcid = c->quic->odcid;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
963 pkt.dcid = c->quic->scid;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
964 pkt.scid = c->quic->dcid;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
965 pkt.token = token;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
966
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
967 res.data = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
968
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
969 if (ngx_quic_encrypt(&pkt, NULL, &res) != NGX_OK) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
970 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
971 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
972
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
973 #ifdef NGX_QUIC_DEBUG_PACKETS
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
974 ngx_quic_hexdump(c->log, "quic packet to send", res.data, res.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
975 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
976
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
977 len = c->send(c, res.data, res.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
978 if (len == NGX_ERROR || (size_t) len != res.len) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
979 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
980 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
981
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
982 c->quic->token = token;
7916
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
983 #if (NGX_QUIC_DRAFT_VERSION < 28)
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
984 c->quic->tp.original_dcid = c->quic->odcid;
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
985 #endif
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
986 c->quic->tp.retry_scid = c->quic->dcid;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
987 c->quic->in_retry = 1;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
988
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
989 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
990 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
991
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
992
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
993 static ngx_int_t
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
994 ngx_quic_new_token(ngx_connection_t *c, ngx_str_t *token)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
995 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
996 int len, iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
997 u_char *data, *p, *key, *iv;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
998 ngx_msec_t now;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
999 EVP_CIPHER_CTX *ctx;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1000 const EVP_CIPHER *cipher;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1001 struct sockaddr_in *sin;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1002 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1003 struct sockaddr_in6 *sin6;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1004 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1005 u_char in[NGX_QUIC_MAX_TOKEN_SIZE];
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1006
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1007 switch (c->sockaddr->sa_family) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1008
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1009 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1010 case AF_INET6:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1011 sin6 = (struct sockaddr_in6 *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1012
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1013 len = sizeof(struct in6_addr);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1014 data = sin6->sin6_addr.s6_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1015
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1016 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1017 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1018
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1019 #if (NGX_HAVE_UNIX_DOMAIN)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1020 case AF_UNIX:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1021
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1022 len = ngx_min(c->addr_text.len, NGX_QUIC_MAX_TOKEN_SIZE - sizeof(now));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1023 data = c->addr_text.data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1024
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1025 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1026 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1027
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1028 default: /* AF_INET */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1029 sin = (struct sockaddr_in *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1030
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1031 len = sizeof(in_addr_t);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1032 data = (u_char *) &sin->sin_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1033
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1034 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1035 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1036
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1037 p = ngx_cpymem(in, data, len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1038
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1039 now = ngx_current_msec;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1040 len += sizeof(now);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1041 ngx_memcpy(p, &now, sizeof(now));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1042
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1043 cipher = EVP_aes_256_cbc();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1044 iv_len = EVP_CIPHER_iv_length(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1045
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1046 token->len = iv_len + len + EVP_CIPHER_block_size(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1047 token->data = ngx_pnalloc(c->pool, token->len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1048 if (token->data == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1049 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1050 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1051
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1052 ctx = EVP_CIPHER_CTX_new();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1053 if (ctx == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1054 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1055 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1056
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
1057 key = c->quic->conf->token_key;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1058 iv = token->data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1059
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1060 if (RAND_bytes(iv, iv_len) <= 0
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1061 || !EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv))
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1062 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1063 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1064 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1065 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1066
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1067 token->len = iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1068
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1069 if (EVP_EncryptUpdate(ctx, token->data + token->len, &len, in, len) != 1) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1070 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1071 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1072 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1073
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1074 token->len += len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1075
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1076 if (EVP_EncryptFinal_ex(ctx, token->data + token->len, &len) <= 0) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1077 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1078 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1079 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1080
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1081 token->len += len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1082
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1083 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1084
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1085 #ifdef NGX_QUIC_DEBUG_PACKETS
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1086 ngx_quic_hexdump(c->log, "quic new token", token->data, token->len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1087 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1088
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1089 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1090 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1091
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1092
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1093 static ngx_int_t
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1094 ngx_quic_validate_token(ngx_connection_t *c, ngx_quic_header_t *pkt)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1095 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1096 int len, tlen, iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1097 u_char *key, *iv, *p, *data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1098 ngx_msec_t msec;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1099 EVP_CIPHER_CTX *ctx;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1100 const EVP_CIPHER *cipher;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1101 struct sockaddr_in *sin;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1102 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1103 struct sockaddr_in6 *sin6;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1104 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1105 ngx_quic_connection_t *qc;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1106 u_char tdec[NGX_QUIC_MAX_TOKEN_SIZE];
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1107
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1108 qc = c->quic;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1109
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1110 /* Retry token */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1111
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1112 if (qc->token.len) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1113 if (pkt->token.len != qc->token.len) {
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1114 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1115 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1116
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1117 if (ngx_memcmp(pkt->token.data, qc->token.data, pkt->token.len) != 0) {
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1118 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1119 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1120
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1121 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1122 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1123
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1124 /* NEW_TOKEN in a previous connection */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1125
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1126 cipher = EVP_aes_256_cbc();
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
1127 key = c->quic->conf->token_key;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1128 iv = pkt->token.data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1129 iv_len = EVP_CIPHER_iv_length(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1130
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1131 /* sanity checks */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1132
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1133 if (pkt->token.len < (size_t) iv_len + EVP_CIPHER_block_size(cipher)) {
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1134 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1135 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1136
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1137 if (pkt->token.len > (size_t) iv_len + NGX_QUIC_MAX_TOKEN_SIZE) {
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1138 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1139 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1140
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1141 ctx = EVP_CIPHER_CTX_new();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1142 if (ctx == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1143 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1144 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1145
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1146 if (!EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv)) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1147 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1148 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1149 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1150
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1151 p = pkt->token.data + iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1152 len = pkt->token.len - iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1153
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1154 if (EVP_DecryptUpdate(ctx, tdec, &len, p, len) != 1) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1155 EVP_CIPHER_CTX_free(ctx);
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1156 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1157 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1158
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1159 if (EVP_DecryptFinal_ex(ctx, tdec + len, &tlen) <= 0) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1160 EVP_CIPHER_CTX_free(ctx);
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1161 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1162 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1163
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1164 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1165
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1166 switch (c->sockaddr->sa_family) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1167
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1168 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1169 case AF_INET6:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1170 sin6 = (struct sockaddr_in6 *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1171
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1172 len = sizeof(struct in6_addr);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1173 data = sin6->sin6_addr.s6_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1174
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1175 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1176 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1177
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1178 #if (NGX_HAVE_UNIX_DOMAIN)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1179 case AF_UNIX:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1180
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1181 len = ngx_min(c->addr_text.len, NGX_QUIC_MAX_TOKEN_SIZE - sizeof(msec));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1182 data = c->addr_text.data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1183
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1184 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1185 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1186
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1187 default: /* AF_INET */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1188 sin = (struct sockaddr_in *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1189
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1190 len = sizeof(in_addr_t);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1191 data = (u_char *) &sin->sin_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1192
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1193 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1194 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1195
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1196 if (ngx_memcmp(tdec, data, len) != 0) {
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1197 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1198 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1199
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1200 ngx_memcpy(&msec, tdec + len, sizeof(msec));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1201
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1202 if (ngx_current_msec - msec > NGX_QUIC_RETRY_LIFETIME) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1203 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic expired token");
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1204 return NGX_DECLINED;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1205 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1206
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1207 return NGX_OK;
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1208
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1209 bad_token:
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1210
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1211 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic invalid token");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1212
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1213 qc->error = NGX_QUIC_ERR_INVALID_TOKEN;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1214 qc->error_reason = "invalid_token";
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1215
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1216 return NGX_ERROR;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1217 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1218
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1219
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1220 static ngx_int_t
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
1221 ngx_quic_init_connection(ngx_connection_t *c)
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1222 {
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1223 u_char *p;
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1224 size_t clen;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1225 ssize_t len;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1226 ngx_ssl_conn_t *ssl_conn;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1227 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1228
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1229 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1230
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1231 if (ngx_ssl_create_connection(qc->conf->ssl, c, NGX_SSL_BUFFER) != NGX_OK) {
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1232 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1233 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1234
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1235 ssl_conn = c->ssl->connection;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1236
7698
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1237 if (SSL_set_quic_method(ssl_conn, &quic_method) == 0) {
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1238 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1239 "quic SSL_set_quic_method() failed");
7698
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1240 return NGX_ERROR;
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1241 }
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1242
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1243 #ifdef SSL_READ_EARLY_DATA_SUCCESS
8102
b52b2a33b0e5 QUIC: fixed build with OpenSSL after bed310672f39.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8101
diff changeset
1244 if (SSL_CTX_get_max_early_data(qc->conf->ssl->ctx)) {
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1245 SSL_set_quic_early_data_enabled(ssl_conn, 1);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1246 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1247 #endif
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1248
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1249 if (qc->conf->sr_token_key.len) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1250 qc->tp.sr_enabled = 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1251
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1252 if (ngx_quic_new_sr_token(c, &qc->dcid, &qc->conf->sr_token_key,
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1253 qc->tp.sr_token)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1254 != NGX_OK)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1255 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1256 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1257 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1258
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1259 ngx_quic_hexdump(c->log, "quic stateless reset token",
8103
0e12c4aca3ab QUIC: fixed clang-ast asserts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8102
diff changeset
1260 qc->tp.sr_token, (size_t) NGX_QUIC_SR_TOKEN_LEN);
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1261 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1262
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1263 len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp, &clen);
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1264 /* always succeeds */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1265
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1266 p = ngx_pnalloc(c->pool, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1267 if (p == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1268 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1269 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1270
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1271 len = ngx_quic_create_transport_params(p, p + len, &qc->tp, NULL);
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1272 if (len < 0) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1273 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1274 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1275
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1276 #ifdef NGX_QUIC_DEBUG_PACKETS
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
1277 ngx_quic_hexdump(c->log, "quic transport parameters", p, len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1278 #endif
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1279
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1280 if (SSL_set_quic_transport_params(ssl_conn, p, len) == 0) {
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1281 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1282 "quic SSL_set_quic_transport_params() failed");
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1283 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1284 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1285
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1286 #if NGX_OPENSSL_QUIC_ZRTT_CTX
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1287 if (SSL_set_quic_early_data_context(ssl_conn, p, clen) == 0) {
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1288 ngx_log_error(NGX_LOG_INFO, c->log, 0,
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1289 "quic SSL_set_quic_early_data_context() failed");
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1290 return NGX_ERROR;
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1291 }
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1292 #endif
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1293
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1294 return NGX_OK;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1295 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1296
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1297
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1298 static ngx_inline size_t
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1299 ngx_quic_max_udp_payload(ngx_connection_t *c)
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1300 {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1301 /* TODO: path MTU discovery */
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1302
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1303 #if (NGX_HAVE_INET6)
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1304 if (c->sockaddr->sa_family == AF_INET6) {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1305 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT6;
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1306 }
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1307 #endif
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1308
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1309 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT;
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1310 }
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1311
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1312
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1313 static void
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1314 ngx_quic_input_handler(ngx_event_t *rev)
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1315 {
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1316 ssize_t n;
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1317 ngx_int_t rc;
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1318 ngx_buf_t b;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1319 ngx_connection_t *c;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1320 ngx_quic_connection_t *qc;
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
1321 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1322
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1323 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: 8134
diff changeset
1324
7871
df18ae7161b8 Assorted fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7870
diff changeset
1325 ngx_memzero(&b, sizeof(ngx_buf_t));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1326 b.start = buf;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
1327 b.end = buf + sizeof(buf);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1328 b.pos = b.last = b.start;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1329 b.memory = 1;
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1330
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1331 c = rev->data;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
1332 qc = c->quic;
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1333
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1334 c->log->action = "handling quic input";
7678
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1335
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1336 if (rev->timedout) {
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1337 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1338 "quic client timed out");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1339 ngx_quic_close_connection(c, NGX_DONE);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1340 return;
7678
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1341 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1342
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1343 if (c->close) {
7937
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7934
diff changeset
1344 qc->error_reason = "graceful shutdown";
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7934
diff changeset
1345 ngx_quic_close_connection(c, NGX_OK);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1346 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1347 }
7686
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7684
diff changeset
1348
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1349 n = c->recv(c, b.start, b.end - b.start);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 7680
diff changeset
1350
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1351 if (n == NGX_AGAIN) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1352 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1353 ngx_quic_close_connection(c, NGX_OK);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1354 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1355 return;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1356 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1357
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1358 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1359 c->read->eof = 1;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1360 ngx_quic_close_connection(c, NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1361 return;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1362 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1363
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1364 b.last += n;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1365 qc->received += n;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1366
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1367 rc = ngx_quic_input(c, &b, NULL);
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1368
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1369 if (rc == NGX_ERROR) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1370 ngx_quic_close_connection(c, NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1371 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1372 }
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1373
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1374 if (rc == NGX_DECLINED) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1375 return;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1376 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1377
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1378 /* rc == NGX_OK */
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1379
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1380 qc->send_timer_set = 0;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1381 ngx_add_timer(rev, qc->tp.max_idle_timeout);
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1382 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1383
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1384
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1385 static void
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1386 ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc)
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1387 {
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1388 ngx_pool_t *pool;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
1389
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1390 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1391 "quic ngx_quic_close_connection, rc: %i", rc);
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1392
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1393 if (!c->quic) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1394 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1395 "quic close connection early error");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1396
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1397 } else if (ngx_quic_close_quic(c, rc) == NGX_AGAIN) {
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1398 return;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
1399 }
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1400
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1401 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1402 (void) ngx_ssl_shutdown(c);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1403 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1404
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1405 if (c->read->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1406 ngx_del_timer(c->read);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1407 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1408
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1409 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1410 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1411 #endif
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1412
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1413 c->destroyed = 1;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1414
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1415 pool = c->pool;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1416
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1417 ngx_close_connection(c);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1418
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1419 ngx_destroy_pool(pool);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1420 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1421
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1422
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1423 static ngx_int_t
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1424 ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc)
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1425 {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1426 ngx_uint_t i;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1427 ngx_quic_send_ctx_t *ctx;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1428 ngx_quic_connection_t *qc;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1429
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1430 qc = c->quic;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1431
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1432 if (!qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1433
7875
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1434 /* drop packets from retransmit queues, no ack is expected */
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1435 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1436 ctx = ngx_quic_get_send_ctx(qc, i);
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1437 ngx_quic_free_frames(c, &ctx->sent);
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1438 }
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1439
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1440 if (rc == NGX_DONE) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1441
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1442 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1443 * 10.2. Idle Timeout
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1444 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1445 * If the idle timeout is enabled by either peer, a connection is
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1446 * silently closed and its state is discarded when it remains idle
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1447 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1448
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1449 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1450 "quic closing %s connection",
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1451 qc->draining ? "drained" : "idle");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1452
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1453 } else {
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1454
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1455 /*
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1456 * 10.3. Immediate Close
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1457 *
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1458 * An endpoint sends a CONNECTION_CLOSE frame (Section 19.19)
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1459 * to terminate the connection immediately.
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1460 */
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1461
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1462 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: 7992
diff changeset
1463 : ssl_encryption_initial;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1464
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1465 if (rc == NGX_OK) {
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1466 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1467 "quic immediate close, drain = %d",
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1468 qc->draining);
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1469
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1470 qc->close.log = c->log;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1471 qc->close.data = c;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1472 qc->close.handler = ngx_quic_close_timer_handler;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1473 qc->close.cancelable = 1;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1474
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1475 ctx = ngx_quic_get_send_ctx(qc, qc->error_level);
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1476
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1477 ngx_add_timer(&qc->close, 3 * ngx_quic_pto(c, ctx));
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1478
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1479 qc->error = NGX_QUIC_ERR_NO_ERROR;
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1480
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1481 } else {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1482 if (qc->error == 0 && !qc->error_app) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1483 qc->error = NGX_QUIC_ERR_INTERNAL_ERROR;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1484 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1485
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1486 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1487 "quic immediate close due to %serror: %ui %s",
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1488 qc->error_app ? "app " : "", qc->error,
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1489 qc->error_reason ? qc->error_reason : "");
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1490 }
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1491
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1492 (void) ngx_quic_send_cc(c);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1493
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1494 if (qc->error_level == ssl_encryption_handshake) {
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1495 /* for clients that might not have handshake keys */
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1496 qc->error_level = ssl_encryption_initial;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1497 (void) ngx_quic_send_cc(c);
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1498 }
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1499 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1500
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1501 qc->closing = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1502 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1503
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1504 if (rc == NGX_ERROR && qc->close.timer_set) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1505 /* do not wait for timer in case of fatal error */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1506 ngx_del_timer(&qc->close);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1507 }
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1508
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1509 if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1510 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1511 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1512
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1513 if (qc->push.timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1514 ngx_del_timer(&qc->push);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1515 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1516
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1517 if (qc->pto.timer_set) {
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1518 ngx_del_timer(&qc->pto);
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1519 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1520
7929
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1521 if (qc->push.posted) {
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1522 ngx_delete_posted_event(&qc->push);
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1523 }
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1524
8091
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1525 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1526 ngx_quic_free_frames(c, &qc->crypto[i].frames);
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1527 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1528
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1529 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1530 ngx_quic_free_frames(c, &qc->send_ctx[i].frames);
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1531 ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1532 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1533
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1534 if (qc->close.timer_set) {
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1535 return NGX_AGAIN;
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1536 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1537
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1538 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1539 "quic part of connection is terminated");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1540
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1541 /* may be tested from SSL callback during SSL shutdown */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1542 c->quic = NULL;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1543
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1544 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1545 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1546
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1547
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1548 void
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1549 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: 7945
diff changeset
1550 const char *reason)
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1551 {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1552 ngx_quic_connection_t *qc;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1553
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1554 qc = c->quic;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1555 qc->error = err;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1556 qc->error_reason = reason;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1557 qc->error_app = 1;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1558 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1559
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1560 ngx_quic_close_connection(c, NGX_ERROR);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1561 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1562
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1563
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1564 static void
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1565 ngx_quic_close_timer_handler(ngx_event_t *ev)
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1566 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1567 ngx_connection_t *c;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1568
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1569 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic close timer");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1570
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1571 c = ev->data;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1572 ngx_quic_close_connection(c, NGX_DONE);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1573 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1574
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1575
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1576 static ngx_int_t
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1577 ngx_quic_close_streams(ngx_connection_t *c, ngx_quic_connection_t *qc)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1578 {
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1579 ngx_event_t *rev, *wev;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1580 ngx_rbtree_t *tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1581 ngx_rbtree_node_t *node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1582 ngx_quic_stream_t *qs;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1583
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1584 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1585 ngx_uint_t ns;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1586 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1587
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1588 tree = &qc->streams.tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1589
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1590 if (tree->root == tree->sentinel) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1591 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1592 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1593
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1594 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1595 ns = 0;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1596 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1597
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1598 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1599 node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1600 node = ngx_rbtree_next(tree, node))
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1601 {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1602 qs = (ngx_quic_stream_t *) node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1603
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1604 rev = qs->c->read;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1605 rev->error = 1;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1606 rev->ready = 1;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1607
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1608 wev = qs->c->write;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1609 wev->error = 1;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1610 wev->ready = 1;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1611
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1612 ngx_post_event(rev, &ngx_posted_events);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1613
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1614 if (rev->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1615 ngx_del_timer(rev);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1616 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1617
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1618 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1619 ns++;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1620 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1621 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1622
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1623 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1624 "quic connection has %ui active streams", ns);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1625
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1626 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1627 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1628
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1629
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1630 static ngx_int_t
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1631 ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf)
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1632 {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1633 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1634 ngx_int_t rc;
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1635 ngx_uint_t good;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1636 ngx_quic_header_t pkt;
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1637
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1638 good = 0;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1639
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1640 p = b->pos;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1641
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1642 while (p < b->last) {
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1643
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1644 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1645 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1646 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1647 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1648 pkt.log = c->log;
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
1649 pkt.flags = p[0];
8097
a89a58c642ef QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents: 8096
diff changeset
1650 pkt.raw->pos++;
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1651
8142
d564e8850975 QUIC: reset error and error_reason prior to processing packet.
Vladimir Homutov <vl@nginx.com>
parents: 8140
diff changeset
1652 if (c->quic) {
d564e8850975 QUIC: reset error and error_reason prior to processing packet.
Vladimir Homutov <vl@nginx.com>
parents: 8140
diff changeset
1653 c->quic->error = 0;
d564e8850975 QUIC: reset error and error_reason prior to processing packet.
Vladimir Homutov <vl@nginx.com>
parents: 8140
diff changeset
1654 c->quic->error_reason = 0;
d564e8850975 QUIC: reset error and error_reason prior to processing packet.
Vladimir Homutov <vl@nginx.com>
parents: 8140
diff changeset
1655 }
d564e8850975 QUIC: reset error and error_reason prior to processing packet.
Vladimir Homutov <vl@nginx.com>
parents: 8140
diff changeset
1656
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1657 rc = ngx_quic_process_packet(c, conf, &pkt);
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1658
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1659 #if (NGX_DEBUG)
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1660 if (pkt.parsed) {
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1661 ngx_quic_connection_t *qc;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1662
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1663 qc = c->quic;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1664
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1665 ngx_log_debug8(NGX_LOG_DEBUG_EVENT, c->log, 0,
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1666 "quic pkt done %s decr:%d pn:%L pe:%ui rc:%i"
8140
ec04dbb77fb7 QUIC: fixed format specifier in debug message.
Vladimir Homutov <vl@nginx.com>
parents: 8139
diff changeset
1667 " closing:%d err:%ui %s",
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1668 ngx_quic_level_name(pkt.level), pkt.decrypted,
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1669 pkt.pn, pkt.error, rc, (qc && qc->closing) ? 1 : 0,
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1670 qc ? qc->error : 0,
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1671 (qc && qc->error_reason) ? qc->error_reason : "");
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1672 } else {
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1673 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1674 "quic pkt done parse failed rc:%i", rc);
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1675 }
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1676 #endif
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1677
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1678 if (rc == NGX_ERROR) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1679 return NGX_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1680 }
7672
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 7671
diff changeset
1681
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1682 if (rc == NGX_OK) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1683 good = 1;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1684 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1685
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1686 /* NGX_OK || NGX_DECLINED */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1687
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1688 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1689 * we get NGX_DECLINED when there are no keys [yet] available
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1690 * to decrypt packet.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1691 * Instead of queueing it, we ignore it and rely on the sender's
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1692 * retransmission:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1693 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1694 * 12.2. Coalescing Packets:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1695 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1696 * For example, if decryption fails (because the keys are
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1697 * not available or any other reason), the receiver MAY either
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1698 * discard or buffer the packet for later processing and MUST
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1699 * attempt to process the remaining packets.
8073
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
1700 *
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
1701 * We also skip packets that don't match connection state
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
1702 * or cannot be parsed properly.
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1703 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1704
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1705 /* b->pos is at header end, adjust by actual packet length */
8096
0f37b4ef3cd9 QUIC: keep the entire packet size in pkt->len.
Roman Arutyunyan <arut@nginx.com>
parents: 8095
diff changeset
1706 b->pos = pkt.data + pkt.len;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1707
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1708 /* firefox workaround: skip zero padding at the end of quic packet */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1709 while (b->pos < b->last && *(b->pos) == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1710 b->pos++;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1711 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1712
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1713 p = b->pos;
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1714 }
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1715
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1716 return good ? NGX_OK : NGX_DECLINED;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1717 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1718
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1719
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1720 static ngx_int_t
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1721 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: 8100
diff changeset
1722 ngx_quic_header_t *pkt)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1723 {
8074
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1724 ngx_int_t rc;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1725 ngx_ssl_conn_t *ssl_conn;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1726 ngx_quic_secrets_t *keys, *next, tmp;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1727 ngx_quic_send_ctx_t *ctx;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1728 ngx_quic_connection_t *qc;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1729
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
1730 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1731
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1732 c->log->action = "parsing quic packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1733
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1734 rc = ngx_quic_parse_packet(pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1735
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1736 if (rc == NGX_DECLINED || rc == NGX_ERROR) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1737 return rc;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1738 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1739
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1740 pkt->parsed = 1;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1741
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1742 c->log->action = "processing quic packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1743
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1744 qc = c->quic;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1745
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1746 #if (NGX_DEBUG)
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1747 ngx_quic_hexdump(c->log, "quic pkt dcid", pkt->dcid.data, pkt->dcid.len);
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1748
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1749 if (pkt->level != ssl_encryption_application) {
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1750 ngx_quic_hexdump(c->log, "quic pkt scid", pkt->scid.data,
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1751 pkt->scid.len);
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1752 }
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1753 #endif
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
1754
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1755 if (qc) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1756
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1757 if (rc == NGX_ABORT) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1758 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1759 "quic unsupported version: 0x%xD", pkt->version);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1760 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1761 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1762
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1763 if (ngx_quic_check_peer(qc, pkt) != NGX_OK) {
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1764
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1765 if (pkt->level == ssl_encryption_application) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1766 if (ngx_quic_process_stateless_reset(c, pkt) == NGX_OK) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1767 ngx_log_error(NGX_LOG_INFO, c->log, 0,
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1768 "quic stateless reset packet detected");
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1769
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1770 qc->draining = 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1771 ngx_quic_close_connection(c, NGX_OK);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1772
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1773 return NGX_OK;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1774 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1775
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1776 return ngx_quic_send_stateless_reset(c, qc->conf, pkt);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1777 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1778
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1779 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1780 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1781
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1782 if (qc->in_retry) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1783
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1784 c->log->action = "retrying quic connection";
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1785
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1786 if (pkt->level != ssl_encryption_initial) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1787 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1788 "quic discard late retry packet");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1789 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1790 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1791
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1792 if (!pkt->token.len) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1793 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1794 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1795
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1796 if (ngx_quic_new_dcid(c, qc, &pkt->dcid) != NGX_OK) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1797 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1798 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1799
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1800 qc->tp.initial_scid = qc->dcid;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1801 qc->in_retry = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1802
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1803 if (ngx_quic_init_secrets(c) != NGX_OK) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1804 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1805 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1806
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1807 if (ngx_quic_validate_token(c, pkt) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1808 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1809 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1810
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1811 qc->validated = 1;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1812 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1813
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1814 } else {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1815
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1816 if (rc == NGX_ABORT) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1817 return ngx_quic_negotiate_version(c, pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1818 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1819
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1820 if (pkt->level == ssl_encryption_initial) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1821
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1822 c->log->action = "creating quic connection";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1823
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1824 if (pkt->dcid.len < NGX_QUIC_CID_LEN_MIN) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1825 /* 7.2. Negotiating Connection IDs */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1826 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1827 "quic too short dcid in initial"
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1828 " packet: length %i", pkt->dcid.len);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1829 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1830 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1831
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1832 qc = ngx_quic_new_connection(c, conf, pkt);
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1833 if (qc == NULL) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1834 return NGX_ERROR;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1835 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1836
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1837 c->quic = qc;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1838
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1839 if (ngx_terminate || ngx_exiting) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1840 qc->error = NGX_QUIC_ERR_CONNECTION_REFUSED;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1841 return NGX_ERROR;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1842 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1843
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1844 if (pkt->token.len) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1845 if (ngx_quic_validate_token(c, pkt) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1846 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1847 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1848
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1849 } else if (conf->retry) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1850 return ngx_quic_send_retry(c);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1851 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1852
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1853 if (ngx_quic_init_secrets(c) != NGX_OK) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1854 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1855 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1856
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1857 } else if (pkt->level == ssl_encryption_application) {
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1858 return ngx_quic_send_stateless_reset(c, conf, pkt);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1859
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1860 } else {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1861 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1862 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1863 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1864
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1865 c->log->action = "decrypting packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1866
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1867 keys = &qc->keys[pkt->level];
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1868
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1869 if (keys->client.key.len == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1870 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1871 "quic no level %d keys yet, ignoring packet", pkt->level);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1872 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1873 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1874
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1875 next = &qc->next_key;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1876
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1877 pkt->secret = &keys->client;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1878 pkt->next = &next->client;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1879 pkt->key_phase = qc->key_phase;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1880 pkt->plaintext = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1881
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1882 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1883
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1884 ssl_conn = c->ssl ? c->ssl->connection : NULL;
8074
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1885
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1886 rc = ngx_quic_decrypt(pkt, ssl_conn, &ctx->largest_pn);
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1887 if (rc != NGX_OK) {
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1888 qc->error = pkt->error;
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1889 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: 8073
diff changeset
1890 return rc;
7689
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1891 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1892
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1893 pkt->decrypted = 1;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
1894
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1895 if (c->ssl == NULL) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1896 if (ngx_quic_init_connection(c) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1897 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1898 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1899 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1900
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1901 if (pkt->level == ssl_encryption_handshake) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1902 /*
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1903 * 4.10.1. The successful use of Handshake packets indicates
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1904 * that no more Initial packets need to be exchanged
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1905 */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1906 ngx_quic_discard_ctx(c, ssl_encryption_initial);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1907 qc->validated = 1;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1908 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1909
8133
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
1910 if (pkt->level == ssl_encryption_early_data
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
1911 || pkt->level == ssl_encryption_application)
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
1912 {
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
1913 ngx_gettimeofday(&pkt->received);
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
1914 }
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
1915
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1916 c->log->action = "handling payload";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1917
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1918 if (pkt->level != ssl_encryption_application) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1919 return ngx_quic_payload_handler(c, pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1920 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1921
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1922 /* switch keys on Key Phase change */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1923
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1924 if (pkt->key_update) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1925 qc->key_phase ^= 1;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1926
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1927 tmp = *keys;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1928 *keys = *next;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1929 *next = tmp;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1930 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1931
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1932 rc = ngx_quic_payload_handler(c, pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1933 if (rc != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1934 return rc;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1935 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1936
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1937 /* generate next keys */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1938
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1939 if (pkt->key_update) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1940 if (ngx_quic_key_update(c, keys, next) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1941 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1942 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1943 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1944
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1945 return NGX_OK;
7689
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1946 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1947
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1948
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1949 static ngx_int_t
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1950 ngx_quic_init_secrets(ngx_connection_t *c)
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1951 {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1952 ngx_quic_secrets_t *keys;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1953 ngx_quic_connection_t *qc;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1954
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1955 qc =c->quic;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1956 keys = &qc->keys[ssl_encryption_initial];
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1957
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1958 if (ngx_quic_set_initial_secret(c->pool, &keys->client, &keys->server,
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1959 &qc->odcid)
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1960 != NGX_OK)
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1961 {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1962 return NGX_ERROR;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1963 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1964
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1965 qc->initialized = 1;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1966
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1967 return NGX_OK;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1968 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1969
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1970
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1971 static void
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1972 ngx_quic_discard_ctx(ngx_connection_t *c, enum ssl_encryption_level_t level)
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1973 {
8025
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1974 ngx_queue_t *q;
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1975 ngx_quic_frame_t *f;
7816
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7815
diff changeset
1976 ngx_quic_send_ctx_t *ctx;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1977 ngx_quic_connection_t *qc;
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1978
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1979 qc = c->quic;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1980
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1981 if (qc->keys[level].client.key.len == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1982 return;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1983 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1984
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1985 qc->keys[level].client.key.len = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1986 qc->pto_count = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1987
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1988 ctx = ngx_quic_get_send_ctx(qc, level);
8025
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1989
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1990 while (!ngx_queue_empty(&ctx->sent)) {
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1991 q = ngx_queue_head(&ctx->sent);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1992 ngx_queue_remove(q);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1993
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1994 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: 8024
diff changeset
1995 ngx_quic_congestion_ack(c, f);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1996 ngx_quic_free_frame(c, f);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1997 }
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
1998
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
1999 ctx->send_ack = 0;
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2000 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2001
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2002
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2003 static ngx_int_t
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2004 ngx_quic_check_peer(ngx_quic_connection_t *qc, ngx_quic_header_t *pkt)
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2005 {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2006 ngx_str_t *dcid;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2007 ngx_queue_t *q;
8084
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2008 ngx_quic_send_ctx_t *ctx;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2009 ngx_quic_client_id_t *cid;
7858
6e100d8c138a Preserve original DCID and unbreak parsing 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7857
diff changeset
2010
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2011 dcid = (pkt->level == ssl_encryption_early_data) ? &qc->odcid : &qc->dcid;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2012
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2013 if (pkt->dcid.len == dcid->len
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2014 && ngx_memcmp(pkt->dcid.data, dcid->data, dcid->len) == 0)
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2015 {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2016 if (pkt->level == ssl_encryption_application) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2017 return NGX_OK;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2018 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2019
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2020 goto found;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2021 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2022
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2023 /*
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2024 * a packet sent in response to an initial client packet might be lost,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2025 * thus check also for old dcid
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2026 */
8084
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2027 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial);
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2028
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2029 if (pkt->level == ssl_encryption_initial
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2030 && ctx->largest_ack == (uint64_t) -1)
8084
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2031 {
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2032 if (pkt->dcid.len == qc->odcid.len
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2033 && ngx_memcmp(pkt->dcid.data, qc->odcid.data, qc->odcid.len) == 0)
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2034 {
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2035 goto found;
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2036 }
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2037 }
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2038
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2039 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic dcid");
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2040 return NGX_ERROR;
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2041
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
2042 found:
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2043
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2044 for (q = ngx_queue_head(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2045 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2046 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2047 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2048 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: 8074
diff changeset
2049
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2050 if (pkt->scid.len == cid->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2051 && ngx_memcmp(pkt->scid.data, cid->id, cid->len) == 0)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2052 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2053 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2054 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2055 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2056
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2057 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic scid");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2058 return NGX_ERROR;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2059 }
7637
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2060
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2061
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2062 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2063 ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2064 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2065 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2066 ssize_t len;
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2067 ngx_uint_t ack_sent, do_close;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2068 ngx_quic_frame_t frame;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2069 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2070
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2071 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2072
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2073 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2074 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2075 * 10.1 Closing and Draining Connection States
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2076 * ... delayed or reordered packets are properly discarded.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2077 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2078 * An endpoint retains only enough information to generate
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2079 * a packet containing a CONNECTION_CLOSE frame and to identify
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2080 * packets as belonging to the connection.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2081 */
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2082
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2083 qc->error_level = pkt->level;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2084 qc->error = NGX_QUIC_ERR_NO_ERROR;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2085 qc->error_reason = "connection is closing, packet discarded";
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2086 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2087 qc->error_app = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2088
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2089 return ngx_quic_send_cc(c);
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2090 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2091
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2092 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2093 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2094
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2095 ack_sent = 0;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2096 do_close = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2097
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2098 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2099
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2100 c->log->action = "parsing frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2101
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7705
diff changeset
2102 len = ngx_quic_parse_frame(pkt, p, end, &frame);
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
2103
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2104 if (len < 0) {
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2105 qc->error = pkt->error;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2106 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2107 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2108
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2109 c->log->action = "handling frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2110
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2111 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2112
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2113 switch (frame.type) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2114
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2115 case NGX_QUIC_FT_ACK:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2116 if (ngx_quic_handle_ack_frame(c, pkt, &frame.u.ack) != NGX_OK) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2117 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2118 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2119
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2120 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2121
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2122 case NGX_QUIC_FT_PADDING:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2123 /* no action required */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2124 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2125
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2126 case NGX_QUIC_FT_CONNECTION_CLOSE:
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2127 case NGX_QUIC_FT_CONNECTION_CLOSE_APP:
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2128 do_close = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2129 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2130 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2131
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2132 /* got there with ack-eliciting packet */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2133
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2134 if (!ack_sent) {
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2135 if (ngx_quic_ack_packet(c, pkt) != NGX_OK) {
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2136 return NGX_ERROR;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2137 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2138
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2139 ack_sent = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2140 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2141
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2142 switch (frame.type) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2143
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2144 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2145
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2146 if (ngx_quic_handle_crypto_frame(c, pkt, &frame) != NGX_OK) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2147 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2148 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2149
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2150 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2151
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2152 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2153 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2154
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2155 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2156 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2157 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2158 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2159 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2160 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2161 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2162 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2163
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2164 if (ngx_quic_handle_stream_frame(c, pkt, &frame) != NGX_OK) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2165 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2166 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2167
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2168 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2169
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2170 case NGX_QUIC_FT_MAX_DATA:
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2171
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2172 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: 7841
diff changeset
2173 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2174 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2175 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2176
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2177 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2178
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2179 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2180 case NGX_QUIC_FT_STREAMS_BLOCKED2:
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2181
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2182 if (ngx_quic_handle_streams_blocked_frame(c, pkt,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2183 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2184 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2185 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2186 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2187 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2188
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2189 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2190
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2191 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2192
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2193 if (ngx_quic_handle_stream_data_blocked_frame(c, pkt,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2194 &frame.u.stream_data_blocked)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2195 != NGX_OK)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2196 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2197 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2198 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2199
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2200 break;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2201
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2202 case NGX_QUIC_FT_MAX_STREAM_DATA:
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2203
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2204 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: 7841
diff changeset
2205 &frame.u.max_stream_data)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2206 != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2207 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2208 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2209 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2210
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2211 break;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2212
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2213 case NGX_QUIC_FT_RESET_STREAM:
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2214
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2215 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: 7922
diff changeset
2216 &frame.u.reset_stream)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2217 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2218 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2219 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2220 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2221
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2222 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2223
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2224 case NGX_QUIC_FT_STOP_SENDING:
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2225
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2226 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: 7922
diff changeset
2227 &frame.u.stop_sending)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2228 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2229 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2230 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2231 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2232
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2233 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2234
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2235 case NGX_QUIC_FT_MAX_STREAMS:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2236 case NGX_QUIC_FT_MAX_STREAMS2:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2237
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2238 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: 8004
diff changeset
2239 != NGX_OK)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2240 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2241 return NGX_ERROR;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2242 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2243
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2244 break;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2245
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2246 case NGX_QUIC_FT_PATH_CHALLENGE:
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2247
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2248 if (ngx_quic_handle_path_challenge_frame(c, pkt,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2249 &frame.u.path_challenge)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2250 != NGX_OK)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2251 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2252 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2253 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2254
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2255 break;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2256
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2257 case NGX_QUIC_FT_NEW_CONNECTION_ID:
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2258
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2259 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: 8074
diff changeset
2260 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2261 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2262 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2263 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2264
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2265 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2266
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2267 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2268 case NGX_QUIC_FT_PATH_RESPONSE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2269
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2270 /* TODO: handle */
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2271 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2272 "quic frame handler not implemented");
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2273 break;
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2274
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2275 default:
7823
4e4485793418 Added MAX_STREAM_DATA stub handler.
Vladimir Homutov <vl@nginx.com>
parents: 7822
diff changeset
2276 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2277 "quic missing frame handler");
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2278 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2279 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2280 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2281
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2282 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2283 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2284 "quic trailing garbage in payload: %ui bytes", end - p);
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2285
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2286 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2287 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2288 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2289
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2290 if (do_close) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2291 qc->draining = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2292 ngx_quic_close_connection(c, NGX_OK);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2293 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2294
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2295 return NGX_OK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2296 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2297
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2298
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2299 static ngx_int_t
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2300 ngx_quic_ack_packet(ngx_connection_t *c, ngx_quic_header_t *pkt)
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2301 {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2302 uint64_t base, largest, smallest, gs, ge, gap, range, pn;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2303 ngx_uint_t i, j, nr;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2304 ngx_quic_send_ctx_t *ctx;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2305 ngx_quic_ack_range_t *r;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2306
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2307 c->log->action = "preparing ack";
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2308
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2309 ctx = ngx_quic_get_send_ctx(c->quic, pkt->level);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2310
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2311 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2312 "ngx_quic_ack_packet pn %uL largest %uL nranges %ui",
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2313 pkt->pn, ctx->largest_range, ctx->nranges);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2314
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2315 if (!ctx->send_ack) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2316 ngx_post_event(&c->quic->push, &ngx_posted_events);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2317 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2318
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2319 ctx->send_ack = 1;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2320
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2321 base = ctx->largest_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2322 pn = pkt->pn;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2323
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2324 if (base == (uint64_t) -1) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2325 ctx->largest_range = pn;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2326 ctx->ack_received = pkt->received;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2327 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2328 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2329
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2330 if (base == pn) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2331 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2332 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2333
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2334 largest = base;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2335 smallest = largest - ctx->first_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2336
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2337 if (pn > base) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2338 ctx->largest_range = pn;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2339 ctx->ack_received = pkt->received;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2340
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2341 if (pn - base == 1) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2342 ctx->first_range++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2343 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2344
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2345 } else {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2346 /* new gap in front of current largest */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2347 gap = pn - base - 2;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2348 range = ctx->first_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2349
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2350 ctx->first_range = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2351 i = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2352
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2353 goto insert;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2354 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2355 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2356
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2357 /* pn < base, perform lookup in existing ranges */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2358
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2359 if (pn >= smallest && pn <= largest) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2360 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2361 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2362
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2363 #if (NGX_SUPPRESS_WARN)
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2364 r = NULL;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2365 #endif
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2366
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2367 for (i = 0; i < ctx->nranges; i++) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2368 r = &ctx->ranges[i];
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2369
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2370 ge = smallest - 1;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2371 gs = ge - r->gap;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2372
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2373 if (pn >= gs && pn <= ge) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2374
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2375 if (gs == ge) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2376 /* gap size is exactly one packet, now filled */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2377
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2378 /* data moves to previous range, current is removed */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2379
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2380 if (i == 0) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2381 ctx->first_range += r->range + 2;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2382
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2383 } else {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2384 ctx->ranges[i - 1].range += r->range + 2;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2385 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2386
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2387 nr = ctx->nranges - i - 1;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2388 if (nr) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2389 ngx_memmove(&ctx->ranges[i], &ctx->ranges[i + 1],
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2390 sizeof(ngx_quic_ack_range_t) * nr);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2391 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2392
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2393 ctx->nranges--;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2394
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2395 } else if (pn == gs) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2396 /* current gap shrinks from tail (current range grows) */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2397 r->gap--;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2398 r->range++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2399
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2400 } else if (pn == ge) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2401 /* current gap shrinks from head (previous range grows) */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2402 r->gap--;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2403
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2404 if (i == 0) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2405 ctx->first_range++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2406
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2407 } else {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2408 ctx->ranges[i - 1].range++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2409 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2410
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2411 } else {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2412 /* current gap is split into two parts */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2413
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2414 r->gap = pn - gs - 1;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2415 gap = ge - pn - 1;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2416 range = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2417
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2418 goto insert;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2419 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2420
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2421 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2422 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2423
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2424 largest = smallest - r->gap - 2;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2425 smallest = largest - r->range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2426
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2427 if (pn >= smallest && pn <= largest) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2428 /* this packet number is already known */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2429 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2430 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2431
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2432 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2433
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2434 if (pn == smallest - 1) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2435 /* extend first or last range */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2436
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2437 if (i == 0) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2438 ctx->first_range++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2439
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2440 } else {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2441 r->range++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2442 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2443
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2444 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2445 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2446
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2447 /* nothing found, add new range at the tail */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2448
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2449 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2450 /* packet is too old to keep it */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2451 return ngx_quic_send_ack_range(c, ctx, pn, pn);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2452 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2453
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2454 gap = smallest - 2 - pn;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2455 range = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2456
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2457 insert:
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2458
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2459 nr = ctx->nranges - i;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2460
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2461 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2462 /* last range is dropped and reused for newer data */
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2463
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2464 for (j = i; j < ctx->nranges; j++) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2465 largest = smallest - ctx->ranges[j].gap - 2;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2466 smallest = largest - ctx->ranges[j].range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2467 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2468
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2469 if (ngx_quic_send_ack_range(c, ctx, smallest, largest) != NGX_OK) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2470 return NGX_ERROR;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2471 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2472
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2473 nr--;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2474
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2475 } else {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2476 ctx->nranges++;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2477 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2478
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2479 ngx_memmove(&ctx->ranges[i + 1], &ctx->ranges[i],
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2480 sizeof(ngx_quic_ack_range_t) * nr);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2481
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2482 ctx->ranges[i].gap = gap;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2483 ctx->ranges[i].range = range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2484
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2485 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2486 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2487
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2488
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2489 static ngx_int_t
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2490 ngx_quic_send_ack_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2491 uint64_t smallest, uint64_t largest)
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2492 {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2493 ngx_quic_frame_t *frame;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2494
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2495 frame = ngx_quic_alloc_frame(c, 0);
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2496 if (frame == NULL) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2497 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2498 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2499
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2500 frame->level = ctx->level;
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2501 frame->type = NGX_QUIC_FT_ACK;
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2502 frame->u.ack.largest = largest;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2503 frame->u.ack.delay = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2504 frame->u.ack.range_count = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2505 frame->u.ack.first_range = largest - smallest;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2506
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2507 ngx_sprintf(frame->info, "ACK for PN=%uL..%uL 0 ranges level=%d",
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2508 largest, smallest, frame->level);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2509
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2510 return NGX_OK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2511 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2512
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2513
8147
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2514 static void
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2515 ngx_quic_drop_ack_ranges(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2516 uint64_t pn)
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2517 {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2518 uint64_t base;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2519 ngx_uint_t i, smallest, largest;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2520 ngx_quic_ack_range_t *r;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2521
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2522 base = ctx->largest_range;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2523
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2524 if (base == (uint64_t) -1) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2525 return;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2526 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2527
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2528 largest = base;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2529 smallest = largest - ctx->first_range;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2530
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2531 if (pn >= largest) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2532 ctx->largest_range = (uint64_t) - 1;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2533 ctx->first_range = 0;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2534 ctx->nranges = 0;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2535 return;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2536 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2537
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2538 if (pn >= smallest) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2539 ctx->first_range = largest - pn - 1;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2540 ctx->nranges = 0;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2541 return;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2542 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2543
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2544 for (i = 0; i < ctx->nranges; i++) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2545 r = &ctx->ranges[i];
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2546 largest = smallest - r->gap - 2;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2547 smallest = largest - r->range;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2548 if (pn >= largest) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2549 ctx->nranges = i;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2550 return;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2551 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2552 if (pn >= smallest) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2553 r->range = largest - pn - 1;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2554 ctx->nranges = i + 1;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2555 return;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2556 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2557 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2558 }
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2559
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2560
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2561 static ngx_int_t
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2562 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2563 {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2564 size_t ranges_len;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2565 ngx_quic_frame_t *frame;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2566
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2567 ranges_len = sizeof(ngx_quic_ack_range_t) * ctx->nranges;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2568
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2569 frame = ngx_quic_alloc_frame(c, ranges_len);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2570 if (frame == NULL) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2571 return NGX_ERROR;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2572 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2573
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2574 ngx_memcpy(frame->data, ctx->ranges, ranges_len);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2575
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2576 frame->level = ctx->level;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2577 frame->type = NGX_QUIC_FT_ACK;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2578 frame->u.ack.largest = ctx->largest_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2579 frame->u.ack.delay = ngx_quic_ack_delay(c, &ctx->ack_received, ctx->level);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2580 frame->u.ack.range_count = ctx->nranges;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2581 frame->u.ack.first_range = ctx->first_range;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2582 frame->u.ack.ranges_start = frame->data;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2583 frame->u.ack.ranges_end = frame->data + ranges_len;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2584
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2585 ngx_sprintf(frame->info, "ACK for PN=%uL %ui ranges level=%d",
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2586 ctx->largest_range, ctx->nranges, frame->level);
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2587
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2588 ngx_quic_queue_frame(c->quic, frame);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2589
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2590 ctx->send_ack = 0;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
2591
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
2592 return NGX_OK;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2593 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2594
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2595
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2596 static ngx_int_t
7988
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2597 ngx_quic_ack_delay(ngx_connection_t *c, struct timeval *received,
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2598 enum ssl_encryption_level_t level)
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2599 {
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2600 ngx_int_t ack_delay;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2601 struct timeval tv;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2602
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2603 ack_delay = 0;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2604
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2605 if (level == ssl_encryption_application) {
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2606 ngx_gettimeofday(&tv);
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2607 ack_delay = (tv.tv_sec - received->tv_sec) * 1000000
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2608 + tv.tv_usec - received->tv_usec;
8105
4983357258d7 QUIC: a bandaid for calculating ack_delay with non-monotonic time.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8104
diff changeset
2609 ack_delay = ngx_max(ack_delay, 0);
7988
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2610 ack_delay >>= c->quic->ctp.ack_delay_exponent;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2611 }
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2612
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2613 return ack_delay;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2614 }
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2615
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2616
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2617 static ngx_int_t
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2618 ngx_quic_send_cc(ngx_connection_t *c)
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2619 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2620 ngx_quic_frame_t *frame;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2621 ngx_quic_connection_t *qc;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2622
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2623 qc = c->quic;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2624
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2625 if (qc->draining) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2626 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2627 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2628
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2629 if (!qc->initialized) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2630 /* try to initialize secrets to send an early error */
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2631 if (ngx_quic_init_secrets(c) != NGX_OK) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2632 return NGX_OK;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2633 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2634 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2635
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2636 if (qc->closing
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2637 && ngx_current_msec - qc->last_cc < NGX_QUIC_CC_MIN_INTERVAL)
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2638 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2639 /* dot not send CC too often */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2640 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2641 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2642
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2643 frame = ngx_quic_alloc_frame(c, 0);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2644 if (frame == NULL) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2645 return NGX_ERROR;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2646 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2647
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2648 frame->level = qc->error_level;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2649 frame->type = NGX_QUIC_FT_CONNECTION_CLOSE;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2650 frame->u.close.error_code = qc->error;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2651 frame->u.close.frame_type = qc->error_ftype;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2652 frame->u.close.app = qc->error_app;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2653
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2654 if (qc->error_reason) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2655 frame->u.close.reason.len = ngx_strlen(qc->error_reason);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2656 frame->u.close.reason.data = (u_char *) qc->error_reason;
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2657 }
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2658
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2659 ngx_snprintf(frame->info, sizeof(frame->info) - 1,
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2660 "CONNECTION_CLOSE%s err:%ui level:%d ft:%ui reason:\"%s\"",
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2661 qc->error_app ? "_APP" : "", qc->error, qc->error_level,
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2662 qc->error_ftype, qc->error_reason ? qc->error_reason : "-");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2663
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2664 ngx_quic_queue_frame(c->quic, frame);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2665
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2666 qc->last_cc = ngx_current_msec;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2667
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2668 return ngx_quic_output(c);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2669 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2670
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2671
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2672 static ngx_int_t
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2673 ngx_quic_send_new_token(ngx_connection_t *c)
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2674 {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2675 ngx_str_t token;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2676 ngx_quic_frame_t *frame;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2677
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
2678 if (!c->quic->conf->retry) {
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2679 return NGX_OK;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2680 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2681
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2682 if (ngx_quic_new_token(c, &token) != NGX_OK) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2683 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2684 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2685
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2686 frame = ngx_quic_alloc_frame(c, 0);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2687 if (frame == NULL) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2688 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2689 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2690
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2691 frame->level = ssl_encryption_application;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2692 frame->type = NGX_QUIC_FT_NEW_TOKEN;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2693 frame->u.token.length = token.len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2694 frame->u.token.data = token.data;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2695 ngx_sprintf(frame->info, "NEW_TOKEN");
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2696 ngx_quic_queue_frame(c->quic, frame);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2697
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2698 return NGX_OK;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2699 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2700
7945
Vladimir Homutov <vl@nginx.com>
parents: 7942
diff changeset
2701
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2702 static ngx_int_t
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2703 ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2704 ngx_quic_ack_frame_t *ack)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2705 {
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2706 ssize_t n;
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2707 u_char *pos, *end;
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2708 uint64_t min, max, gap, range;
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2709 ngx_msec_t send_time;
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2710 ngx_uint_t i;
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2711 ngx_quic_send_ctx_t *ctx;
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2712 ngx_quic_connection_t *qc;
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2713
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2714 qc = c->quic;
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2715
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2716 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2717
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2718 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2719 "quic ngx_quic_handle_ack_frame level %d", pkt->level);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2720
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2721 /*
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2722 * 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: 7861
diff changeset
2723 * 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: 7861
diff changeset
2724 * (19.3.1)
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2725 */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2726
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2727 if (ack->first_range > ack->largest) {
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2728 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2729 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2730 "quic invalid first range in ack frame");
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2731 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2732 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2733
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2734 min = ack->largest - ack->first_range;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2735 max = ack->largest;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2736
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2737 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2738 != NGX_OK)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2739 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2740 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2741 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2742
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2743 /* 13.2.3. Receiver Tracking of ACK Frames */
8050
6e1c88f82280 QUIC: changed ctx->largest_ack initial value to type maximum.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8027
diff changeset
2744 if (ctx->largest_ack < max || ctx->largest_ack == (uint64_t) -1) {
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
2745 ctx->largest_ack = max;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2746 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2747 "quic updated largest received ack: %uL", max);
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2748
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2749 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2750 * An endpoint generates an RTT sample on receiving an
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2751 * ACK frame that meets the following two conditions:
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2752 *
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2753 * - the largest acknowledged packet number is newly acknowledged
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2754 * - at least one of the newly acknowledged packets was ack-eliciting.
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2755 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2756
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2757 if (send_time != NGX_TIMER_INFINITE) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2758 ngx_quic_rtt_sample(c, ack, pkt->level, send_time);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2759 }
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2760 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2761
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2762 pos = ack->ranges_start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2763 end = ack->ranges_end;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2764
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2765 for (i = 0; i < ack->range_count; i++) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2766
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2767 n = ngx_quic_parse_ack_range(pkt, pos, end, &gap, &range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2768 if (n == NGX_ERROR) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2769 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2770 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2771 pos += n;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2772
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2773 if (gap + 2 > min) {
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2774 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2775 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2776 "quic invalid range %ui in ack frame", i);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2777 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2778 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2779
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2780 max = min - gap - 2;
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2781
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2782 if (range > max) {
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2783 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2784 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2785 "quic invalid range %ui in ack frame", i);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2786 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2787 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2788
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2789 min = max - range;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2790
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2791 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2792 != NGX_OK)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2793 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2794 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2795 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2796 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2797
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
2798 return ngx_quic_detect_lost(c);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2799 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2800
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2801
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2802 static ngx_int_t
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
2803 ngx_quic_handle_ack_frame_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2804 uint64_t min, uint64_t max, ngx_msec_t *send_time)
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2805 {
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2806 uint64_t found_num;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2807 ngx_uint_t found;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2808 ngx_queue_t *q;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2809 ngx_quic_frame_t *f;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2810 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2811
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2812 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2813 "quic handle ack range: min:%uL max:%uL", min, max);
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2814
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2815 qc = c->quic;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2816
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2817 *send_time = NGX_TIMER_INFINITE;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2818 found = 0;
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2819 found_num = 0;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2820
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2821 q = ngx_queue_last(&ctx->sent);
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
2822
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
2823 while (q != ngx_queue_sentinel(&ctx->sent)) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2824
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2825 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2826 q = ngx_queue_prev(q);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2827
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2828 if (f->pnum >= min && f->pnum <= max) {
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2829 ngx_quic_congestion_ack(c, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2830
8147
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2831 switch (f->type) {
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2832 case NGX_QUIC_FT_ACK:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2833 ngx_quic_drop_ack_ranges(c, ctx, f->u.ack.largest);
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2834 break;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2835
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2836 case NGX_QUIC_FT_STREAM0:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2837 case NGX_QUIC_FT_STREAM1:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2838 case NGX_QUIC_FT_STREAM2:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2839 case NGX_QUIC_FT_STREAM3:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2840 case NGX_QUIC_FT_STREAM4:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2841 case NGX_QUIC_FT_STREAM5:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2842 case NGX_QUIC_FT_STREAM6:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2843 case NGX_QUIC_FT_STREAM7:
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2844 ngx_quic_handle_stream_ack(c, f);
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2845 break;
018baa412c0d try: --skiptests
Vladimir Homutov <vl@nginx.com>
parents: 8146
diff changeset
2846 }
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2847
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2848 if (f->pnum > found_num || !found) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2849 *send_time = f->last;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2850 found_num = f->pnum;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2851 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2852
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2853 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2854 ngx_quic_free_frame(c, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2855 found = 1;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2856 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2857 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2858
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2859 if (!found) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2860
7932
4e75267865de QUIC: fixed off-by-one in frame range handler.
Vladimir Homutov <vl@nginx.com>
parents: 7931
diff changeset
2861 if (max < ctx->pnum) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2862 /* duplicate ACK or ACK for non-ack-eliciting frame */
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2863 return NGX_OK;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2864 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2865
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2866 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7878
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
2867 "quic ACK for the packet not sent");
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2868
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2869 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2870 qc->error_ftype = NGX_QUIC_FT_ACK;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2871 qc->error_reason = "unknown packet number";
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2872
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2873 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2874 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2875
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2876 if (!qc->push.timer_set) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2877 ngx_post_event(&qc->push, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2878 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2879
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2880 qc->pto_count = 0;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2881
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2882 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2883 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2884
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2885
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2886 static void
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2887 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: 7953
diff changeset
2888 enum ssl_encryption_level_t level, ngx_msec_t send_time)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2889 {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2890 ngx_msec_t latest_rtt, ack_delay, adjusted_rtt, rttvar_sample;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2891 ngx_quic_connection_t *qc;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2892
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2893 qc = c->quic;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2894
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2895 latest_rtt = ngx_current_msec - send_time;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2896 qc->latest_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2897
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2898 if (qc->min_rtt == NGX_TIMER_INFINITE) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2899 qc->min_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2900 qc->avg_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2901 qc->rttvar = latest_rtt / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2902
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2903 } else {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2904 qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2905
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2906
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2907 if (level == ssl_encryption_application) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2908 ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2909 ack_delay = ngx_min(ack_delay, qc->ctp.max_ack_delay);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2910
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2911 } else {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2912 ack_delay = 0;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2913 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2914
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2915 adjusted_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2916
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2917 if (qc->min_rtt + ack_delay < latest_rtt) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2918 adjusted_rtt -= ack_delay;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2919 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2920
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2921 qc->avg_rtt = 0.875 * qc->avg_rtt + 0.125 * adjusted_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2922 rttvar_sample = ngx_abs((ngx_msec_int_t) (qc->avg_rtt - adjusted_rtt));
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2923 qc->rttvar = 0.75 * qc->rttvar + 0.25 * rttvar_sample;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2924 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2925
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2926 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2927 "quic rtt sample: latest %M, min %M, avg %M, var %M",
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2928 latest_rtt, qc->min_rtt, qc->avg_rtt, qc->rttvar);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2929 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2930
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2931
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2932 static ngx_inline ngx_msec_t
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2933 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: 7992
diff changeset
2934 {
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2935 ngx_msec_t duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2936 ngx_quic_connection_t *qc;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2937
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2938 qc = c->quic;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2939
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2940 /* PTO calculation: quic-recovery, Appendix 8 */
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2941 duration = qc->avg_rtt;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2942
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2943 duration += ngx_max(4 * qc->rttvar, NGX_QUIC_TIME_GRANULARITY);
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2944 duration <<= qc->pto_count;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2945
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2946 if (qc->congestion.in_flight == 0) { /* no in-flight packets */
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2947 return duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2948 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2949
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2950 if (ctx == &qc->send_ctx[2] && c->ssl->handshaked) {
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2951 /* application send space */
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2952
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2953 duration += qc->tp.max_ack_delay << qc->pto_count;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2954 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2955
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2956 return duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2957 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2958
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2959
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2960 static void
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2961 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: 7840
diff changeset
2962 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2963 uint64_t sent, unacked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2964 ngx_event_t *wev;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2965 ngx_quic_stream_t *sn;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2966 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2967
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2968 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2969
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2970 sn = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2971 if (sn == NULL) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2972 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2973 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2974
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2975 wev = sn->c->write;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2976 sent = sn->c->sent;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2977 unacked = sent - sn->acked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2978
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2979 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2980 wev->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2981 ngx_post_event(wev, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2982 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2983
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2984 sn->acked += f->u.stream.length;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2985
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2986 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, sn->c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2987 "quic stream ack %uL acked:%uL, unacked:%uL",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2988 f->u.stream.length, sn->acked, sent - sn->acked);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2989 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2990
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2991
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2992 static ngx_int_t
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2993 ngx_quic_handle_ordered_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs,
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
2994 ngx_quic_frame_t *frame, ngx_quic_frame_handler_pt handler, void *data)
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2995 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2996 size_t full_len;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2997 ngx_int_t rc;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2998 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2999 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3000
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3001 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3002
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3003 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3004 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
3005 "quic out-of-order frame: expecting %uL got %uL",
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3006 fs->received, f->offset);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3007
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3008 return ngx_quic_buffer_frame(c, fs, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3009 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3010
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3011 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3012
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3013 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3014 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3015 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3016 /* old/duplicate data range */
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3017 return handler == ngx_quic_crypto_input ? NGX_DECLINED : NGX_OK;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3018 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3019
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3020 /* intersecting data range, frame modified */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3021 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3022
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3023 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3024
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3025 rc = handler(c, frame, data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3026 if (rc == NGX_ERROR) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3027 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3028
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3029 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3030 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3031 return NGX_OK;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3032 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3033
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3034 /* rc == NGX_OK */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3035
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3036 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3037
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3038 /* now check the queue if we can continue with buffered frames */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3039
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3040 do {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3041 q = ngx_queue_head(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3042 if (q == ngx_queue_sentinel(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3043 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3044 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3045
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3046 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3047 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3048
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3049 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3050 /* gap found, nothing more to do */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3051 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3052 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3053
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3054 full_len = f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3055
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3056 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3057
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3058 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3059 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3060 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3061 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3062 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3063 fs->total -= f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3064
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3065 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3066 "quic skipped buffered frame, total %ui",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3067 fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3068 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3069 continue;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3070 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3071
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3072 /* frame was adjusted, proceed to input */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3073 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3074
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3075 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3076
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3077 rc = handler(c, frame, data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3078
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3079 if (rc == NGX_ERROR) {
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3080 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3081
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3082 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3083 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3084 return NGX_OK;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3085 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3086
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3087 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3088 fs->total -= full_len;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3089
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3090 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3091
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3092 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3093 "quic consumed buffered frame, total %ui", fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3094
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3095 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3096
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3097 } while (1);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3098
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3099 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3100 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3101
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3102
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3103 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3104 ngx_quic_adjust_frame_offset(ngx_connection_t *c, ngx_quic_frame_t *frame,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3105 uint64_t offset_in)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3106 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3107 size_t tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3108 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3109
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3110 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3111
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3112 tail = offset_in - f->offset;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3113
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3114 if (tail >= f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3115 /* range preceeding already received data or duplicate, ignore */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3116
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3117 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3118 "quic old or duplicate data in ordered frame, ignored");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3119 return NGX_DONE;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3120 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3121
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3122 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3123 "quic adjusted ordered frame data start to expected offset");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3124
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3125 /* intersecting range: adjust data size */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3126
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3127 f->offset += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3128 f->data += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3129 f->length -= tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3130
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3131 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3132 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3133
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3134
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3135 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3136 ngx_quic_buffer_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs,
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3137 ngx_quic_frame_t *frame)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3138 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3139 u_char *data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3140 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3141 ngx_quic_frame_t *dst, *item;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3142 ngx_quic_ordered_frame_t *f, *df;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3143
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3144 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3145 "quic ngx_quic_buffer_frame");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3146
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3147 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3148
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3149 /* frame start offset is in the future, buffer it */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3150
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3151 dst = ngx_quic_alloc_frame(c, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3152 if (dst == NULL) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3153 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3154 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3155
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3156 data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3157 ngx_memcpy(dst, frame, sizeof(ngx_quic_frame_t));
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3158 dst->data = data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3159
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3160 ngx_memcpy(dst->data, f->data, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3161
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3162 df = &dst->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3163 df->data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3164
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3165 fs->total += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3166
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3167 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3168 "quic ordered frame with unexpected offset:"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3169 " buffered, total %ui", fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3170
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3171 if (ngx_queue_empty(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3172 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3173 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3174 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3175
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3176 for (q = ngx_queue_last(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3177 q != ngx_queue_sentinel(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3178 q = ngx_queue_prev(q))
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3179 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3180 item = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3181 f = &item->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3182
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3183 if (f->offset < df->offset) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3184 ngx_queue_insert_after(q, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3185 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3186 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3187 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3188
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3189 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3190
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3191 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3192 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3193
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3194
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3195 static ngx_int_t
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3196 ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3197 ngx_quic_frame_t *frame)
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3198 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3199 uint64_t last;
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3200 ngx_int_t rc;
8132
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3201 ngx_quic_send_ctx_t *ctx;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3202 ngx_quic_connection_t *qc;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3203 ngx_quic_crypto_frame_t *f;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3204 ngx_quic_frames_stream_t *fs;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3205
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3206 qc = c->quic;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3207 fs = &qc->crypto[pkt->level];
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3208 f = &frame->u.crypto;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3209
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3210 /* 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: 8066
diff changeset
3211 last = f->offset + f->length;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3212
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3213 if (last > fs->received && last - fs->received > NGX_QUIC_MAX_BUFFERED) {
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3214 c->quic->error = NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3215 return NGX_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3216 }
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3217
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3218 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: 8103
diff changeset
3219 NULL);
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3220 if (rc != NGX_DECLINED) {
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3221 return rc;
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3222 }
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3223
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3224 /* speeding up handshake completion */
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3225
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3226 if (pkt->level == ssl_encryption_initial) {
8132
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3227 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: 8131
diff changeset
3228
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3229 if (!ngx_queue_empty(&ctx->sent)) {
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3230 ngx_quic_resend_frames(c, ctx);
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3231 }
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3232 }
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3233
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3234 return NGX_OK;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3235 }
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3236
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3237
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3238 static ngx_int_t
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3239 ngx_quic_crypto_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data)
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3240 {
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
3241 int n, sslerr;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3242 ngx_ssl_conn_t *ssl_conn;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3243 ngx_quic_crypto_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3244
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3245 f = &frame->u.crypto;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3246
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3247 ssl_conn = c->ssl->connection;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3248
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3249 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3250 "quic SSL_quic_read_level: %d, SSL_quic_write_level: %d",
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3251 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3252 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3253
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3254 if (!SSL_provide_quic_data(ssl_conn, SSL_quic_read_level(ssl_conn),
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3255 f->data, f->length))
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3256 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3257 ngx_ssl_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3258 "SSL_provide_quic_data() failed");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3259 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3260 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3261
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3262 n = SSL_do_handshake(ssl_conn);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3263
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3264 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3265
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3266 if (n == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3267 sslerr = SSL_get_error(ssl_conn, n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3268
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3269 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d",
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3270 sslerr);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3271
7766
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7765
diff changeset
3272 if (sslerr != SSL_ERROR_WANT_READ) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3273 ngx_ssl_error(NGX_LOG_ERR, c->log, 0, "SSL_do_handshake() failed");
7766
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7765
diff changeset
3274 return NGX_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3275 }
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
3276
7768
76818c9cdd6f Sending HANDSHAKE_DONE just once with BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7767
diff changeset
3277 } else if (n == 1 && !SSL_in_init(ssl_conn)) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3278
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
3279 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7765
Sergey Kandaurov <pluknet@nginx.com>
parents: 7760
diff changeset
3280 "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3281
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
3282 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3283 "quic handshake completed successfully");
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3284
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3285 c->ssl->handshaked = 1;
8064
11fc65261689 QUIC: disabled bidirectional SSL shutdown after 09fb2135a589.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8063
diff changeset
3286 c->ssl->no_wait_shutdown = 1;
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3287
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
3288 frame = ngx_quic_alloc_frame(c, 0);
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3289 if (frame == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3290 return NGX_ERROR;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3291 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3292
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3293 /* 12.4 Frames and frame types, figure 8 */
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3294 frame->level = ssl_encryption_application;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3295 frame->type = NGX_QUIC_FT_HANDSHAKE_DONE;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3296 ngx_sprintf(frame->info, "HANDSHAKE DONE on handshake completed");
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
3297 ngx_quic_queue_frame(c->quic, frame);
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3298
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3299 if (ngx_quic_send_new_token(c) != NGX_OK) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3300 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3301 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3302
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3303 /*
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3304 * Generating next keys before a key update is received.
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3305 * See quic-tls 9.4 Header Protection Timing Side-Channels.
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3306 */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3307
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3308 if (ngx_quic_key_update(c, &c->quic->keys[ssl_encryption_application],
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3309 &c->quic->next_key)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3310 != NGX_OK)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3311 {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3312 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
3313 }
7870
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
3314
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
3315 /*
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
3316 * 4.10.2 An endpoint MUST discard its handshake keys
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
3317 * when the TLS handshake is confirmed
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
3318 */
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
3319 ngx_quic_discard_ctx(c, ssl_encryption_handshake);
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
3320 }
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
3321
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3322 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3323 "quic SSL_quic_read_level: %d, SSL_quic_write_level: %d",
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3324 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3325 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3326
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3327 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3328 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3329
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3330
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3331 static ngx_int_t
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3332 ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3333 ngx_quic_frame_t *frame)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3334 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3335 size_t window;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3336 uint64_t last;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3337 ngx_buf_t *b;
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3338 ngx_pool_t *pool;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3339 ngx_connection_t *sc;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3340 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3341 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3342 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3343 ngx_quic_frames_stream_t *fs;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3344
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3345 qc = c->quic;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3346 f = &frame->u.stream;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3347
7922
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3348 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: 7919
diff changeset
3349 && (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: 7919
diff changeset
3350 {
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3351 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: 7919
diff changeset
3352 return NGX_ERROR;
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3353 }
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3354
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3355 /* 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: 8066
diff changeset
3356 last = f->offset + f->length;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3357
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3358 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3359
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3360 if (sn == NULL) {
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3361 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: 8021
diff changeset
3362
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3363 if (sn == NULL) {
7922
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3364 return NGX_ERROR;
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3365 }
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3366
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3367 if (sn == NGX_QUIC_STREAM_GONE) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3368 return NGX_OK;
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
3369 }
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3370
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3371 sc = sn->c;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3372 fs = &sn->fs;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3373 b = sn->b;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3374 window = b->end - b->last;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3375
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3376 if (last > window) {
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3377 c->quic->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3378 goto cleanup;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3379 }
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3380
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3381 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: 8021
diff changeset
3382 sn)
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3383 != NGX_OK)
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3384 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3385 goto cleanup;
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3386 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3387
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3388 sc->listening->handler(sc);
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3389
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3390 return NGX_OK;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3391 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3392
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3393 fs = &sn->fs;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3394 b = sn->b;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3395 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: 8066
diff changeset
3396
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3397 if (last > fs->received && last - fs->received > window) {
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3398 c->quic->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3399 return NGX_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3400 }
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3401
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3402 return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_stream_input,
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3403 sn);
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3404
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3405 cleanup:
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3406
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3407 pool = sc->pool;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3408
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3409 ngx_close_connection(sc);
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3410 ngx_destroy_pool(pool);
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3411
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3412 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3413 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3414
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3415
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3416 static ngx_int_t
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3417 ngx_quic_stream_input(ngx_connection_t *c, ngx_quic_frame_t *frame, void *data)
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3418 {
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
3419 uint64_t id;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3420 ngx_buf_t *b;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3421 ngx_event_t *rev;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3422 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3423 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3424 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3425
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3426 qc = c->quic;
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3427 sn = data;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3428
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3429 f = &frame->u.stream;
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
3430 id = f->stream_id;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3431
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3432 b = sn->b;
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3433
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3434 if ((size_t) ((b->pos - b->start) + (b->end - b->last)) < f->length) {
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
3435 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
3436 "quic no space in stream buffer");
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3437 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3438 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3439
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3440 if ((size_t) (b->end - b->last) < f->length) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3441 b->last = ngx_movemem(b->start, b->pos, b->last - b->pos);
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3442 b->pos = b->start;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3443 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3444
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
3445 b->last = ngx_cpymem(b->last, f->data, f->length);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3446
7760
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3447 rev = sn->c->read;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3448 rev->ready = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3449
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3450 if (f->fin) {
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3451 rev->pending_eof = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3452 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3453
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3454 if (rev->active) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3455 rev->handler(rev);
7780
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
3456 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
3457
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3458 /* check if stream was destroyed by handler */
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
3459 if (ngx_quic_find_stream(&qc->streams.tree, id) == NULL) {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3460 return NGX_DONE;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3461 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3462
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3463 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3464 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3465
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3466
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3467 static ngx_int_t
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3468 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: 7841
diff changeset
3469 ngx_quic_max_data_frame_t *f)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3470 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3471 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3472 ngx_rbtree_t *tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3473 ngx_rbtree_node_t *node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3474 ngx_quic_stream_t *qs;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3475 ngx_quic_connection_t *qc;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3476
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3477 qc = c->quic;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3478 tree = &qc->streams.tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3479
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3480 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: 7841
diff changeset
3481 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3482 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3483
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3484 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: 7841
diff changeset
3485
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3486 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: 7841
diff changeset
3487 node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3488 node = ngx_rbtree_next(tree, node))
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3489 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3490 qs = (ngx_quic_stream_t *) node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3491 wev = qs->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3492
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3493 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3494 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3495 ngx_post_event(wev, &ngx_posted_events);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3496 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3497 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3498 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3499
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3500 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: 7841
diff changeset
3501
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3502 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3503 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3504
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3505
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3506 static ngx_int_t
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3507 ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3508 ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3509 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3510 return NGX_OK;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3511 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3512
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3513
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3514 static ngx_int_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3515 ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3516 ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3517 {
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3518 size_t n;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3519 ngx_buf_t *b;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3520 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3521 ngx_quic_stream_t *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3522 ngx_quic_connection_t *qc;
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3523
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3524 qc = c->quic;
7924
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3525
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3526 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: 7923
diff changeset
3527 && (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: 7923
diff changeset
3528 {
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3529 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: 7923
diff changeset
3530 return NGX_ERROR;
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3531 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3532
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3533 sn = ngx_quic_find_stream(&qc->streams.tree, f->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3534
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3535 if (sn == NULL) {
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3536 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: 8021
diff changeset
3537
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3538 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3539 return NGX_ERROR;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3540 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3541
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3542 if (sn == NGX_QUIC_STREAM_GONE) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3543 return NGX_OK;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3544 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3545
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3546 b = sn->b;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3547 n = b->end - b->last;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3548
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3549 sn->c->listening->handler(sn->c);
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3550
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3551 } else {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3552 b = sn->b;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3553 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: 8021
diff changeset
3554 }
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3555
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
3556 frame = ngx_quic_alloc_frame(c, 0);
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3557 if (frame == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3558 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3559 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3560
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3561 frame->level = pkt->level;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3562 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3563 frame->u.max_stream_data.id = f->id;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3564 frame->u.max_stream_data.limit = n;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3565
8018
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
3566 ngx_sprintf(frame->info, "MAX_STREAM_DATA id:0x%xL limit:%uL level=%d",
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
3567 frame->u.max_stream_data.id,
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
3568 frame->u.max_stream_data.limit,
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3569 frame->level);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3570
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3571 ngx_quic_queue_frame(c->quic, frame);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3572
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3573 return NGX_OK;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3574 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3575
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3576
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3577 static ngx_int_t
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3578 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: 7841
diff changeset
3579 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: 7841
diff changeset
3580 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3581 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3582 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3583 ngx_quic_stream_t *sn;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3584 ngx_quic_connection_t *qc;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3585
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3586 qc = c->quic;
7924
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3587
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3588 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: 7923
diff changeset
3589 && (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: 7923
diff changeset
3590 {
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3591 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: 7923
diff changeset
3592 return NGX_ERROR;
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3593 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3594
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3595 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: 7841
diff changeset
3596
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3597 if (sn == NULL) {
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3598 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: 8021
diff changeset
3599
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3600 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3601 return NGX_ERROR;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3602 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3603
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3604 if (sn == NGX_QUIC_STREAM_GONE) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3605 return NGX_OK;
7924
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3606 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3607
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3608 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: 8021
diff changeset
3609 sn->send_max_data = f->limit;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3610 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3611
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3612 sn->c->listening->handler(sn->c);
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3613
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3614 return NGX_OK;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3615 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3616
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3617 if (f->limit <= sn->send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3618 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3619 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3620
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3621 sent = sn->c->sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3622
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3623 if (sent >= sn->send_max_data) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3624 wev = sn->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3625
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3626 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3627 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3628 ngx_post_event(wev, &ngx_posted_events);
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3629 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3630 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3631
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3632 sn->send_max_data = f->limit;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3633
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3634 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3635 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3636
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3637
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3638 static ngx_int_t
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3639 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: 7922
diff changeset
3640 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: 7922
diff changeset
3641 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3642 ngx_event_t *rev;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3643 ngx_connection_t *sc;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3644 ngx_quic_stream_t *sn;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3645 ngx_quic_connection_t *qc;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3646
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3647 qc = c->quic;
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3648
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3649 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3650 && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED))
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3651 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3652 qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR;
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3653 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3654 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3655
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3656 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: 8022
diff changeset
3657
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3658 if (sn == NULL) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3659 sn = ngx_quic_create_client_stream(c, f->id);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3660
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3661 if (sn == NULL) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3662 return NGX_ERROR;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3663 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3664
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3665 if (sn == NGX_QUIC_STREAM_GONE) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3666 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3667 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3668
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3669 sc = sn->c;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3670
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3671 rev = sc->read;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3672 rev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3673 rev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3674
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3675 sc->listening->handler(sc);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3676
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3677 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3678 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3679
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3680 rev = sn->c->read;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3681 rev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3682 rev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3683
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3684 if (rev->active) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3685 rev->handler(rev);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3686 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3687
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3688 return NGX_OK;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3689 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3690
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3691
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3692 static ngx_int_t
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3693 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: 7922
diff changeset
3694 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: 7922
diff changeset
3695 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3696 ngx_event_t *wev;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3697 ngx_connection_t *sc;
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3698 ngx_quic_stream_t *sn;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3699 ngx_quic_connection_t *qc;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3700
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3701 qc = c->quic;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3702
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3703 if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3704 && (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: 7922
diff changeset
3705 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3706 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: 7922
diff changeset
3707 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3708 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3709
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3710 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: 7922
diff changeset
3711
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3712 if (sn == NULL) {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3713 sn = ngx_quic_create_client_stream(c, f->id);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3714
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3715 if (sn == NULL) {
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3716 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3717 }
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3718
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3719 if (sn == NGX_QUIC_STREAM_GONE) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3720 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3721 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3722
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3723 sc = sn->c;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3724
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3725 wev = sc->write;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3726 wev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3727 wev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3728
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3729 sc->listening->handler(sc);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3730
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3731 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3732 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3733
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3734 wev = sn->c->write;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3735 wev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3736 wev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3737
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3738 if (wev->active) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3739 wev->handler(wev);
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3740 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3741
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3742 return NGX_OK;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3743 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3744
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3745
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3746 static ngx_int_t
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3747 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: 8004
diff changeset
3748 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: 8004
diff changeset
3749 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3750 ngx_quic_connection_t *qc;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3751
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3752 qc = c->quic;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3753
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3754 if (f->bidi) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3755 if (qc->streams.server_max_streams_bidi < f->limit) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3756 qc->streams.server_max_streams_bidi = f->limit;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3757
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3758 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: 8004
diff changeset
3759 "quic max_streams_bidi:%uL", f->limit);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3760 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3761
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3762 } else {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3763 if (qc->streams.server_max_streams_uni < f->limit) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3764 qc->streams.server_max_streams_uni = f->limit;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3765
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3766 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: 8004
diff changeset
3767 "quic max_streams_uni:%uL", f->limit);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3768 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3769 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3770
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3771 return NGX_OK;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3772 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3773
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3774
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3775 static ngx_int_t
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3776 ngx_quic_handle_path_challenge_frame(ngx_connection_t *c,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3777 ngx_quic_header_t *pkt, ngx_quic_path_challenge_frame_t *f)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3778 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3779 ngx_quic_frame_t *frame;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3780
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3781 frame = ngx_quic_alloc_frame(c, 0);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3782 if (frame == NULL) {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3783 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3784 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3785
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3786 frame->level = pkt->level;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3787 frame->type = NGX_QUIC_FT_PATH_RESPONSE;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3788 frame->u.path_response = *f;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3789
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3790 ngx_sprintf(frame->info, "PATH_RESPONSE data:0x%xL level:%d",
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3791 *(uint64_t *) &f->data, frame->level);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3792
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3793 ngx_quic_queue_frame(c->quic, frame);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3794
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3795 return NGX_OK;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3796 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3797
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3798
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3799 static ngx_int_t
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3800 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: 8074
diff changeset
3801 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: 8074
diff changeset
3802 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3803 ngx_queue_t *q;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3804 ngx_quic_client_id_t *cid, *item;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3805 ngx_quic_connection_t *qc;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3806
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3807 qc = c->quic;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3808
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3809 if (f->seqnum < qc->max_retired_seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3810 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3811 * An endpoint that receives a NEW_CONNECTION_ID frame with
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3812 * a sequence number smaller than the Retire Prior To field
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3813 * of a previously received NEW_CONNECTION_ID frame MUST send
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3814 * a corresponding RETIRE_CONNECTION_ID frame that retires
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3815 * the newly received connection ID, unless it has already
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3816 * done so for that sequence number.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3817 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3818
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3819 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: 8074
diff changeset
3820 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3821 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3822
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3823 goto retire;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3824 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3825
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3826 cid = NULL;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3827
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3828 for (q = ngx_queue_head(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3829 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3830 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3831 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3832 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: 8074
diff changeset
3833
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3834 if (item->seqnum == f->seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3835 cid = item;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3836 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3837 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3838 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3839
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3840 if (cid) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3841 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3842 * Transmission errors, timeouts and retransmissions might cause the
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3843 * same NEW_CONNECTION_ID frame to be received multiple times
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3844 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3845
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3846 if (cid->len != f->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3847 || ngx_strncmp(cid->id, f->cid, f->len) != 0
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
3848 || ngx_strncmp(cid->sr_token, f->srt, NGX_QUIC_SR_TOKEN_LEN) != 0)
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3849 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3850 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3851 * ..a sequence number is used for different connection IDs,
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3852 * the endpoint MAY treat that receipt as a connection error
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3853 * of type PROTOCOL_VIOLATION.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3854 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3855 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3856 qc->error_reason = "seqnum refers to different connection id/token";
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3857 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3858 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3859
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3860 } else {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3861
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3862 cid = ngx_quic_alloc_connection_id(c, qc);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3863 if (cid == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3864 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3865 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3866
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3867 cid->seqnum = f->seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3868 cid->len = f->len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3869 ngx_memcpy(cid->id, f->cid, f->len);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3870
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
3871 ngx_memcpy(cid->sr_token, f->srt, NGX_QUIC_SR_TOKEN_LEN);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3872
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3873 ngx_queue_insert_tail(&qc->client_ids, &cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3874 qc->nclient_ids++;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3875
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3876 /* always use latest available connection id */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3877 if (f->seqnum > qc->curr_seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3878 qc->scid.len = cid->len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3879 qc->scid.data = cid->id;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3880 qc->curr_seqnum = f->seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3881 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3882 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3883
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3884 retire:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3885
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3886 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: 8074
diff changeset
3887 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3888 * 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: 8074
diff changeset
3889 * 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: 8074
diff changeset
3890 * 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: 8074
diff changeset
3891 * largest received Retire Prior To value.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3892 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3893 goto done;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3894 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3895
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3896 qc->max_retired_seqnum = f->retire;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3897
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3898 q = ngx_queue_head(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3899
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3900 while (q != ngx_queue_sentinel(&qc->client_ids)) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3901
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3902 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: 8074
diff changeset
3903 q = ngx_queue_next(q);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3904
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3905 if (cid->seqnum >= f->retire) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3906 continue;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3907 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3908
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3909 /* this connection id must be retired */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3910
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3911 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: 8074
diff changeset
3912 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3913 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3914 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3915 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3916
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3917 ngx_queue_remove(&cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3918 ngx_queue_insert_head(&qc->free_client_ids, &cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3919 qc->nclient_ids--;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3920 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3921
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3922 done:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3923
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3924 if (qc->nclient_ids > qc->tp.active_connection_id_limit) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3925 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3926 * After processing a NEW_CONNECTION_ID frame and
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3927 * 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: 8074
diff changeset
3928 * connection IDs exceeds the value advertised in its
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3929 * active_connection_id_limit transport parameter, an endpoint MUST
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3930 * 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: 8074
diff changeset
3931 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3932 qc->error = NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3933 qc->error_reason = "too many connection ids received";
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3934 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3935 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3936
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3937 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3938 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3939
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3940
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3941 static ngx_int_t
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3942 ngx_quic_retire_connection_id(ngx_connection_t *c,
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3943 enum ssl_encryption_level_t level, uint64_t seqnum)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3944 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3945 ngx_quic_frame_t *frame;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3946
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3947 frame = ngx_quic_alloc_frame(c, 0);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3948 if (frame == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3949 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3950 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3951
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3952 frame->level = level;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3953 frame->type = NGX_QUIC_FT_RETIRE_CONNECTION_ID;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3954 frame->u.retire_cid.sequence_number = seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3955
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3956 ngx_sprintf(frame->info, "RETIRE_CONNECTION_ID seqnum=%uL level=%d",
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3957 seqnum, frame->level);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3958
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3959 ngx_quic_queue_frame(c->quic, frame);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3960
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3961 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3962 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3963
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3964
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3965 static ngx_quic_client_id_t *
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3966 ngx_quic_alloc_connection_id(ngx_connection_t *c, ngx_quic_connection_t *qc)
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3967 {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3968 ngx_queue_t *q;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3969 ngx_quic_client_id_t *cid;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3970
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3971 if (!ngx_queue_empty(&qc->free_client_ids)) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3972
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3973 q = ngx_queue_head(&qc->free_client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3974 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: 8074
diff changeset
3975
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3976 ngx_queue_remove(&cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3977
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3978 ngx_memzero(cid, sizeof(ngx_quic_client_id_t));
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3979
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3980 } else {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3981
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3982 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: 8074
diff changeset
3983 if (cid == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3984 return NULL;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3985 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3986 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3987
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3988 return cid;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3989 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3990
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3991
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3992 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3993 ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3994 {
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3995 ngx_quic_send_ctx_t *ctx;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3996
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3997 ctx = ngx_quic_get_send_ctx(qc, frame->level);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3998
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3999 ngx_queue_insert_tail(&ctx->frames, &frame->queue);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4000
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4001 frame->len = ngx_quic_create_frame(NULL, frame);
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4002 /* always succeeds */
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4003
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4004 if (qc->closing) {
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4005 return;
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4006 }
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4007
8055
924882f42dea QUIC: do not artificially delay sending queued frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8054
diff changeset
4008 ngx_post_event(&qc->push, &ngx_posted_events);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4009 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4010
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4011
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4012 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4013 ngx_quic_output(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4014 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4015 ngx_uint_t i;
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4016 ngx_quic_send_ctx_t *ctx;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4017 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4018
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
4019 c->log->action = "sending frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
4020
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4021 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4022
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4023 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8146
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4024
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4025 ctx = &qc->send_ctx[i];
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4026
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4027 if (ctx->send_ack) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4028 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4029 return NGX_ERROR;
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4030 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4031 }
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4032
61f1c6ac8967 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8144
diff changeset
4033 if (ngx_quic_output_frames(c, ctx) != NGX_OK) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4034 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4035 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4036 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4037
7788
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 7787
diff changeset
4038 if (!qc->send_timer_set && !qc->closing) {
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
4039 qc->send_timer_set = 1;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
4040 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
4041 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
4042
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4043 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4044 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4045
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4046
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4047 static ngx_int_t
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4048 ngx_quic_output_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4049 {
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4050 size_t len, hlen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4051 ngx_uint_t need_ack;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4052 ngx_queue_t *q, range;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4053 ngx_quic_frame_t *f;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4054 ngx_quic_congestion_t *cg;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4055 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4056
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4057 qc = c->quic;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4058 cg = &qc->congestion;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4059
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4060 if (ngx_queue_empty(&ctx->frames)) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4061 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4062 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4063
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4064 q = ngx_queue_head(&ctx->frames);
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4065 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4066
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4067 /* all frames in same send_ctx share same level */
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4068 hlen = (f->level == ssl_encryption_application) ? NGX_QUIC_MAX_SHORT_HEADER
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
4069 : NGX_QUIC_MAX_LONG_HEADER;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4070 hlen += EVP_GCM_TLS_TAG_LEN;
8144
02ee77f8d53d QUIC: account packet header length in amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 8142
diff changeset
4071 hlen -= NGX_QUIC_MAX_CID_LEN - qc->scid.len;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4072
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4073 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4074 len = 0;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4075 need_ack = 0;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4076 ngx_queue_init(&range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4077
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4078 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4079 /* process group of frames that fits into packet */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4080 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4081
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4082 if (len && hlen + len + f->len > qc->ctp.max_udp_payload_size) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4083 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4084 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4085
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4086 if (f->need_ack) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4087 need_ack = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4088 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4089
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4090 if (need_ack && cg->in_flight + len + f->len > cg->window) {
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4091 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4092 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4093
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4094 if (!qc->validated) {
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4095 /*
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4096 * Prior to validation, endpoints are limited in what they
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4097 * are able to send. During the handshake, a server cannot
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4098 * send more than three times the data it receives;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4099 */
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4100
8144
02ee77f8d53d QUIC: account packet header length in amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 8142
diff changeset
4101 if (((c->sent + hlen + len + f->len) / 3) > qc->received) {
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4102 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4103 "quic hit amplification limit"
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4104 " received %uz sent %O",
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4105 qc->received, c->sent);
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4106 break;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4107 }
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4108 }
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
4109
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4110 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4111
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4112 f->first = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4113
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4114 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4115 ngx_queue_insert_tail(&range, &f->queue);
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4116
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4117 len += f->len;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4118
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4119 } while (q != ngx_queue_sentinel(&ctx->frames));
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4120
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4121 if (ngx_queue_empty(&range)) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4122 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4123 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4124
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4125 if (ngx_quic_send_frames(c, ctx, &range) != NGX_OK) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4126 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4127 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4128
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4129 } while (q != ngx_queue_sentinel(&ctx->frames));
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4130
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4131 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4132 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4133
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4134
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4135 static void
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4136 ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames)
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4137 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4138 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4139 ngx_quic_frame_t *f;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4140
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4141 do {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4142 q = ngx_queue_head(frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4143
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4144 if (q == ngx_queue_sentinel(frames)) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4145 break;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4146 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4147
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4148 ngx_queue_remove(q);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4149
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4150 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4151
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4152 ngx_quic_free_frame(c, f);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4153 } while (1);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4154 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4155
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4156
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4157 static ngx_int_t
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4158 ngx_quic_send_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4159 ngx_queue_t *frames)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4160 {
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4161 ssize_t len;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4162 u_char *p;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4163 ngx_msec_t now;
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4164 ngx_str_t out, res;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4165 ngx_queue_t *q;
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
4166 ngx_ssl_conn_t *ssl_conn;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4167 ngx_quic_frame_t *f, *start;
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4168 ngx_quic_header_t pkt;
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
4169 ngx_quic_secrets_t *keys;
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4170 ngx_quic_connection_t *qc;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4171 static ngx_str_t initial_token = ngx_null_string;
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
4172 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
4173 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4174
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4175 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4176 "quic ngx_quic_send_frames");
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4177
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
4178 ssl_conn = c->ssl ? c->ssl->connection : NULL;
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
4179
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4180 q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4181 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4182
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4183 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4184
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4185 now = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4186
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4187 p = src;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4188 out.data = src;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4189
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4190 for (q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4191 q != ngx_queue_sentinel(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4192 q = ngx_queue_next(q))
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4193 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4194 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4195
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4196 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4197 "quic frame out: %s", f->info);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4198
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4199 len = ngx_quic_create_frame(p, f);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4200 if (len == -1) {
8134
2b11bd029815 QUIC: fixed memory leak in ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8133
diff changeset
4201 ngx_quic_free_frames(c, frames);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4202 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4203 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4204
7778
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 7777
diff changeset
4205 if (f->need_ack) {
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 7777
diff changeset
4206 pkt.need_ack = 1;
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 7777
diff changeset
4207 }
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 7777
diff changeset
4208
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4209 p += len;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4210 f->pnum = ctx->pnum;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4211 f->last = now;
8131
3bde57a0e6ce QUIC: zero out packet length in frames prior to send.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8105
diff changeset
4212 f->plen = 0;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4213 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4214
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4215 out.len = p - out.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4216
7767
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
4217 while (out.len < 4) {
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
4218 *p++ = NGX_QUIC_FT_PADDING;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
4219 out.len++;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
4220 }
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
4221
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4222 qc = c->quic;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4223
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
4224 keys = &c->quic->keys[start->level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
4225
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
4226 pkt.secret = &keys->server;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
4227
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4228 pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4229
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4230 if (start->level == ssl_encryption_initial) {
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4231 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4232 pkt.token = initial_token;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4233
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4234 } else if (start->level == ssl_encryption_handshake) {
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4235 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4236
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4237 } else {
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4238 if (c->quic->key_phase) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4239 pkt.flags |= NGX_QUIC_PKT_KPHASE;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
4240 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4241 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4242
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4243 ngx_quic_set_packet_number(&pkt, ctx);
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4244
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4245 pkt.log = c->log;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4246 pkt.level = start->level;
7821
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 7820
diff changeset
4247 pkt.dcid = qc->scid;
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 7820
diff changeset
4248 pkt.scid = qc->dcid;
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4249 pkt.payload = out;
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7750
diff changeset
4250
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
4251 res.data = dst;
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7750
diff changeset
4252
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4253 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4254 "quic packet ready: %ui bytes at level %d"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4255 " need_ack: %d number: %L encoded %d:0x%xD",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4256 out.len, start->level, pkt.need_ack, pkt.number,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4257 pkt.num_len, pkt.trunc);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4258
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
4259 if (ngx_quic_encrypt(&pkt, ssl_conn, &res) != NGX_OK) {
8134
2b11bd029815 QUIC: fixed memory leak in ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8133
diff changeset
4260 ngx_quic_free_frames(c, frames);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4261 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4262 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4263
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4264 len = c->send(c, res.data, res.len);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4265 if (len == NGX_ERROR || (size_t) len != res.len) {
8134
2b11bd029815 QUIC: fixed memory leak in ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 8133
diff changeset
4266 ngx_quic_free_frames(c, frames);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4267 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4268 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4269
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4270 /* len == NGX_OK || NGX_AGAIN */
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4271 ctx->pnum++;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4272
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4273 if (pkt.need_ack) {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4274 /* move frames into the sent queue to wait for ack */
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4275
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4276 if (qc->closing) {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4277 /* if we are closing, any ack will be discarded */
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4278 ngx_quic_free_frames(c, frames);
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4279
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4280 } else {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4281 ngx_queue_add(&ctx->sent, frames);
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
4282 if (qc->pto.timer_set) {
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
4283 ngx_del_timer(&qc->pto);
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
4284 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
4285 ngx_add_timer(&qc->pto, ngx_quic_pto(c, ctx));
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4286
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4287 start->plen = len;
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4288 }
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4289
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4290 qc->congestion.in_flight += len;
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4291
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4292 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4293 "quic congestion send if:%uz",
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4294 qc->congestion.in_flight);
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4295 } else {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4296 /* no ack is expected for this frames, so we can free them */
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4297 ngx_quic_free_frames(c, frames);
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4298 }
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4299
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
4300 return NGX_OK;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4301 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4302
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4303
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4304 static void
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4305 ngx_quic_set_packet_number(ngx_quic_header_t *pkt, ngx_quic_send_ctx_t *ctx)
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4306 {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4307 uint64_t delta;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4308
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4309 delta = ctx->pnum - ctx->largest_ack;
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4310 pkt->number = ctx->pnum;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4311
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4312 if (delta <= 0x7F) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4313 pkt->num_len = 1;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4314 pkt->trunc = ctx->pnum & 0xff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4316 } else if (delta <= 0x7FFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4317 pkt->num_len = 2;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4318 pkt->flags |= 0x1;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4319 pkt->trunc = ctx->pnum & 0xffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4320
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4321 } else if (delta <= 0x7FFFFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4322 pkt->num_len = 3;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4323 pkt->flags |= 0x2;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4324 pkt->trunc = ctx->pnum & 0xffffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4325
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4326 } else {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4327 pkt->num_len = 4;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4328 pkt->flags |= 0x3;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4329 pkt->trunc = ctx->pnum & 0xffffffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4330 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4331 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4332
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4333
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
4334 static void
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
4335 ngx_quic_pto_handler(ngx_event_t *ev)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4336 {
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4337 ngx_uint_t i;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4338 ngx_queue_t *q;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4339 ngx_connection_t *c;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4340 ngx_quic_frame_t *start;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4341 ngx_quic_send_ctx_t *ctx;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4342 ngx_quic_connection_t *qc;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4343
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
4344 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic pto timer");
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4345
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4346 c = ev->data;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4347 qc = c->quic;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4348
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4349 qc->pto_count++;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4350
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4351 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: 8050
diff changeset
4352
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4353 ctx = &qc->send_ctx[i];
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4354
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4355 if (ngx_queue_empty(&ctx->sent)) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4356 continue;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4357 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4358
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4359 q = ngx_queue_head(&ctx->sent);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4360 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4361
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4362 if (start->pnum <= ctx->largest_ack
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4363 && ctx->largest_ack != (uint64_t) -1)
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4364 {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4365 continue;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4366 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4367
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4368 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8057
de7d6d943f68 QUIC: fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8056
diff changeset
4369 "quic pto pnum:%uL pto_count:%ui level:%d",
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4370 start->pnum, c->quic->pto_count, start->level);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4371
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4372 ngx_quic_resend_frames(c, ctx);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4373 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4374 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4375
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4376
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4377 static void
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4378 ngx_quic_push_handler(ngx_event_t *ev)
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4379 {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4380 ngx_connection_t *c;
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4381
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4382 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic push timer");
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4383
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4384 c = ev->data;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4385
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4386 if (ngx_quic_output(c) != NGX_OK) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
4387 ngx_quic_close_connection(c, NGX_ERROR);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4388 return;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4389 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4390 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4391
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4392
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4393 static
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4394 void ngx_quic_lost_handler(ngx_event_t *ev)
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4395 {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4396 ngx_connection_t *c;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4397
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4398 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: 8050
diff changeset
4399
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4400 c = ev->data;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4401
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4402 if (ngx_quic_detect_lost(c) != NGX_OK) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4403 ngx_quic_close_connection(c, NGX_ERROR);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4404 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4405 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4406
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4407
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4408 static ngx_int_t
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4409 ngx_quic_detect_lost(ngx_connection_t *c)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4410 {
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4411 ngx_uint_t i;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4412 ngx_msec_t now, wait, min_wait, thr;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4413 ngx_queue_t *q;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4414 ngx_quic_frame_t *start;
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4415 ngx_quic_send_ctx_t *ctx;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4416 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4417
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4418 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4419 now = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4420
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4421 min_wait = 0;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4422
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4423 thr = NGX_QUIC_TIME_THR * ngx_max(qc->latest_rtt, qc->avg_rtt);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4424 thr = ngx_max(thr, NGX_QUIC_TIME_GRANULARITY);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4425
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4426 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4427
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4428 ctx = &qc->send_ctx[i];
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4429
8053
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4430 if (ctx->largest_ack == (uint64_t) -1) {
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4431 continue;
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4432 }
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4433
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4434 while (!ngx_queue_empty(&ctx->sent)) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4435
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4436 q = ngx_queue_head(&ctx->sent);
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4437 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4438
8053
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4439 if (start->pnum > ctx->largest_ack) {
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4440 break;
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4441 }
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4442
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4443 wait = start->last + thr - now;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4444
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4445 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
8057
de7d6d943f68 QUIC: fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8056
diff changeset
4446 "quic detect_lost pnum:%uL thr:%M wait:%i level:%d",
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4447 start->pnum, thr, (ngx_int_t) wait, start->level);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4448
8054
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
4449 if ((ngx_msec_int_t) wait > 0
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
4450 && 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: 8053
diff changeset
4451 {
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4452
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4453 if (min_wait == 0 || wait < min_wait) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4454 min_wait = wait;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4455 }
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4456
8054
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
4457 break;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4458 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4459
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4460 ngx_quic_resend_frames(c, ctx);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4461 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4462 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4463
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4464 /* no more preceeding packets */
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4465
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4466 if (min_wait == 0) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4467 qc->pto.handler = ngx_quic_pto_handler;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4468 return NGX_OK;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4469 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4470
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4471 qc->pto.handler = ngx_quic_lost_handler;
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4472
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4473 if (qc->pto.timer_set) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4474 ngx_del_timer(&qc->pto);
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4475 }
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4476
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4477 ngx_add_timer(&qc->pto, min_wait);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4478
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4479 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4480 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4481
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4482
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4483 static void
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4484 ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4485 {
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4486 ngx_queue_t *q;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4487 ngx_quic_frame_t *f, *start;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4488 ngx_quic_connection_t *qc;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4489
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4490 qc = c->quic;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4491 q = ngx_queue_head(&ctx->sent);
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4492 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: 8091
diff changeset
4493
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4494 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: 8091
diff changeset
4495 "quic resend packet pnum:%uL", start->pnum);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4496
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4497 do {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4498 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: 8050
diff changeset
4499
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4500 if (f->pnum != start->pnum) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4501 break;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4502 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4503
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4504 q = ngx_queue_next(q);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4505
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4506 ngx_queue_remove(&f->queue);
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4507 ngx_queue_insert_tail(&ctx->frames, &f->queue);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4508
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4509 } while (q != ngx_queue_sentinel(&ctx->sent));
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4510
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4511 ngx_quic_congestion_lost(c, start);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4512
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4513 if (qc->closing) {
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4514 return;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4515 }
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4516
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4517 ngx_post_event(&qc->push, &ngx_posted_events);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4518 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4519
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4520
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4521 ngx_connection_t *
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4522 ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4523 {
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4524 size_t rcvbuf_size;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4525 uint64_t id;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4526 ngx_quic_stream_t *qs, *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4527 ngx_quic_connection_t *qc;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4528
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4529 qs = c->qs;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4530 qc = qs->parent->quic;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4531
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4532 if (bidi) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4533 if (qc->streams.server_streams_bidi
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4534 >= qc->streams.server_max_streams_bidi)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4535 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4536 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: 8004
diff changeset
4537 "quic too many server bidi streams: %uL",
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4538 qc->streams.server_streams_bidi);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4539 return NULL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4540 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4541
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4542 id = (qc->streams.server_streams_bidi << 2)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4543 | NGX_QUIC_STREAM_SERVER_INITIATED;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4544
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4545 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8017
b0e74a54c98b QUIC: consistent Stream ID logging format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8014
diff changeset
4546 "quic creating server bidi stream %uL/%uL id:0x%xL",
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4547 qc->streams.server_streams_bidi,
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4548 qc->streams.server_max_streams_bidi, id);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4549
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4550 qc->streams.server_streams_bidi++;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4551 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: 8004
diff changeset
4552
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4553 } else {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4554 if (qc->streams.server_streams_uni
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4555 >= qc->streams.server_max_streams_uni)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4556 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4557 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: 8004
diff changeset
4558 "quic too many server uni streams: %uL",
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4559 qc->streams.server_streams_uni);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4560 return NULL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4561 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4562
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4563 id = (qc->streams.server_streams_uni << 2)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4564 | NGX_QUIC_STREAM_SERVER_INITIATED
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4565 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4566
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4567 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8017
b0e74a54c98b QUIC: consistent Stream ID logging format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8014
diff changeset
4568 "quic creating server uni stream %uL/%uL id:0x%xL",
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4569 qc->streams.server_streams_uni,
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4570 qc->streams.server_max_streams_uni, id);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4571
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4572 qc->streams.server_streams_uni++;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4573 rcvbuf_size = 0;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4574 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4575
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4576 sn = ngx_quic_create_stream(qs->parent, id, rcvbuf_size);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4577 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4578 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4579 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4580
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4581 return sn->c;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4582 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4583
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4584
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4585 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4586 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4587 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4588 {
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4589 ngx_rbtree_node_t **p;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4590 ngx_quic_stream_t *qn, *qnt;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4591
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4592 for ( ;; ) {
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4593 qn = (ngx_quic_stream_t *) node;
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4594 qnt = (ngx_quic_stream_t *) temp;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4595
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4596 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4597
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4598 if (*p == sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4599 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4600 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4601
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4602 temp = *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4603 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4604
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4605 *p = node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4606 node->parent = temp;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4607 node->left = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4608 node->right = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4609 ngx_rbt_red(node);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4610 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4611
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4612
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4613 static ngx_quic_stream_t *
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4614 ngx_quic_find_stream(ngx_rbtree_t *rbtree, uint64_t id)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4615 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4616 ngx_rbtree_node_t *node, *sentinel;
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4617 ngx_quic_stream_t *qn;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4618
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4619 node = rbtree->root;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4620 sentinel = rbtree->sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4621
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4622 while (node != sentinel) {
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4623 qn = (ngx_quic_stream_t *) node;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4624
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4625 if (id == qn->id) {
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4626 return qn;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4627 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4628
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4629 node = (id < qn->id) ? node->left : node->right;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4630 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4631
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4632 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4633 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4634
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4635
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4636 static ngx_quic_stream_t *
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4637 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: 8021
diff changeset
4638 {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4639 size_t n;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4640 uint64_t min_id;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4641 ngx_quic_stream_t *sn;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4642 ngx_quic_connection_t *qc;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4643
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4644 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4645 "quic stream id 0x%xL is new", id);
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4646
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4647 qc = c->quic;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4648
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4649 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4650
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4651 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: 8021
diff changeset
4652 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: 8021
diff changeset
4653 return NGX_QUIC_STREAM_GONE;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4654 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4655
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4656 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: 8021
diff changeset
4657 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4658 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4659
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4660 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: 8021
diff changeset
4661 return NGX_QUIC_STREAM_GONE;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4662 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4663
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4664 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: 8021
diff changeset
4665 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: 8021
diff changeset
4666 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4667 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4668
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4669 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: 8021
diff changeset
4670 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4671 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: 8021
diff changeset
4672 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: 8021
diff changeset
4673
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4674 } else {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4675
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4676 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: 8021
diff changeset
4677 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: 8021
diff changeset
4678 return NGX_QUIC_STREAM_GONE;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4679 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4680
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4681 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: 8021
diff changeset
4682 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4683 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4684
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4685 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: 8021
diff changeset
4686 return NGX_QUIC_STREAM_GONE;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4687 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4688
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4689 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: 8021
diff changeset
4690 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: 8021
diff changeset
4691 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4692 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4693
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4694 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: 8021
diff changeset
4695 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: 8021
diff changeset
4696 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: 8021
diff changeset
4697 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4698
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4699 if (n < NGX_QUIC_STREAM_BUFSIZE) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4700 n = NGX_QUIC_STREAM_BUFSIZE;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4701 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4702
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4703 /*
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4704 * 2.1. Stream Types and Identifiers
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4705 *
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4706 * 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: 8021
diff changeset
4707 * 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: 8021
diff changeset
4708 * 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: 8021
diff changeset
4709 * opened.
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4710 */
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4711
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4712 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: 8021
diff changeset
4713
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4714 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: 8021
diff changeset
4715 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4716 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4717 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4718
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4719 sn->c->listening->handler(sn->c);
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4720 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4721
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4722 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: 8021
diff changeset
4723 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4724
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4725
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4726 static ngx_quic_stream_t *
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4727 ngx_quic_create_stream(ngx_connection_t *c, uint64_t id, size_t rcvbuf_size)
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4728 {
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4729 ngx_log_t *log;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4730 ngx_pool_t *pool;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4731 ngx_quic_stream_t *sn;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4732 ngx_pool_cleanup_t *cln;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4733 ngx_quic_connection_t *qc;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4734
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4735 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8017
b0e74a54c98b QUIC: consistent Stream ID logging format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8014
diff changeset
4736 "quic stream id 0x%xL create", id);
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4737
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4738 qc = c->quic;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4739
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4740 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4741 if (pool == NULL) {
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4742 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4743 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4744
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4745 sn = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4746 if (sn == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4747 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4748 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4749 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4750
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4751 sn->node.key = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4752 sn->parent = c;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4753 sn->id = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4754
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4755 sn->b = ngx_create_temp_buf(pool, rcvbuf_size);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4756 if (sn->b == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4757 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4758 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4759 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4760
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4761 ngx_queue_init(&sn->fs.frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4762
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4763 log = ngx_palloc(pool, sizeof(ngx_log_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4764 if (log == NULL) {
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4765 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4766 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4767 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4768
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4769 *log = *c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4770 pool->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4771
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4772 sn->c = ngx_get_connection(-1, log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4773 if (sn->c == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4774 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4775 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4776 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4777
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4778 sn->c->qs = sn;
8000
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
4779 sn->c->type = SOCK_STREAM;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4780 sn->c->pool = pool;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4781 sn->c->ssl = c->ssl;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4782 sn->c->sockaddr = c->sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4783 sn->c->listening = c->listening;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4784 sn->c->addr_text = c->addr_text;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4785 sn->c->local_sockaddr = c->local_sockaddr;
8138
d57cfdebe301 QUIC: set local_socklen in stream connections.
Roman Arutyunyan <arut@nginx.com>
parents: 8137
diff changeset
4786 sn->c->local_socklen = c->local_socklen;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4787 sn->c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4788
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4789 sn->c->recv = ngx_quic_stream_recv;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4790 sn->c->send = ngx_quic_stream_send;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4791 sn->c->send_chain = ngx_quic_stream_send_chain;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4792
7997
b250b515e5b6 QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents: 7996
diff changeset
4793 sn->c->read->log = log;
b250b515e5b6 QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents: 7996
diff changeset
4794 sn->c->write->log = log;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4795
7839
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 7838
diff changeset
4796 log->connection = sn->c->number;
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 7838
diff changeset
4797
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4798 if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4799 || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4800 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4801 sn->c->write->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4802 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4803
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4804 if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4805 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4806 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: 7841
diff changeset
4807 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4808
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4809 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4810 if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4811 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: 7841
diff changeset
4812 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4813 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: 7841
diff changeset
4814 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4815 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4816
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4817 cln = ngx_pool_cleanup_add(pool, 0);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4818 if (cln == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4819 ngx_close_connection(sn->c);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4820 ngx_destroy_pool(pool);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4821 return NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4822 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4823
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4824 cln->handler = ngx_quic_stream_cleanup_handler;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4825 cln->data = sn->c;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4826
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4827 ngx_rbtree_insert(&c->quic->streams.tree, &sn->node);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4828
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4829 return sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4830 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4831
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4832
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4833 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4834 ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4835 {
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4836 ssize_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4837 ngx_buf_t *b;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4838 ngx_event_t *rev;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4839 ngx_connection_t *pc;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4840 ngx_quic_frame_t *frame;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4841 ngx_quic_stream_t *qs;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4842 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4843
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4844 qs = c->qs;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4845 b = qs->b;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4846 pc = qs->parent;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4847 qc = pc->quic;
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4848 rev = c->read;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4849
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4850 if (rev->error) {
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4851 return NGX_ERROR;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4852 }
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4853
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4854 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4855 "quic stream id 0x%xL recv: eof:%d, avail:%z",
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4856 qs->id, rev->pending_eof, b->last - b->pos);
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4857
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4858 if (b->pos == b->last) {
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4859 rev->ready = 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4860
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4861 if (rev->pending_eof) {
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4862 rev->eof = 1;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4863 return 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4864 }
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4865
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4866 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4867 "quic stream id 0x%xL recv() not ready", qs->id);
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4868 return NGX_AGAIN;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4869 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4870
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4871 len = ngx_min(b->last - b->pos, (ssize_t) size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4872
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4873 ngx_memcpy(buf, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4874
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4875 b->pos += len;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4876 qc->streams.received += len;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4877
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4878 if (b->pos == b->last) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4879 b->pos = b->start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4880 b->last = b->start;
7760
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4881 rev->ready = rev->pending_eof;
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4882 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4883
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4884 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4885 "quic stream id 0x%xL recv: %z of %uz", qs->id, len, size);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4886
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4887 if (!rev->pending_eof) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4888 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4889 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4890 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4891 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4892
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4893 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4894 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4895 frame->u.max_stream_data.id = qs->id;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4896 frame->u.max_stream_data.limit = qs->fs.received + (b->pos - b->start)
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4897 + (b->end - b->last);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4898
8017
b0e74a54c98b QUIC: consistent Stream ID logging format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8014
diff changeset
4899 ngx_sprintf(frame->info,
8018
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4900 "MAX_STREAM_DATA id:0x%xL limit:%uL l=%d on recv",
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4901 frame->u.max_stream_data.id,
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4902 frame->u.max_stream_data.limit,
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4903 frame->level);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4904
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4905 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4906 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4907
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4908 if ((qc->streams.recv_max_data / 2) < qc->streams.received) {
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4909
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4910 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4911
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4912 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4913 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4914 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4915
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4916 qc->streams.recv_max_data *= 2;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4917
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4918 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4919 frame->type = NGX_QUIC_FT_MAX_DATA;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4920 frame->u.max_data.max_data = qc->streams.recv_max_data;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4921
8018
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4922 ngx_sprintf(frame->info, "MAX_DATA max_data:%uL level=%d on recv",
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4923 frame->u.max_data.max_data, frame->level);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4924
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4925 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4926
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4927 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4928 "quic stream id 0x%xL recv: increased max data: %uL",
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4929 qs->id, qc->streams.recv_max_data);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4930 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4931
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4932 return len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4933 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4934
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4935
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4936 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4937 ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4938 {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4939 ngx_buf_t b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4940 ngx_chain_t cl;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4941
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4942 ngx_memzero(&b, sizeof(ngx_buf_t));
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4943
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4944 b.memory = 1;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4945 b.pos = buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4946 b.last = buf + size;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4947
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4948 cl.buf = &b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4949 cl.next = NULL;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4950
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4951 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: 8026
diff changeset
4952 return NGX_ERROR;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4953 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4954
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4955 if (b.pos == buf) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4956 return NGX_AGAIN;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4957 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4958
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4959 return b.pos - buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4960 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4961
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4962
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4963 static ngx_chain_t *
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4964 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: 8026
diff changeset
4965 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4966 u_char *p;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4967 size_t n, max, max_frame, max_flow, max_limit, len;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4968 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4969 size_t sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4970 #endif
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4971 ngx_buf_t *b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4972 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4973 ngx_uint_t nframes;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4974 #endif
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4975 ngx_event_t *wev;
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4976 ngx_chain_t *cl;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4977 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4978 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4979 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4980 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4981
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4982 qs = c->qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4983 pc = qs->parent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4984 qc = pc->quic;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4985 wev = c->write;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4986
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4987 if (wev->error) {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4988 return NGX_CHAIN_ERROR;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4989 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4990
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4991 max_frame = ngx_quic_max_stream_frame(qc);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4992 max_flow = ngx_quic_max_stream_flow(c);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4993 max_limit = limit;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4994
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4995 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4996 sent = 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4997 nframes = 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4998 #endif
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4999
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5000 for ( ;; ) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5001 max = ngx_min(max_frame, max_flow);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5002
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5003 if (limit) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5004 max = ngx_min(max, max_limit);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5005 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5006
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5007 for (cl = in, n = 0; in; in = in->next) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5008
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5009 if (!ngx_buf_in_memory(in->buf)) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5010 continue;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5011 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5012
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5013 n += ngx_buf_size(in->buf);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5014
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5015 if (n > max) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5016 n = max;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5017 break;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5018 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5019 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5020
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5021 if (n == 0) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5022 wev->ready = (max_flow ? 1 : 0);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5023 break;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5024 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5025
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5026 frame = ngx_quic_alloc_frame(pc, n);
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5027 if (frame == NULL) {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5028 return NGX_CHAIN_ERROR;
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5029 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5030
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5031 frame->level = ssl_encryption_application;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5032 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5033 frame->u.stream.off = 1;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5034 frame->u.stream.len = 1;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5035 frame->u.stream.fin = 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5036
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5037 frame->u.stream.type = frame->type;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5038 frame->u.stream.stream_id = qs->id;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5039 frame->u.stream.offset = c->sent;
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5040 frame->u.stream.length = n;
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5041 frame->u.stream.data = frame->data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5042
8079
dcbb58e7ed11 QUIC: added logging output stream frame offset.
Roman Arutyunyan <arut@nginx.com>
parents: 8078
diff changeset
5043 ngx_sprintf(frame->info, "STREAM id:0x%xL offset:%O len:%uz level:%d",
dcbb58e7ed11 QUIC: added logging output stream frame offset.
Roman Arutyunyan <arut@nginx.com>
parents: 8078
diff changeset
5044 qs->id, c->sent, n, frame->level);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5045
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5046 c->sent += n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5047 qc->streams.sent += n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5048 max_flow -= n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5049
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5050 if (limit) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5051 max_limit -= n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5052 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5053
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5054 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5055 sent += n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5056 nframes++;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5057 #endif
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5058
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5059 for (p = frame->data; n > 0; cl = cl->next) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5060 b = cl->buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5061
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5062 if (!ngx_buf_in_memory(b)) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5063 continue;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5064 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5065
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5066 len = ngx_min(n, (size_t) (b->last - b->pos));
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5067 p = ngx_cpymem(p, b->pos, len);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5068
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5069 b->pos += len;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5070 n -= len;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5071 }
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5072
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
5073 ngx_quic_queue_frame(qc, frame);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5074 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5075
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5076 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5077 "quic send_chain sent:%uz, frames:%ui", sent, nframes);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5078
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5079 return in;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5080 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5081
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5082
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5083 static size_t
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5084 ngx_quic_max_stream_frame(ngx_quic_connection_t *qc)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5085 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5086 /*
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5087 * we need to fit at least 1 frame into a packet, thus account head/tail;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5088 * 25 = 1 + 8x3 is max header for STREAM frame, with 1 byte for frame type
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5089 */
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5090
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5091 return qc->ctp.max_udp_payload_size - NGX_QUIC_MAX_SHORT_HEADER - 25
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5092 - EVP_GCM_TLS_TAG_LEN;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5093 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5094
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5095
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5096 static size_t
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5097 ngx_quic_max_stream_flow(ngx_connection_t *c)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5098 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5099 size_t size;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5100 uint64_t sent, unacked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5101 ngx_quic_stream_t *qs;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5102 ngx_quic_connection_t *qc;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5103
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5104 qs = c->qs;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5105 qc = qs->parent->quic;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5106
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5107 size = NGX_QUIC_STREAM_BUFSIZE;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5108 sent = c->sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5109 unacked = sent - qs->acked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5110
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5111 if (qc->streams.send_max_data == 0) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5112 qc->streams.send_max_data = qc->ctp.initial_max_data;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5113 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5114
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5115 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5116 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5117 "quic send flow hit buffer size");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5118 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5119 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5120
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5121 if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5122 size = NGX_QUIC_STREAM_BUFSIZE - unacked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5123 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5124
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5125 if (qc->streams.sent >= qc->streams.send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5126 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5127 "quic send flow hit MAX_DATA");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5128 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5129 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5130
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5131 if (qc->streams.sent + size > qc->streams.send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5132 size = qc->streams.send_max_data - qc->streams.sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5133 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5134
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5135 if (sent >= qs->send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5136 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5137 "quic send flow hit MAX_STREAM_DATA");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5138 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5139 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5140
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5141 if (sent + size > qs->send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5142 size = qs->send_max_data - sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5143 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5144
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5145 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5146 "quic send flow: %uz", size);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5147
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
5148 return size;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5149 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5150
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5151
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5152 static void
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5153 ngx_quic_stream_cleanup_handler(void *data)
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5154 {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5155 ngx_connection_t *c = data;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5156
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5157 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5158 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5159 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5160 ngx_quic_connection_t *qc;
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5161
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5162 qs = c->qs;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5163 pc = qs->parent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5164 qc = pc->quic;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5165
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5166 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
5167 "quic stream id 0x%xL cleanup", qs->id);
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5168
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5169 ngx_rbtree_delete(&qc->streams.tree, &qs->node);
7825
d42b50d239f4 Fixed memory leak with reordered stream frames.
Vladimir Homutov <vl@nginx.com>
parents: 7823
diff changeset
5170 ngx_quic_free_frames(pc, &qs->fs.frames);
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5171
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5172 if (qc->closing) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
5173 /* schedule handler call to continue ngx_quic_close_connection() */
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5174 ngx_post_event(pc->read, &ngx_posted_events);
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5175 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5176 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
5177
8066
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5178 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5179 || (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0)
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5180 {
8077
62db595a86b5 QUIC: do not send STOP_SENDING after STREAM fin.
Roman Arutyunyan <arut@nginx.com>
parents: 8076
diff changeset
5181 if (!c->read->pending_eof && !c->read->error) {
8066
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5182 frame = ngx_quic_alloc_frame(pc, 0);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5183 if (frame == NULL) {
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5184 return;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5185 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5186
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5187 frame->level = ssl_encryption_application;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5188 frame->type = NGX_QUIC_FT_STOP_SENDING;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5189 frame->u.stop_sending.id = qs->id;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5190 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: 8064
diff changeset
5191
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5192 ngx_sprintf(frame->info, "STOP_SENDING id:0x%xL err:0x%xL level:%d",
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5193 qs->id, frame->u.stop_sending.error_code, frame->level);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5194
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5195 ngx_quic_queue_frame(qc, frame);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5196 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5197 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
5198
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5199 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5200 frame = ngx_quic_alloc_frame(pc, 0);
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5201 if (frame == NULL) {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5202 return;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5203 }
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5204
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5205 frame->level = ssl_encryption_application;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5206 frame->type = NGX_QUIC_FT_MAX_STREAMS;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5207
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5208 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5209 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: 8013
diff changeset
5210 frame->u.max_streams.bidi = 0;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5211
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5212 } else {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5213 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: 8013
diff changeset
5214 frame->u.max_streams.bidi = 1;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5215 }
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5216
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5217 ngx_sprintf(frame->info, "MAX_STREAMS limit:%uL bidi:%ui level=%d",
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5218 frame->u.max_streams.limit,
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5219 frame->u.max_streams.bidi,
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5220 (int) frame->level);
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5221
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5222 ngx_quic_queue_frame(qc, frame);
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5223
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5224 if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5225 /* do not send fin for client unidirectional streams */
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5226 return;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
5227 }
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5228 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5229
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5230 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
5231 "quic stream id 0x%xL send fin", qs->id);
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5232
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5233 frame = ngx_quic_alloc_frame(pc, 0);
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5234 if (frame == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5235 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5236 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5237
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5238 frame->level = ssl_encryption_application;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5239 frame->type = NGX_QUIC_FT_STREAM7; /* OFF=1 LEN=1 FIN=1 */
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5240 frame->u.stream.off = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5241 frame->u.stream.len = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5242 frame->u.stream.fin = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5243
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5244 frame->u.stream.type = frame->type;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5245 frame->u.stream.stream_id = qs->id;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5246 frame->u.stream.offset = c->sent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5247 frame->u.stream.length = 0;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5248 frame->u.stream.data = NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5249
8079
dcbb58e7ed11 QUIC: added logging output stream frame offset.
Roman Arutyunyan <arut@nginx.com>
parents: 8078
diff changeset
5250 ngx_sprintf(frame->info, "STREAM id:0x%xL offset:%O fin:1 level:%d",
dcbb58e7ed11 QUIC: added logging output stream frame offset.
Roman Arutyunyan <arut@nginx.com>
parents: 8078
diff changeset
5251 qs->id, c->sent, frame->level);
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5252
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5253 ngx_quic_queue_frame(qc, frame);
7759
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 7756
diff changeset
5254
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 7756
diff changeset
5255 (void) ngx_quic_output(pc);
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5256 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5257
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
5258
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5259 static ngx_quic_frame_t *
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5260 ngx_quic_alloc_frame(ngx_connection_t *c, size_t size)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5261 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5262 u_char *p;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5263 ngx_queue_t *q;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5264 ngx_quic_frame_t *frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5265 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5266
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5267 if (size) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5268 p = ngx_alloc(size, c->log);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5269 if (p == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5270 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5271 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5272
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5273 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5274 p = NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5275 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5276
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5277 qc = c->quic;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5278
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5279 if (!ngx_queue_empty(&qc->free_frames)) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5280
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5281 q = ngx_queue_head(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5282 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5283
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5284 ngx_queue_remove(&frame->queue);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5285
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5286 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5287 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5288 "quic reuse frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5289 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5290
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5291 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5292 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5293 if (frame == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5294 ngx_free(p);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5295 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5296 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5297
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5298 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5299 ++qc->nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5300 #endif
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5301
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5302 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5303 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5304 "quic alloc frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5305 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5306 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5307
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5308 ngx_memzero(frame, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5309
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5310 frame->data = p;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5311
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5312 return frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5313 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5314
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5315
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5316 static void
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5317 ngx_quic_congestion_ack(ngx_connection_t *c, ngx_quic_frame_t *f)
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5318 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5319 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5320 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5321 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5322
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5323 if (f->plen == 0) {
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5324 return;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5325 }
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5326
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5327 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5328 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5329
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5330 cg->in_flight -= f->plen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5331
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5332 timer = f->last - cg->recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5333
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5334 if ((ngx_msec_int_t) timer <= 0) {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5335 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5336 "quic congestion ack recovery win:%uz, ss:%uz, if:%uz",
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5337 cg->window, cg->ssthresh, cg->in_flight);
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5338
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5339 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5340 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5341
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5342 if (cg->window < cg->ssthresh) {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5343 cg->window += f->plen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5344
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5345 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5346 "quic congestion slow start win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5347 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5348
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5349 } else {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5350 cg->window += qc->tp.max_udp_payload_size * f->plen / cg->window;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5351
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5352 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5353 "quic congestion avoidance win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5354 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5355 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5356
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5357 /* prevent recovery_start from wrapping */
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5358
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5359 timer = cg->recovery_start - ngx_current_msec + qc->tp.max_idle_timeout * 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5360
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5361 if ((ngx_msec_int_t) timer < 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5362 cg->recovery_start = ngx_current_msec - qc->tp.max_idle_timeout * 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5363 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5364 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5365
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5366
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5367 static void
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5368 ngx_quic_congestion_lost(ngx_connection_t *c, ngx_quic_frame_t *f)
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5369 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5370 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5371 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5372 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5373
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5374 if (f->plen == 0) {
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5375 return;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5376 }
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5377
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5378 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5379 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5380
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5381 cg->in_flight -= f->plen;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5382
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5383 timer = f->last - cg->recovery_start;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5384
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5385 if ((ngx_msec_int_t) timer <= 0) {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5386 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5387 "quic congestion lost recovery win:%uz, ss:%uz, if:%uz",
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5388 cg->window, cg->ssthresh, cg->in_flight);
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5389
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5390 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5391 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5392
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5393 cg->recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5394 cg->window /= 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5395
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
5396 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: 7908
diff changeset
5397 cg->window = qc->tp.max_udp_payload_size * 2;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5398 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5399
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5400 cg->ssthresh = cg->window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5401
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5402 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5403 "quic congestion lost win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5404 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5405 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5406
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5407
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5408 static void
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5409 ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5410 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5411 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5412
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5413 qc = c->quic;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5414
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5415 if (frame->data) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5416 ngx_free(frame->data);
7871
df18ae7161b8 Assorted fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7870
diff changeset
5417 frame->data = NULL;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5418 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5419
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5420 ngx_queue_insert_head(&qc->free_frames, &frame->queue);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5421
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5422 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5423 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5424 "quic free frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5425 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5426 }