annotate src/event/ngx_event_quic.c @ 8132:6226f834b420 quic

QUIC: do not resend empty queue when speeding up handshake. If client acknowledged an Initial packet with CRYPTO frame and then sent another Initial packet containing duplicate CRYPTO again, this could result in resending frames off the empty send queue.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 05 Oct 2020 13:02:53 +0100
parents 3bde57a0e6ce
children 1d4417e4f2d0
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
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
49
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
50 typedef struct {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
51 ngx_rbtree_t tree;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
52 ngx_rbtree_node_t sentinel;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
53
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
54 uint64_t received;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
55 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
56 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
57 uint64_t send_max_data;
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
58
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
59 uint64_t server_max_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
60 uint64_t server_max_streams_bidi;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
61 uint64_t server_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
62 uint64_t server_streams_bidi;
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
63
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
64 uint64_t client_max_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
65 uint64_t client_max_streams_bidi;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
66 uint64_t client_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
67 uint64_t client_streams_bidi;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
68 } ngx_quic_streams_t;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
69
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
70
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
71 typedef struct {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
72 size_t in_flight;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
73 size_t window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
74 size_t ssthresh;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
75 ngx_msec_t recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
76 } ngx_quic_congestion_t;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
77
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
78
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
79 /*
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
80 * 12.3. Packet Numbers
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
81 *
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
82 * 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
83 * 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
84 * 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
85 * are also Initial packets.
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
86 */
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
87 typedef struct {
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
88 ngx_quic_secret_t client_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
89 ngx_quic_secret_t server_secret;
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
90
7878
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
91 uint64_t pnum; /* to be sent */
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
92 uint64_t largest_ack; /* received from peer */
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
93 uint64_t largest_pn; /* received from peer */
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
94
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
95 ngx_queue_t frames;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
96 ngx_queue_t sent;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
97 } ngx_quic_send_ctx_t;
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
98
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
99
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
100 struct ngx_quic_connection_s {
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
101 ngx_str_t scid; /* initial client ID */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
102 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
103 ngx_str_t odcid; /* original server ID */
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
104 ngx_str_t token;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
105
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
106 ngx_queue_t client_ids;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
107 ngx_queue_t free_client_ids;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
108 ngx_uint_t nclient_ids;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
109 uint64_t max_retired_seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
110 uint64_t curr_seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
111
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
112 ngx_uint_t client_tp_done;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
113 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
114 ngx_quic_tp_t ctp;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
115
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
116 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
117 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
118 ngx_quic_secrets_t next_key;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
119 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
120
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
121 ngx_quic_conf_t *conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
122
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
123 ngx_event_t push;
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
124 ngx_event_t pto;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
125 ngx_event_t close;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
126 ngx_queue_t free_frames;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
127 ngx_msec_t last_cc;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
128
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
129 ngx_msec_t latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
130 ngx_msec_t avg_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
131 ngx_msec_t min_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
132 ngx_msec_t rttvar;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
133
8056
f9b1a4e52597 QUIC: changed c->quic->pto_count type to ngx_uint_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8055
diff changeset
134 ngx_uint_t pto_count;
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
135
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
136 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
137 ngx_uint_t nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
138 #endif
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
139
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
140 ngx_quic_streams_t streams;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
141 ngx_quic_congestion_t congestion;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
142 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
143
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
144 ngx_uint_t error;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
145 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
146 ngx_uint_t error_ftype;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
147 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
148
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
149 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
150 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
151 unsigned closing:1;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
152 unsigned draining:1;
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
153 unsigned key_phase:1;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
154 unsigned in_retry:1;
7874
1245e274b9ba Avoided excessive definitions for connection state.
Vladimir Homutov <vl@nginx.com>
parents: 7871
diff changeset
155 unsigned initialized:1;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
156 unsigned validated:1;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
157 };
7672
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 7671
diff changeset
158
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
159
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
160 typedef struct {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
161 ngx_queue_t queue;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
162 uint64_t seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
163 size_t len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
164 u_char id[NGX_QUIC_CID_LEN_MAX];
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
165 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
166 } ngx_quic_client_id_t;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
167
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
168
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
169 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
170 ngx_quic_frame_t *frame, void *data);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
171
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
172
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
173 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
174 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
175 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
176 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
177 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
178 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
179 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
180 #else
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
181 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
182 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
183 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
184 #endif
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
185
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
186 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
187 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
188 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
189 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
190 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
191
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
192
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
193 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
194 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
195 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
196 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
197 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
198 ngx_quic_header_t *pkt);
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
199 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
200 ngx_quic_header_t *inpkt);
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
201 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
202 ngx_quic_connection_t *qc, ngx_str_t *odcid);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
203 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
204 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
205 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
206 ngx_quic_header_t *pkt);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
207 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
208 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
209 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
210
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
211 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
212 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
213 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
214 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
215 ngx_quic_connection_t *qc);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
216
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
217 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
218 ngx_quic_conf_t *conf);
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
219 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
220 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
221 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
222 static void ngx_quic_discard_ctx(ngx_connection_t *c,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
223 enum ssl_encryption_level_t level);
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
224 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
225 ngx_quic_header_t *pkt);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
226 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
227 ngx_quic_header_t *pkt);
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
228 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_header_t *pkt);
7988
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
229 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
230 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
231 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
232 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
233
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
234 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
235 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
236 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
237 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
238 ngx_msec_t *send_time);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
239 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
240 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
241 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
242 ngx_quic_send_ctx_t *ctx);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
243 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
244 ngx_quic_frame_t *f);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
245
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
246 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
247 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
248 ngx_quic_frame_handler_pt handler, void *data);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
249 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
250 ngx_quic_frame_t *f, uint64_t offset_in);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
251 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
252 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
253
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
254 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
255 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
256 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
257 ngx_quic_frame_t *frame, void *data);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
258 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
259 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
260 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
261 ngx_quic_frame_t *frame, void *data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
262
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
263 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
264 ngx_quic_max_data_frame_t *f);
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
265 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
266 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
267 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
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 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
276 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
277 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
278 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
279 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
280 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
281 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
282 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
283 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
284 ngx_quic_connection_t *qc);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
285
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
286 static void ngx_quic_queue_frame(ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
287 ngx_quic_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
288
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
289 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
290 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
291 ngx_quic_send_ctx_t *ctx);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
292 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
293 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
294 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
295
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
296 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
297 ngx_quic_send_ctx_t *ctx);
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
298 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
299 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
300 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
301 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
302 ngx_quic_send_ctx_t *ctx);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
303 static void ngx_quic_push_handler(ngx_event_t *ev);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
304
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
305 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
306 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
307 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
308 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
309 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
310 uint64_t id);
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
311 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
312 uint64_t id, size_t rcvbuf_size);
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
313 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
314 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
315 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
316 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
317 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
318 ngx_chain_t *in, off_t limit);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
319 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
320 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
321 static void ngx_quic_stream_cleanup_handler(void *data);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
322 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
323 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
324
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
325 static void ngx_quic_congestion_ack(ngx_connection_t *c,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
326 ngx_quic_frame_t *frame);
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
327 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
328 ngx_quic_frame_t *frame);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
329
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
330
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
331 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
332 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
333 ngx_quic_set_read_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
334 ngx_quic_set_write_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
335 #else
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
336 ngx_quic_set_encryption_secrets,
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
337 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
338 ngx_quic_add_handshake_data,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
339 ngx_quic_flush_flight,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
340 ngx_quic_send_alert,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
341 };
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
342
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
343
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
344 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
345
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
346 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
347 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
348 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
349 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
350 {
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
351 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
352 ngx_quic_secrets_t *keys;
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
353
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
354 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
355
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
356 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
357 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
358 "quic ngx_quic_set_read_secret() level:%d", level);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
359 ngx_quic_hexdump(c->log, "quic read secret", rsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
360 #endif
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
361
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
362 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
363
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
364 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
365 rsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
366 &keys->client);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
367 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
368
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
369
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
370 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
371 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
372 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
373 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
374 {
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
375 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
376 ngx_quic_secrets_t *keys;
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
377
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
378 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
379
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
380 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
381 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
382 "quic ngx_quic_set_write_secret() level:%d", level);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
383 ngx_quic_hexdump(c->log, "quic write secret", wsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
384 #endif
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
385
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
386 keys = &c->quic->keys[level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
387
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
388 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
389 wsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
390 &keys->server);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
391 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
392
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
393 #else
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
394
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
395 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
396 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
397 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
398 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
399 {
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
400 ngx_int_t rc;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
401 ngx_connection_t *c;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
402 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
403
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
404 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
405
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
406 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
407 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
408 "quic ngx_quic_set_encryption_secrets() level:%d", level);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
409 ngx_quic_hexdump(c->log, "quic read", rsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
410 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
411
7793
0ae50d90658a Fixed build with OpenSSL using old callbacks API.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7792
diff changeset
412 keys = &c->quic->keys[level];
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
413
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
414 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
415 rsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
416 &keys->client);
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
417 if (rc != 1) {
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
418 return rc;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
419 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
420
7769
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
421 if (level == ssl_encryption_early_data) {
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
422 return 1;
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
423 }
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
424
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
425 #ifdef NGX_QUIC_DEBUG_CRYPTO
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
426 ngx_quic_hexdump(c->log, "quic write", wsecret, secret_len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
427 #endif
7769
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
428
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
429 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
430 wsecret, secret_len,
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
431 &keys->server);
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
432 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
433
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
434 #endif
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
435
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
436
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
437 static int
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
438 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
439 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
440 {
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
441 u_char *p, *end;
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
442 size_t client_params_len, fsize, limit;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
443 const uint8_t *client_params;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
444 ngx_quic_frame_t *frame;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
445 ngx_connection_t *c;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
446 ngx_quic_connection_t *qc;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
447 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
448
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
449 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
450 qc = c->quic;
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
451
7652
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 7651
diff changeset
452 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
453 "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
454
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
455 if (!qc->client_tp_done) {
7933
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
456 /*
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
457 * things to do once during handshake: check ALPN and transport
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
458 * parameters; we want to break handshake if something is wrong
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
459 * here;
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
460 */
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
461
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
462 #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
463 if (qc->conf->require_alpn) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
464 unsigned int len;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
465 const unsigned char *data;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
466
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
467 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
468
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
469 if (len == 0) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
470 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
471 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
472
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
473 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
474 "quic unsupported protocol in ALPN extension");
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
475 return 0;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
476 }
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 #endif
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
479
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
480 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
481 &client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
482
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
483 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
484 "quic SSL_get_peer_quic_transport_params():"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
485 " params_len %ui", client_params_len);
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
486
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
487 if (client_params_len == 0) {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
488 /* 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
489 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
490 qc->error_reason = "missing transport parameters";
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
491
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
492 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
493 "missing transport parameters");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
494 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
495 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
496
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
497 p = (u_char *) client_params;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
498 end = p + client_params_len;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
499
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
500 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
501 != NGX_OK)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
502 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
503 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
504 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
505
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
506 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
507 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
508
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
509 if (qc->ctp.max_idle_timeout > 0
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
510 && 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
511 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
512 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
513 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
514
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
515 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
516 || 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
517 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
518 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
519 qc->error_reason = "invalid maximum packet size";
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 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
522 "quic maximum packet size is invalid");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
523 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
524 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
525
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
526 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
527 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
528 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
529 "quic client maximum packet size truncated");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
530 }
7927
391d06a51bc0 Limited max udp payload size for outgoing packets.
Vladimir Homutov <vl@nginx.com>
parents: 7926
diff changeset
531
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
532 #if (NGX_QUIC_DRAFT_VERSION >= 28)
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
533 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
534 || 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
535 qc->scid.len) != 0)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
536 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
537 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
538 "quic client initial_source_connection_id "
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
539 "mismatch");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
540 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
541 }
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
542 #endif
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
543
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
544 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
545 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
546
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
547 qc->client_tp_done = 1;
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
548 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
549
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
550 /*
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
551 * 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
552 * 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
553 */
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
554 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
555 - EVP_GCM_TLS_TAG_LEN;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
556
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
557 fs = &qc->crypto[level];
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
558
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
559 p = (u_char *) data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
560 end = (u_char *) data + len;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
561
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
562 while (p < end) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
563
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
564 fsize = ngx_min(limit, (size_t) (end - p));
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
565
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
566 frame = ngx_quic_alloc_frame(c, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
567 if (frame == NULL) {
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
568 return 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
569 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
570
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
571 ngx_memcpy(frame->data, p, fsize);
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
572
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
573 frame->level = level;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
574 frame->type = NGX_QUIC_FT_CRYPTO;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
575 frame->u.crypto.offset = fs->sent;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
576 frame->u.crypto.length = fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
577 frame->u.crypto.data = frame->data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
578
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
579 fs->sent += fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
580 p += fsize;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
581
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
582 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
583 fsize, level);
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 ngx_quic_queue_frame(qc, frame);
7652
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 7651
diff changeset
586 }
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
587
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
588 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
589 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
590
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
591
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
592 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
593 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
594 {
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
595 #if (NGX_DEBUG)
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
596 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
597
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
598 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
599
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
600 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
601 "quic ngx_quic_flush_flight()");
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
602 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
603 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
604 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
605
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
606
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
607 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
608 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
609 uint8_t alert)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
610 {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
611 ngx_connection_t *c;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
612 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
613
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
614 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
615
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
616 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
617 "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
618 (int) level, (int) alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
619
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
620 qc = c->quic;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
621 if (qc == NULL) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
622 return 1;
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
623 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
624
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
625 qc->error_level = level;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
626 qc->error = NGX_QUIC_ERR_CRYPTO(alert);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
627 qc->error_reason = "TLS alert";
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
628 qc->error_app = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
629 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
630
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
631 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
632 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
633 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
634
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
635 return 1;
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
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
638
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
639 void
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
640 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
641 {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
642 ngx_int_t rc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
643
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
644 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
645
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
646 c->log->action = "QUIC initialization";
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
647
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
648 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
649 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
650 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
651 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
652 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
653
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
654 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
655 : c->quic->tp.max_idle_timeout);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
656
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
657 c->read->handler = ngx_quic_input_handler;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
658
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
659 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
660 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
661
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
662
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
663 static ngx_quic_connection_t *
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
664 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
665 ngx_quic_header_t *pkt)
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
666 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
667 ngx_uint_t i;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
668 ngx_quic_tp_t *ctp;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
669 ngx_quic_client_id_t *cid;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
670 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
671
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
672 c->log->action = "creating new quic connection";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
673
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
674 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
675 if (qc == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
676 return NULL;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
677 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
678
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
679 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
680 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
681
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
682 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
683 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
684 ngx_queue_init(&qc->send_ctx[i].sent);
7816
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7815
diff changeset
685 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
686 qc->send_ctx[i].largest_ack = (uint64_t) -1;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
687 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
688
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
689 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
690 ngx_queue_init(&qc->crypto[i].frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
691 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
692
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
693 ngx_queue_init(&qc->free_frames);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
694 ngx_queue_init(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
695 ngx_queue_init(&qc->free_client_ids);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
696
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
697 qc->avg_rtt = NGX_QUIC_INITIAL_RTT;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
698 qc->rttvar = NGX_QUIC_INITIAL_RTT / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
699 qc->min_rtt = NGX_TIMER_INFINITE;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
700
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
701 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
702 * qc->latest_rtt = 0
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
703 * qc->nclient_ids = 0
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
704 * qc->max_retired_seqnum = 0
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
705 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
706
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
707 qc->received = pkt->raw->last - pkt->raw->start;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
708
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
709 qc->pto.log = c->log;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
710 qc->pto.data = c;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
711 qc->pto.handler = ngx_quic_pto_handler;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
712 qc->pto.cancelable = 1;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
713
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
714 qc->push.log = c->log;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
715 qc->push.data = c;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
716 qc->push.handler = ngx_quic_push_handler;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
717 qc->push.cancelable = 1;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
718
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
719 qc->conf = conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
720 qc->tp = conf->tp;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
721
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
722 ctp = &qc->ctp;
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
723 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
724 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
725 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
726
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
727 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
728
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
729 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
730 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
731
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
732 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
733 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
734 14720));
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
735 qc->congestion.ssthresh = NGX_MAX_SIZE_T_VALUE;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
736 qc->congestion.recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
737
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
738 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
739 return NULL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
740 }
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
741
7916
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
742 #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
743 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
744 #endif
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
745 qc->tp.initial_scid = qc->dcid;
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
746
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
747 qc->scid.len = pkt->scid.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
748 qc->scid.data = ngx_pnalloc(c->pool, qc->scid.len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
749 if (qc->scid.data == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
750 return NULL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
751 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
752 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
753
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
754 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
755 if (cid == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
756 return NULL;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
757 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
758
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
759 cid->seqnum = 0;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
760 cid->len = pkt->scid.len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
761 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
762
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
763 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
764 qc->nclient_ids++;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
765 qc->curr_seqnum = 0;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
766
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
767 return qc;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
768 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
769
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
770
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
771 static ngx_int_t
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
772 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
773 ngx_quic_header_t *pkt)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
774 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
775 u_char *token;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
776 size_t len, max;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
777 uint16_t rndbytes;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
778 u_char buf[NGX_QUIC_MAX_SR_PACKET];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
779
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
780 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
781 "quic handle stateless reset output");
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
782
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
783 if (conf->sr_token_key.len == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
784 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
785 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
786
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
787 if (pkt->len <= NGX_QUIC_MIN_PKT_LEN) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
788 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
789 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
790
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
791 if (pkt->len <= NGX_QUIC_MIN_SR_PACKET) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
792 len = pkt->len - 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
793
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
794 } else {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
795 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
796
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
797 if (RAND_bytes((u_char *) &rndbytes, sizeof(rndbytes)) != 1) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
798 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
799 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
800
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
801 len = (rndbytes % (max - NGX_QUIC_MIN_SR_PACKET + 1))
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
802 + NGX_QUIC_MIN_SR_PACKET;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
803 }
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 (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
806 return NGX_ERROR;
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 buf[0] &= ~NGX_QUIC_PKT_LONG;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
810 buf[0] |= NGX_QUIC_PKT_FIXED_BIT;
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 token = &buf[len - NGX_QUIC_SR_TOKEN_LEN];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
813
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
814 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
815 != NGX_OK)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
816 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
817 return NGX_ERROR;
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
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
820 (void) c->send(c, buf, len);
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 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
823 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
824
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 static ngx_int_t
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
827 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
828 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
829 u_char *tail, ch;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
830 ngx_uint_t i;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
831 ngx_queue_t *q;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
832 ngx_quic_client_id_t *cid;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
833 ngx_quic_connection_t *qc;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
834
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
835 qc = c->quic;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
836
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
837 /* A stateless reset uses an entire UDP datagram */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
838 if (pkt->raw->start != pkt->data) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
839 return NGX_DECLINED;
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 tail = pkt->raw->last - NGX_QUIC_SR_TOKEN_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 for (q = ngx_queue_head(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
845 q != ngx_queue_sentinel(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
846 q = ngx_queue_next(q))
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 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
849
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
850 if (cid->seqnum == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
851 /* no stateless reset token in initial connection id */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
852 continue;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
853 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
854
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
855 /* constant time comparison */
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 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
858 ch |= tail[i] ^ cid->sr_token[i];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
859 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
860
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
861 if (ch == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
862 return NGX_OK;
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 }
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 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
867 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
868
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 static ngx_int_t
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
871 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
872 {
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
873 size_t len;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
874 ngx_quic_header_t pkt;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
875
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
876 /* buffer size is calculated assuming a single supported version */
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
877 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
878
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
879 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
880 "sending version negotiation packet");
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
881
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
882 pkt.log = c->log;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
883 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
884 pkt.dcid = inpkt->scid;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
885 pkt.scid = inpkt->dcid;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
886
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
887 len = ngx_quic_create_version_negotiation(&pkt, buf);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
888
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
889 #ifdef NGX_QUIC_DEBUG_PACKETS
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
890 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
891 #endif
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
892
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
893 (void) c->send(c, buf, len);
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 return NGX_ERROR;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
896 }
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
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
899 static ngx_int_t
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
900 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
901 ngx_str_t *odcid)
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
902 {
8095
2727d402e5a5 QUIC: switched to using fixed-length server connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8094
diff changeset
903 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
904 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
905 if (qc->dcid.data == NULL) {
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
906 return NGX_ERROR;
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
907 }
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
908
8095
2727d402e5a5 QUIC: switched to using fixed-length server connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8094
diff changeset
909 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
910 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
911 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
912
7859
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
913 #ifdef NGX_QUIC_DEBUG_PACKETS
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
914 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
915 #endif
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
916
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
917 qc->odcid.len = odcid->len;
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
918 qc->odcid.data = ngx_pstrdup(c->pool, odcid);
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
919 if (qc->odcid.data == NULL) {
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
920 return NGX_ERROR;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
921 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
922
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
923 return NGX_OK;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
924 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
925
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
926
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
927 static ngx_int_t
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
928 ngx_quic_send_retry(ngx_connection_t *c)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
929 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
930 ssize_t len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
931 ngx_str_t res, token;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
932 ngx_quic_header_t pkt;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
933 u_char buf[NGX_QUIC_RETRY_BUFFER_SIZE];
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
934
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
935 if (ngx_quic_new_token(c, &token) != NGX_OK) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
936 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
937 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
938
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
939 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
940 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
941 pkt.log = c->log;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
942 pkt.odcid = c->quic->odcid;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
943 pkt.dcid = c->quic->scid;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
944 pkt.scid = c->quic->dcid;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
945 pkt.token = token;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
946
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
947 res.data = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
948
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
949 if (ngx_quic_encrypt(&pkt, NULL, &res) != NGX_OK) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
950 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
951 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
952
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
953 #ifdef NGX_QUIC_DEBUG_PACKETS
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
954 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
955 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
956
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
957 len = c->send(c, res.data, res.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
958 if (len == NGX_ERROR || (size_t) len != res.len) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
959 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
960 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
961
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
962 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
963 #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
964 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
965 #endif
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
966 c->quic->tp.retry_scid = c->quic->dcid;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
967 c->quic->in_retry = 1;
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 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
970 }
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 static ngx_int_t
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
974 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
975 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
976 int len, iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
977 u_char *data, *p, *key, *iv;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
978 ngx_msec_t now;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
979 EVP_CIPHER_CTX *ctx;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
980 const EVP_CIPHER *cipher;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
981 struct sockaddr_in *sin;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
982 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
983 struct sockaddr_in6 *sin6;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
984 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
985 u_char in[NGX_QUIC_MAX_TOKEN_SIZE];
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
986
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
987 switch (c->sockaddr->sa_family) {
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 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
990 case AF_INET6:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
991 sin6 = (struct sockaddr_in6 *) c->sockaddr;
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 len = sizeof(struct in6_addr);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
994 data = sin6->sin6_addr.s6_addr;
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 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
997 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
998
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
999 #if (NGX_HAVE_UNIX_DOMAIN)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1000 case AF_UNIX:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1001
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1002 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
1003 data = c->addr_text.data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1004
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1005 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1006 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1007
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1008 default: /* AF_INET */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1009 sin = (struct sockaddr_in *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1010
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1011 len = sizeof(in_addr_t);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1012 data = (u_char *) &sin->sin_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1013
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1014 break;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1017 p = ngx_cpymem(in, data, len);
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 now = ngx_current_msec;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1020 len += sizeof(now);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1021 ngx_memcpy(p, &now, sizeof(now));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1022
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1023 cipher = EVP_aes_256_cbc();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1024 iv_len = EVP_CIPHER_iv_length(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1025
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1026 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
1027 token->data = ngx_pnalloc(c->pool, token->len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1028 if (token->data == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1029 return NGX_ERROR;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1032 ctx = EVP_CIPHER_CTX_new();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1033 if (ctx == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1034 return NGX_ERROR;
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
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
1037 key = c->quic->conf->token_key;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1038 iv = token->data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1039
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1040 if (RAND_bytes(iv, iv_len) <= 0
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1041 || !EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv))
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 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1044 return NGX_ERROR;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1047 token->len = iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1048
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1049 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
1050 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1051 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1052 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1053
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1054 token->len += len;
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 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
1057 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1058 return NGX_ERROR;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1061 token->len += len;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1065 #ifdef NGX_QUIC_DEBUG_PACKETS
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1066 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
1067 #endif
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 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1070 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1071
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 static ngx_int_t
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1074 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
1075 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1076 int len, tlen, iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1077 u_char *key, *iv, *p, *data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1078 ngx_msec_t msec;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1079 EVP_CIPHER_CTX *ctx;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1080 const EVP_CIPHER *cipher;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1081 struct sockaddr_in *sin;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1082 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1083 struct sockaddr_in6 *sin6;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1084 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1085 ngx_quic_connection_t *qc;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1086 u_char tdec[NGX_QUIC_MAX_TOKEN_SIZE];
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1087
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1088 qc = c->quic;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1089
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1090 /* Retry token */
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 if (qc->token.len) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1093 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
1094 goto bad_token;
7860
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1097 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
1098 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1099 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1100
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1101 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1102 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1103
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1104 /* NEW_TOKEN in a previous connection */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1105
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1106 cipher = EVP_aes_256_cbc();
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
1107 key = c->quic->conf->token_key;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1108 iv = pkt->token.data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1109 iv_len = EVP_CIPHER_iv_length(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1110
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1111 /* sanity checks */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1112
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1113 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
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 (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
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 ctx = EVP_CIPHER_CTX_new();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1122 if (ctx == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1123 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1124 }
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 if (!EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv)) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1127 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1128 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1129 }
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 p = pkt->token.data + iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1132 len = pkt->token.len - iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1133
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1134 if (EVP_DecryptUpdate(ctx, tdec, &len, p, len) != 1) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1135 EVP_CIPHER_CTX_free(ctx);
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1136 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1137 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1138
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1139 if (EVP_DecryptFinal_ex(ctx, tdec + len, &tlen) <= 0) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1140 EVP_CIPHER_CTX_free(ctx);
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1141 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1142 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1143
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1144 EVP_CIPHER_CTX_free(ctx);
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 switch (c->sockaddr->sa_family) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1147
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1148 #if (NGX_HAVE_INET6)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1149 case AF_INET6:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1150 sin6 = (struct sockaddr_in6 *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1151
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1152 len = sizeof(struct in6_addr);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1153 data = sin6->sin6_addr.s6_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1154
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1155 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1156 #endif
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 #if (NGX_HAVE_UNIX_DOMAIN)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1159 case AF_UNIX:
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1160
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1161 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
1162 data = c->addr_text.data;
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 break;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1165 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1166
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1167 default: /* AF_INET */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1168 sin = (struct sockaddr_in *) c->sockaddr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1169
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1170 len = sizeof(in_addr_t);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1171 data = (u_char *) &sin->sin_addr;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1172
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1173 break;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1176 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
1177 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1178 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1179
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1180 ngx_memcpy(&msec, tdec + len, sizeof(msec));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1181
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1182 if (ngx_current_msec - msec > NGX_QUIC_RETRY_LIFETIME) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1183 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
1184 return NGX_DECLINED;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1185 }
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 return NGX_OK;
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1188
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1189 bad_token:
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1190
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1191 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
1192
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1193 qc->error = NGX_QUIC_ERR_INVALID_TOKEN;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1194 qc->error_reason = "invalid_token";
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1195
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1196 return NGX_ERROR;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1197 }
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 static ngx_int_t
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
1201 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
1202 {
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1203 u_char *p;
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1204 size_t clen;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1205 ssize_t len;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1206 ngx_ssl_conn_t *ssl_conn;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1207 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1208
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1209 qc = c->quic;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1210
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1211 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
1212 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1213 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1214
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1215 ssl_conn = c->ssl->connection;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1216
7698
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1217 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
1218 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1219 "quic SSL_set_quic_method() failed");
7698
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1220 return NGX_ERROR;
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1221 }
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1222
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1223 #ifdef SSL_READ_EARLY_DATA_SUCCESS
8102
b52b2a33b0e5 QUIC: fixed build with OpenSSL after bed310672f39.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8101
diff changeset
1224 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
1225 SSL_set_quic_early_data_enabled(ssl_conn, 1);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1226 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1227 #endif
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1228
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1229 if (qc->conf->sr_token_key.len) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1230 qc->tp.sr_enabled = 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1231
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1232 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
1233 qc->tp.sr_token)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1234 != NGX_OK)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1235 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1236 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1237 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1238
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1239 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
1240 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
1241 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1242
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1243 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
1244 /* always succeeds */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1245
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1246 p = ngx_pnalloc(c->pool, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1247 if (p == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1248 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1249 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1250
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1251 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
1252 if (len < 0) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1253 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1254 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1255
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1256 #ifdef NGX_QUIC_DEBUG_PACKETS
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
1257 ngx_quic_hexdump(c->log, "quic transport parameters", p, len);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1258 #endif
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1259
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1260 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
1261 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1262 "quic SSL_set_quic_transport_params() failed");
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1263 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1264 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1265
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1266 #if NGX_OPENSSL_QUIC_ZRTT_CTX
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1267 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
1268 ngx_log_error(NGX_LOG_INFO, c->log, 0,
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1269 "quic SSL_set_quic_early_data_context() failed");
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1270 return NGX_ERROR;
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1271 }
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1272 #endif
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1273
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1274 return NGX_OK;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1275 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1276
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1277
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1278 static ngx_inline size_t
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1279 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
1280 {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1281 /* TODO: path MTU discovery */
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1282
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1283 #if (NGX_HAVE_INET6)
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1284 if (c->sockaddr->sa_family == AF_INET6) {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1285 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT6;
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1286 }
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1287 #endif
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1288
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1289 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT;
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1290 }
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1291
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1292
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1293 static void
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1294 ngx_quic_input_handler(ngx_event_t *rev)
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1295 {
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1296 ssize_t n;
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1297 ngx_int_t rc;
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1298 ngx_buf_t b;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1299 ngx_connection_t *c;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1300 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
1301 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
1302
7871
df18ae7161b8 Assorted fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7870
diff changeset
1303 ngx_memzero(&b, sizeof(ngx_buf_t));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1304 b.start = buf;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
1305 b.end = buf + sizeof(buf);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1306 b.pos = b.last = b.start;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1307 b.memory = 1;
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1308
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1309 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
1310 qc = c->quic;
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1311
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1312 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler");
7678
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1313
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1314 if (rev->timedout) {
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1315 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1316 "quic client timed out");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1317 ngx_quic_close_connection(c, NGX_DONE);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1318 return;
7678
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1319 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1320
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1321 if (c->close) {
7937
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7934
diff changeset
1322 qc->error_reason = "graceful shutdown";
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7934
diff changeset
1323 ngx_quic_close_connection(c, NGX_OK);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1324 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1325 }
7686
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7684
diff changeset
1326
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1327 n = c->recv(c, b.start, b.end - b.start);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 7680
diff changeset
1328
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1329 if (n == NGX_AGAIN) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1330 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1331 ngx_quic_close_connection(c, NGX_OK);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1332 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1333 return;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1334 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1335
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1336 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1337 c->read->eof = 1;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1338 ngx_quic_close_connection(c, NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1339 return;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1340 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1341
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1342 b.last += n;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1343 qc->received += n;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1344
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1345 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
1346
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1347 if (rc == NGX_ERROR) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1348 ngx_quic_close_connection(c, NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1349 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1350 }
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1351
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1352 if (rc == NGX_DECLINED) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1353 return;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1354 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1355
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1356 /* rc == NGX_OK */
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1357
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1358 qc->send_timer_set = 0;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1359 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
1360 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1361
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1362
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1363 static void
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1364 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
1365 {
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1366 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
1367
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1368 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1369 "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
1370
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1371 if (!c->quic) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1372 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1373 "quic close connection early error");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1374
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1375 } 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
1376 return;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
1377 }
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1378
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1379 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1380 (void) ngx_ssl_shutdown(c);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1381 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1382
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1383 if (c->read->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1384 ngx_del_timer(c->read);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1385 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1386
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1387 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1388 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1389 #endif
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1390
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1391 c->destroyed = 1;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1392
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1393 pool = c->pool;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1394
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1395 ngx_close_connection(c);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1396
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1397 ngx_destroy_pool(pool);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1398 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1399
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1400
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1401 static ngx_int_t
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1402 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
1403 {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1404 ngx_uint_t i;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1405 ngx_quic_send_ctx_t *ctx;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1406 ngx_quic_connection_t *qc;
7831
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 qc = c->quic;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1409
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1410 if (!qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1411
7875
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1412 /* 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
1413 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
1414 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
1415 ngx_quic_free_frames(c, &ctx->sent);
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1416 }
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
1417
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1418 if (rc == NGX_DONE) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1419
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1420 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1421 * 10.2. Idle Timeout
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1422 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1423 * 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
1424 * 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
1425 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1426
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1427 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
1428 "quic closing %s connection",
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1429 qc->draining ? "drained" : "idle");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1430
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1431 } else {
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1432
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1433 /*
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1434 * 10.3. Immediate Close
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1435 *
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1436 * 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
1437 * to terminate the connection immediately.
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1438 */
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1439
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1440 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
1441 : ssl_encryption_initial;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1442
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1443 if (rc == NGX_OK) {
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1444 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
1445 "quic immediate close, drain = %d",
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1446 qc->draining);
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1447
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1448 qc->close.log = c->log;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1449 qc->close.data = c;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1450 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
1451 qc->close.cancelable = 1;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1452
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1453 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
1454
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
1455 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
1456
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1457 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
1458
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1459 } else {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1460 if (qc->error == 0 && !qc->error_app) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1461 qc->error = NGX_QUIC_ERR_INTERNAL_ERROR;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1462 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1463
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1464 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
1465 "quic immediate close due to %serror: %ui %s",
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1466 qc->error_app ? "app " : "", qc->error,
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1467 qc->error_reason ? qc->error_reason : "");
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1468 }
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1469
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1470 (void) ngx_quic_send_cc(c);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1471
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1472 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
1473 /* 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
1474 qc->error_level = ssl_encryption_initial;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1475 (void) ngx_quic_send_cc(c);
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
1476 }
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1477 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1478
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1479 qc->closing = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1480 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1481
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1482 if (rc == NGX_ERROR && qc->close.timer_set) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1483 /* 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
1484 ngx_del_timer(&qc->close);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1485 }
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1486
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1487 if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1488 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1489 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1490
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1491 if (qc->push.timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1492 ngx_del_timer(&qc->push);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1493 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1494
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1495 if (qc->pto.timer_set) {
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1496 ngx_del_timer(&qc->pto);
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1497 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1498
7929
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1499 if (qc->push.posted) {
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1500 ngx_delete_posted_event(&qc->push);
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1501 }
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
1502
8091
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1503 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
1504 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
1505 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1506
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1507 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
1508 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
1509 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
1510 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1511
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1512 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
1513 return NGX_AGAIN;
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1514 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
1515
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1516 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
1517 "quic part of connection is terminated");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1518
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1519 /* 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
1520 c->quic = NULL;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1521
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1522 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1523 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1524
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1525
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1526 void
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1527 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
1528 const char *reason)
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1529 {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1530 ngx_quic_connection_t *qc;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1531
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1532 qc = c->quic;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1533 qc->error = err;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1534 qc->error_reason = reason;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1535 qc->error_app = 1;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1536 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1537
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1538 ngx_quic_close_connection(c, NGX_ERROR);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1539 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1540
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
1541
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1542 static void
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1543 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
1544 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1545 ngx_connection_t *c;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1546
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1547 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
1548
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1549 c = ev->data;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1550 ngx_quic_close_connection(c, NGX_DONE);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1551 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1552
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1553
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1554 static ngx_int_t
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1555 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
1556 {
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1557 ngx_event_t *rev, *wev;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1558 ngx_rbtree_t *tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1559 ngx_rbtree_node_t *node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1560 ngx_quic_stream_t *qs;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1561
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1562 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1563 ngx_uint_t ns;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1564 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1565
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1566 tree = &qc->streams.tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1567
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1568 if (tree->root == tree->sentinel) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1569 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1570 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1571
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1572 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1573 ns = 0;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1574 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1575
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1576 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1577 node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1578 node = ngx_rbtree_next(tree, node))
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1579 {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1580 qs = (ngx_quic_stream_t *) node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1581
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1582 rev = qs->c->read;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1583 rev->error = 1;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1584 rev->ready = 1;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1585
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1586 wev = qs->c->write;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1587 wev->error = 1;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
1588 wev->ready = 1;
7831
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 ngx_post_event(rev, &ngx_posted_events);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1591
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1592 if (rev->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1593 ngx_del_timer(rev);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1594 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1595
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1596 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1597 ns++;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1598 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1599 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1600
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1601 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
1602 "quic connection has %ui active streams", ns);
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 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1605 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1606
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1607
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1608 static ngx_int_t
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1609 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
1610 {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1611 u_char *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1612 ngx_int_t rc;
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1613 ngx_uint_t good;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1614 ngx_quic_header_t pkt;
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1615
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1616 good = 0;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1617
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1618 p = b->pos;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1619
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1620 while (p < b->last) {
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1621 c->log->action = "processing quic packet";
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1622
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1623 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1624 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1625 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1626 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1627 pkt.log = c->log;
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
1628 pkt.flags = p[0];
8097
a89a58c642ef QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents: 8096
diff changeset
1629 pkt.raw->pos++;
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1630
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1631 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
1632
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1633 if (rc == NGX_ERROR) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1634 return NGX_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1635 }
7672
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 7671
diff changeset
1636
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1637 if (rc == NGX_OK) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1638 good = 1;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1639 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1640
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1641 /* NGX_OK || NGX_DECLINED */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1642
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1643 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1644 * 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
1645 * to decrypt packet.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1646 * 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
1647 * retransmission:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1648 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1649 * 12.2. Coalescing Packets:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1650 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1651 * For example, if decryption fails (because the keys are
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1652 * not available or any other reason), the receiver MAY either
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1653 * discard or buffer the packet for later processing and MUST
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1654 * attempt to process the remaining packets.
8073
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
1655 *
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
1656 * 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
1657 * or cannot be parsed properly.
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1658 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1659
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1660 /* 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
1661 b->pos = pkt.data + pkt.len;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1662
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1663 /* 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
1664 while (b->pos < b->last && *(b->pos) == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1665 b->pos++;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1666 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1667
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1668 p = b->pos;
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1669 }
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1670
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1671 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
1672 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1673
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1674
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1675 static ngx_int_t
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1676 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
1677 ngx_quic_header_t *pkt)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1678 {
8074
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1679 ngx_int_t rc;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1680 ngx_ssl_conn_t *ssl_conn;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1681 ngx_quic_secrets_t *keys, *next, tmp;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1682 ngx_quic_send_ctx_t *ctx;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1683 ngx_quic_connection_t *qc;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1684
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
1685 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
1686
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1687 rc = ngx_quic_parse_packet(pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1688
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1689 if (rc == NGX_DECLINED || rc == NGX_ERROR) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1690 return rc;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1691 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1692
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1693 qc = c->quic;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1694
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1695 if (qc) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1696
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1697 if (rc == NGX_ABORT) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1698 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1699 "quic unsupported version: 0x%xD", pkt->version);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1700 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1701 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1702
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1703 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
1704
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1705 if (pkt->level == ssl_encryption_application) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1706 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
1707 ngx_log_error(NGX_LOG_INFO, c->log, 0,
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1708 "quic stateless reset packet detected");
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1709
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1710 qc->draining = 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1711 ngx_quic_close_connection(c, NGX_OK);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1712
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1713 return NGX_OK;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1714 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1715
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1716 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
1717 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1718
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1719 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1720 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1721
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1722 if (qc->in_retry) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1723
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1724 c->log->action = "retrying quic connection";
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1725
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1726 if (pkt->level != ssl_encryption_initial) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1727 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1728 "quic discard late retry packet");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1729 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1730 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1731
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1732 if (!pkt->token.len) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1733 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1734 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1735
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1736 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
1737 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1738 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1739
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1740 qc->tp.initial_scid = qc->dcid;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1741 qc->in_retry = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1742
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1743 if (ngx_quic_init_secrets(c) != NGX_OK) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1744 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1745 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1746
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1747 if (ngx_quic_validate_token(c, pkt) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1748 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1749 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1750
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1751 qc->validated = 1;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1752 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1753
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1754 } else {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1755
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1756 if (rc == NGX_ABORT) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1757 return ngx_quic_negotiate_version(c, pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1758 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1759
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1760 if (pkt->level == ssl_encryption_initial) {
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 if (pkt->dcid.len < NGX_QUIC_CID_LEN_MIN) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1763 /* 7.2. Negotiating Connection IDs */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1764 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1765 "quic too short dcid in initial"
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1766 " packet: length %i", pkt->dcid.len);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1767 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1768 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1769
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1770 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
1771 if (qc == NULL) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1772 return NGX_ERROR;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1773 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1774
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1775 c->quic = qc;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1776
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1777 if (ngx_terminate || ngx_exiting) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1778 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
1779 return NGX_ERROR;
8098
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 (pkt->token.len) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1783 if (ngx_quic_validate_token(c, pkt) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1784 return NGX_ERROR;
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
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1787 } else if (conf->retry) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1788 return ngx_quic_send_retry(c);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1789 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1790
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1791 if (ngx_quic_init_secrets(c) != NGX_OK) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1792 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1793 }
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 } else if (pkt->level == ssl_encryption_application) {
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1796 return ngx_quic_send_stateless_reset(c, conf, pkt);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1797
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1798 } else {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1799 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1800 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1801 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1802
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1803 keys = &qc->keys[pkt->level];
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1804
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1805 if (keys->client.key.len == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1806 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1807 "quic no level %d keys yet, ignoring packet", pkt->level);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1808 return NGX_DECLINED;
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 next = &qc->next_key;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1812
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1813 pkt->secret = &keys->client;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1814 pkt->next = &next->client;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1815 pkt->key_phase = qc->key_phase;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1816 pkt->plaintext = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1817
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1818 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1819
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1820 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
1821
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
1822 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
1823 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
1824 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
1825 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
1826 return rc;
7689
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1827 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1828
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1829 if (c->ssl == NULL) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1830 if (ngx_quic_init_connection(c) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1831 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1832 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1833 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1834
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1835 if (pkt->level == ssl_encryption_handshake) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1836 /*
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1837 * 4.10.1. The successful use of Handshake packets indicates
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1838 * that no more Initial packets need to be exchanged
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1839 */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1840 ngx_quic_discard_ctx(c, ssl_encryption_initial);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1841 qc->validated = 1;
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->level != ssl_encryption_application) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1845 return ngx_quic_payload_handler(c, pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1846 }
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 ngx_gettimeofday(&pkt->received);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1849
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1850 /* switch keys on Key Phase change */
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 if (pkt->key_update) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1853 qc->key_phase ^= 1;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1854
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1855 tmp = *keys;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1856 *keys = *next;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1857 *next = tmp;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1858 }
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 rc = ngx_quic_payload_handler(c, pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1861 if (rc != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1862 return rc;
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
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1865 /* generate next keys */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1866
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1867 if (pkt->key_update) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1868 if (ngx_quic_key_update(c, keys, next) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1869 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1870 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1871 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1872
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1873 return NGX_OK;
7689
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1874 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1875
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
1876
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1877 static ngx_int_t
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1878 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
1879 {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1880 ngx_quic_secrets_t *keys;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1881 ngx_quic_connection_t *qc;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1882
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1883 qc =c->quic;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1884 keys = &qc->keys[ssl_encryption_initial];
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1885
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1886 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
1887 &qc->odcid)
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1888 != NGX_OK)
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1889 {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1890 return NGX_ERROR;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1891 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1892
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1893 qc->initialized = 1;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1894
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1895 return NGX_OK;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1896 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1897
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1898
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1899 static void
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1900 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
1901 {
8025
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1902 ngx_queue_t *q;
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1903 ngx_quic_frame_t *f;
7816
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7815
diff changeset
1904 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
1905 ngx_quic_connection_t *qc;
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1906
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1907 qc = c->quic;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1908
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1909 if (qc->keys[level].client.key.len == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1910 return;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1911 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1912
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1913 qc->keys[level].client.key.len = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1914 qc->pto_count = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1915
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1916 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
1917
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1918 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
1919 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
1920 ngx_queue_remove(q);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1921
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
1922 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
1923 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
1924 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
1925 }
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1926 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1927
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1928
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1929 static ngx_int_t
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1930 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
1931 {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1932 ngx_str_t *dcid;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1933 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
1934 ngx_quic_send_ctx_t *ctx;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1935 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
1936
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1937 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
1938
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1939 if (pkt->dcid.len == dcid->len
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1940 && ngx_memcmp(pkt->dcid.data, dcid->data, dcid->len) == 0)
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1941 {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1942 if (pkt->level == ssl_encryption_application) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1943 return NGX_OK;
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
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1946 goto found;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1947 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1948
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1949 /*
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1950 * 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
1951 * thus check also for old dcid
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1952 */
8084
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1953 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
1954
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1955 if (pkt->level == ssl_encryption_initial
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1956 && 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
1957 {
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1958 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
1959 && 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
1960 {
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1961 goto found;
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1962 }
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1963 }
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1964
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1965 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
1966 return NGX_ERROR;
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1967
eece8e35e64d QUIC: allowed old DCID for initial packets until first ACK.
Roman Arutyunyan <arut@nginx.com>
parents: 8083
diff changeset
1968 found:
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1969
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1970 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
1971 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1972 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1973 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1974 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
1975
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1976 if (pkt->scid.len == cid->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1977 && 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
1978 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1979 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1980 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1981 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1982
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1983 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
1984 return NGX_ERROR;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
1985 }
7637
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1986
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1987
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1988 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1989 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
1990 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1991 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1992 ssize_t len;
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
1993 ngx_uint_t ack_sent, do_close;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
1994 ngx_quic_frame_t frame;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1995 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1996
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1997 qc = c->quic;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1998
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1999 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2000 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2001 * 10.1 Closing and Draining Connection States
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2002 * ... delayed or reordered packets are properly discarded.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2003 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2004 * 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
2005 * 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
2006 * packets as belonging to the connection.
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2007 */
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2008
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2009 qc->error_level = pkt->level;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2010 qc->error = NGX_QUIC_ERR_NO_ERROR;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2011 qc->error_reason = "connection is closing, packet discarded";
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2012 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2013 qc->error_app = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2014
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2015 return ngx_quic_send_cc(c);
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2016 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2017
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2018 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2019 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2020
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2021 ack_sent = 0;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2022 do_close = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2023
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2024 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2025
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2026 c->log->action = "parsing frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2027
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7705
diff changeset
2028 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
2029
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2030 if (len < 0) {
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2031 qc->error = pkt->error;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2032 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2033 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2034
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2035 c->log->action = "handling frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2036
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2037 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2038
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2039 switch (frame.type) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2040
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2041 case NGX_QUIC_FT_ACK:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2042 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
2043 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2044 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2045
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2046 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2047
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2048 case NGX_QUIC_FT_PADDING:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2049 /* no action required */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2050 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2051
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2052 case NGX_QUIC_FT_CONNECTION_CLOSE:
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2053 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
2054 do_close = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2055 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2056 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2057
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2058 /* got there with ack-eliciting packet */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2059
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2060 if (!ack_sent) {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2061 if (ngx_quic_send_ack(c, pkt) != NGX_OK) {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2062 return NGX_ERROR;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2063 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2064
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2065 ack_sent = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2066 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2067
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2068 switch (frame.type) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2069
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2070 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2071
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2072 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
2073 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2074 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2075
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2076 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2077
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2078 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2079 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2080
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2081 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2082 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2083 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2084 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2085 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2086 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2087 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2088 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2089
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2090 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
2091 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2092 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2093
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2094 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2095
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2096 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
2097
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2098 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
2099 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2100 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2101 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2102
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2103 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2104
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2105 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2106 case NGX_QUIC_FT_STREAMS_BLOCKED2:
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2107
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2108 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
2109 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2110 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2111 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2112 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2113 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2114
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2115 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2116
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2117 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
2118
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2119 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
2120 &frame.u.stream_data_blocked)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2121 != NGX_OK)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2122 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2123 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2124 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2125
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2126 break;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2127
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2128 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
2129
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2130 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
2131 &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
2132 != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2133 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2134 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2135 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2136
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2137 break;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2138
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2139 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
2140
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2141 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
2142 &frame.u.reset_stream)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2143 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2144 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2145 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2146 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2147
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2148 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2149
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2150 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
2151
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2152 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
2153 &frame.u.stop_sending)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2154 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2155 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2156 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2157 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2158
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2159 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2160
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2161 case NGX_QUIC_FT_MAX_STREAMS:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2162 case NGX_QUIC_FT_MAX_STREAMS2:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2163
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2164 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
2165 != NGX_OK)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2166 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2167 return NGX_ERROR;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2168 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2169
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2170 break;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2171
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2172 case NGX_QUIC_FT_PATH_CHALLENGE:
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2173
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2174 if (ngx_quic_handle_path_challenge_frame(c, pkt,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2175 &frame.u.path_challenge)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2176 != NGX_OK)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2177 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2178 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2179 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2180
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2181 break;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2182
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2183 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
2184
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2185 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
2186 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2187 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2188 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2189 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2190
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2191 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2192
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2193 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2194 case NGX_QUIC_FT_PATH_RESPONSE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2195
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2196 /* TODO: handle */
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2197 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2198 "quic frame handler not implemented");
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2199 break;
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2200
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2201 default:
7823
4e4485793418 Added MAX_STREAM_DATA stub handler.
Vladimir Homutov <vl@nginx.com>
parents: 7822
diff changeset
2202 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2203 "quic missing frame handler");
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2204 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2205 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2206 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2207
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2208 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2209 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2210 "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
2211
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2212 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2213 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2214 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2215
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2216 if (do_close) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2217 qc->draining = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2218 ngx_quic_close_connection(c, NGX_OK);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2219 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2220
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2221 return NGX_OK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2222 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2223
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2224
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2225 static ngx_int_t
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2226 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_header_t *pkt)
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2227 {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2228 ngx_quic_frame_t *frame;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2229
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2230 c->log->action = "generating acknowledgment";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2231
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2232 /* every ACK-eliciting packet is acknowledged, TODO ACK Ranges */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2233
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2234 frame = ngx_quic_alloc_frame(c, 0);
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2235 if (frame == NULL) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2236 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2237 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2238
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2239 frame->level = (pkt->level == ssl_encryption_early_data)
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2240 ? ssl_encryption_application
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2241 : pkt->level;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2242
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2243 frame->type = NGX_QUIC_FT_ACK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2244 frame->u.ack.largest = pkt->pn;
7988
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2245 frame->u.ack.delay = ngx_quic_ack_delay(c, &pkt->received, frame->level);
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2246
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
2247 ngx_sprintf(frame->info, "ACK for PN=%uL from frame handler level=%d",
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2248 pkt->pn, frame->level);
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2249 ngx_quic_queue_frame(c->quic, frame);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2250
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
2251 return NGX_OK;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2252 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2253
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2254
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2255 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
2256 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
2257 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
2258 {
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2259 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
2260 struct timeval tv;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2261
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2262 ack_delay = 0;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2263
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2264 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
2265 ngx_gettimeofday(&tv);
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2266 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
2267 + 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
2268 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
2269 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
2270 }
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2271
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2272 return ack_delay;
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2273 }
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2274
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2275
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 7987
diff changeset
2276 static ngx_int_t
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2277 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
2278 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2279 ngx_quic_frame_t *frame;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2280 ngx_quic_connection_t *qc;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2281
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2282 qc = c->quic;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2283
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2284 if (qc->draining) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2285 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2286 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2287
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2288 if (!qc->initialized) {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2289 /* 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
2290 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
2291 return NGX_OK;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2292 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2293 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2294
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2295 if (qc->closing
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2296 && 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
2297 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2298 /* dot not send CC too often */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2299 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2300 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2301
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2302 frame = ngx_quic_alloc_frame(c, 0);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2303 if (frame == NULL) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2304 return NGX_ERROR;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2305 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2306
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2307 frame->level = qc->error_level;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2308 frame->type = NGX_QUIC_FT_CONNECTION_CLOSE;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2309 frame->u.close.error_code = qc->error;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2310 frame->u.close.frame_type = qc->error_ftype;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2311 frame->u.close.app = qc->error_app;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2312
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2313 if (qc->error_reason) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2314 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
2315 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
2316 }
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2317
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2318 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
2319 "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
2320 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
2321 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
2322
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2323 ngx_quic_queue_frame(c->quic, frame);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2324
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2325 qc->last_cc = ngx_current_msec;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2326
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2327 return ngx_quic_output(c);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2328 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2329
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2330
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2331 static ngx_int_t
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2332 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
2333 {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2334 ngx_str_t token;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2335 ngx_quic_frame_t *frame;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2336
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
2337 if (!c->quic->conf->retry) {
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2338 return NGX_OK;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2339 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2340
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2341 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
2342 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2343 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2344
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2345 frame = ngx_quic_alloc_frame(c, 0);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2346 if (frame == NULL) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2347 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2348 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2349
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2350 frame->level = ssl_encryption_application;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2351 frame->type = NGX_QUIC_FT_NEW_TOKEN;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2352 frame->u.token.length = token.len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2353 frame->u.token.data = token.data;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2354 ngx_sprintf(frame->info, "NEW_TOKEN");
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2355 ngx_quic_queue_frame(c->quic, frame);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2356
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2357 return NGX_OK;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2358 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2359
7945
Vladimir Homutov <vl@nginx.com>
parents: 7942
diff changeset
2360
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2361 static ngx_int_t
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2362 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
2363 ngx_quic_ack_frame_t *ack)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2364 {
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2365 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
2366 u_char *pos, *end;
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2367 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
2368 ngx_msec_t send_time;
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2369 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
2370 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
2371 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
2372
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2373 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
2374
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
2375 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
2376
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2377 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2378 "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
2379
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2380 /*
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2381 * 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
2382 * 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
2383 * (19.3.1)
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2384 */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2385
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2386 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
2387 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2388 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2389 "quic invalid first range in ack frame");
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2390 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2391 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2392
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2393 min = ack->largest - ack->first_range;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2394 max = ack->largest;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2395
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2396 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
2397 != NGX_OK)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2398 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2399 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2400 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2401
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2402 /* 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
2403 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
2404 ctx->largest_ack = max;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2405 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
2406 "quic updated largest received ack: %uL", max);
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2407
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2408 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2409 * An endpoint generates an RTT sample on receiving an
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2410 * ACK frame that meets the following two conditions:
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2411 *
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2412 * - the largest acknowledged packet number is newly acknowledged
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2413 * - 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
2414 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2415
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2416 if (send_time != NGX_TIMER_INFINITE) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2417 ngx_quic_rtt_sample(c, ack, pkt->level, send_time);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2418 }
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2419 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2420
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2421 pos = ack->ranges_start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2422 end = ack->ranges_end;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2423
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2424 for (i = 0; i < ack->range_count; i++) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2425
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2426 n = ngx_quic_parse_ack_range(pkt, pos, end, &gap, &range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2427 if (n == NGX_ERROR) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2428 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2429 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2430 pos += n;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2431
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2432 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
2433 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2434 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2435 "quic invalid range %ui in ack frame", i);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2436 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2437 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2438
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2439 max = min - gap - 2;
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2440
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2441 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
2442 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2443 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2444 "quic invalid range %ui in ack frame", i);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2445 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2446 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2447
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2448 min = max - range;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2449
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2450 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
2451 != NGX_OK)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2452 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2453 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2454 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2455 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2456
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
2457 return ngx_quic_detect_lost(c);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2458 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2459
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2460
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2461 static ngx_int_t
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
2462 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
2463 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
2464 {
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2465 uint64_t found_num;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2466 ngx_uint_t found;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2467 ngx_queue_t *q;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2468 ngx_quic_frame_t *f;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2469 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2470
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
2471 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
2472 "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
2473
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2474 qc = c->quic;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2475
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2476 *send_time = NGX_TIMER_INFINITE;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2477 found = 0;
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2478 found_num = 0;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2479
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2480 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
2481
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
2482 while (q != ngx_queue_sentinel(&ctx->sent)) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2483
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2484 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
2485 q = ngx_queue_prev(q);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2486
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2487 if (f->pnum >= min && f->pnum <= max) {
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2488 ngx_quic_congestion_ack(c, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2489
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2490 ngx_quic_handle_stream_ack(c, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2491
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2492 if (f->pnum > found_num || !found) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2493 *send_time = f->last;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2494 found_num = f->pnum;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2495 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2496
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2497 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2498 ngx_quic_free_frame(c, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2499 found = 1;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2500 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2501 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2502
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2503 if (!found) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2504
7932
4e75267865de QUIC: fixed off-by-one in frame range handler.
Vladimir Homutov <vl@nginx.com>
parents: 7931
diff changeset
2505 if (max < ctx->pnum) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2506 /* duplicate ACK or ACK for non-ack-eliciting frame */
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
2507 return NGX_OK;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2508 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2509
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2510 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7878
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
2511 "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
2512
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2513 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
2514 qc->error_ftype = NGX_QUIC_FT_ACK;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
2515 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
2516
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2517 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2518 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
2519
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2520 if (!qc->push.timer_set) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2521 ngx_post_event(&qc->push, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2522 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2523
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2524 qc->pto_count = 0;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2525
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2526 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2527 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2528
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2529
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2530 static void
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2531 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
2532 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
2533 {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2534 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
2535 ngx_quic_connection_t *qc;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2536
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2537 qc = c->quic;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2538
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2539 latest_rtt = ngx_current_msec - send_time;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2540 qc->latest_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2541
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2542 if (qc->min_rtt == NGX_TIMER_INFINITE) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2543 qc->min_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2544 qc->avg_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2545 qc->rttvar = latest_rtt / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2546
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2547 } else {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2548 qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2549
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2550
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2551 if (level == ssl_encryption_application) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2552 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
2553 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
2554
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2555 } else {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2556 ack_delay = 0;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2557 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2558
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2559 adjusted_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2560
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2561 if (qc->min_rtt + ack_delay < latest_rtt) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2562 adjusted_rtt -= ack_delay;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2563 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2564
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2565 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
2566 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
2567 qc->rttvar = 0.75 * qc->rttvar + 0.25 * rttvar_sample;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2568 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2569
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2570 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2571 "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
2572 latest_rtt, qc->min_rtt, qc->avg_rtt, qc->rttvar);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2573 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2574
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2575
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2576 static ngx_inline ngx_msec_t
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2577 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
2578 {
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2579 ngx_msec_t duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2580 ngx_quic_connection_t *qc;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2581
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2582 qc = c->quic;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2583
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2584 /* PTO calculation: quic-recovery, Appendix 8 */
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2585 duration = qc->avg_rtt;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2586
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2587 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
2588 duration <<= qc->pto_count;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2589
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2590 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
2591 return duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2592 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2593
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2594 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
2595 /* application send space */
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2596
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2597 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
2598 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2599
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2600 return duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2601 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2602
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2603
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
2604 static void
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2605 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
2606 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2607 uint64_t sent, unacked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2608 ngx_event_t *wev;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2609 ngx_quic_stream_t *sn;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2610 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2611
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2612 if (f->type < NGX_QUIC_FT_STREAM0 || f->type > NGX_QUIC_FT_STREAM7) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2613 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2614 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2615
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2616 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2617
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2618 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
2619 if (sn == NULL) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2620 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2621 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2622
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2623 wev = sn->c->write;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2624 sent = sn->c->sent;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2625 unacked = sent - sn->acked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2626
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2627 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2628 wev->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2629 ngx_post_event(wev, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2630 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2631
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2632 sn->acked += f->u.stream.length;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2633
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2634 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
2635 "quic stream ack %uL acked:%uL, unacked:%uL",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2636 f->u.stream.length, sn->acked, sent - sn->acked);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2637 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2638
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
2639
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2640 static ngx_int_t
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2641 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
2642 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
2643 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2644 size_t full_len;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2645 ngx_int_t rc;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2646 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2647 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2648
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2649 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2650
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2651 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2652 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
2653 "quic out-of-order frame: expecting %uL got %uL",
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2654 fs->received, f->offset);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2655
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2656 return ngx_quic_buffer_frame(c, fs, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2657 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2658
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2659 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2660
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2661 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2662 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2663 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2664 /* old/duplicate data range */
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2665 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
2666 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2667
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2668 /* intersecting data range, frame modified */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2669 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2670
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2671 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2672
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
2673 rc = handler(c, frame, data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2674 if (rc == NGX_ERROR) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2675 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2676
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2677 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2678 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2679 return NGX_OK;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2680 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2681
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2682 /* rc == NGX_OK */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2683
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2684 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2685
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2686 /* 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
2687
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2688 do {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2689 q = ngx_queue_head(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2690 if (q == ngx_queue_sentinel(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2691 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2692 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2693
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2694 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2695 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2696
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2697 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2698 /* gap found, nothing more to do */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2699 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2700 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2701
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2702 full_len = f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2703
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2704 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2705
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2706 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2707 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2708 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2709 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2710 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2711 fs->total -= f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2712
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2713 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2714 "quic skipped buffered frame, total %ui",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2715 fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2716 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2717 continue;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2718 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2719
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2720 /* frame was adjusted, proceed to input */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2721 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2722
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2723 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2724
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
2725 rc = handler(c, frame, data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2726
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2727 if (rc == NGX_ERROR) {
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2728 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2729
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2730 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2731 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2732 return NGX_OK;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2733 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2734
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2735 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2736 fs->total -= full_len;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2737
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2738 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2739
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2740 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2741 "quic consumed buffered frame, total %ui", fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2742
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2743 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2744
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2745 } while (1);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2746
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2747 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2748 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2749
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2750
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2751 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2752 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
2753 uint64_t offset_in)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2754 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2755 size_t tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2756 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2757
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2758 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2759
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2760 tail = offset_in - f->offset;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2761
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2762 if (tail >= f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2763 /* range preceeding already received data or duplicate, ignore */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2764
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2765 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2766 "quic old or duplicate data in ordered frame, ignored");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2767 return NGX_DONE;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2768 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2769
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2770 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2771 "quic adjusted ordered frame data start to expected offset");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2772
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2773 /* intersecting range: adjust data size */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2774
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2775 f->offset += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2776 f->data += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2777 f->length -= tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2778
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2779 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2780 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2781
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2782
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2783 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2784 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
2785 ngx_quic_frame_t *frame)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2786 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2787 u_char *data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2788 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2789 ngx_quic_frame_t *dst, *item;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2790 ngx_quic_ordered_frame_t *f, *df;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2791
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2792 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2793 "quic ngx_quic_buffer_frame");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2794
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2795 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2796
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2797 /* frame start offset is in the future, buffer it */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2798
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2799 dst = ngx_quic_alloc_frame(c, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2800 if (dst == NULL) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2801 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2802 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2803
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2804 data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2805 ngx_memcpy(dst, frame, sizeof(ngx_quic_frame_t));
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2806 dst->data = data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2807
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2808 ngx_memcpy(dst->data, f->data, f->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2809
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2810 df = &dst->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2811 df->data = dst->data;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2812
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2813 fs->total += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2814
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2815 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2816 "quic ordered frame with unexpected offset:"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2817 " buffered, total %ui", fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2818
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2819 if (ngx_queue_empty(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2820 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2821 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2822 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2823
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2824 for (q = ngx_queue_last(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2825 q != ngx_queue_sentinel(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2826 q = ngx_queue_prev(q))
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2827 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2828 item = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2829 f = &item->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2830
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2831 if (f->offset < df->offset) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2832 ngx_queue_insert_after(q, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2833 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2834 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2835 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2836
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2837 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2838
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2839 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2840 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2841
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2842
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2843 static ngx_int_t
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2844 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
2845 ngx_quic_frame_t *frame)
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2846 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2847 uint64_t last;
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2848 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
2849 ngx_quic_send_ctx_t *ctx;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2850 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
2851 ngx_quic_crypto_frame_t *f;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2852 ngx_quic_frames_stream_t *fs;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2853
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2854 qc = c->quic;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2855 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
2856 f = &frame->u.crypto;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2857
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2858 /* 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
2859 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
2860
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2861 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
2862 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
2863 return NGX_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2864 }
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2865
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2866 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
2867 NULL);
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2868 if (rc != NGX_DECLINED) {
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2869 return rc;
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2870 }
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2871
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2872 /* speeding up handshake completion */
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2873
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2874 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
2875 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
2876
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
2877 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
2878 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
2879 }
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2880 }
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2881
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
2882 return NGX_OK;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2883 }
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2884
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2885
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
2886 static ngx_int_t
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
2887 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
2888 {
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
2889 int n, sslerr;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2890 ngx_ssl_conn_t *ssl_conn;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2891 ngx_quic_crypto_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2892
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2893 f = &frame->u.crypto;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2894
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2895 ssl_conn = c->ssl->connection;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2896
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2897 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2898 "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
2899 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2900 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2901
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2902 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
2903 f->data, f->length))
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2904 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2905 ngx_ssl_error(NGX_LOG_INFO, c->log, 0,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2906 "SSL_provide_quic_data() failed");
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2907 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2908 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2909
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2910 n = SSL_do_handshake(ssl_conn);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2911
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2912 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
2913
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2914 if (n == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2915 sslerr = SSL_get_error(ssl_conn, n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2916
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2917 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
2918 sslerr);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2919
7766
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7765
diff changeset
2920 if (sslerr != SSL_ERROR_WANT_READ) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2921 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
2922 return NGX_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2923 }
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2924
7768
76818c9cdd6f Sending HANDSHAKE_DONE just once with BoringSSL.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7767
diff changeset
2925 } else if (n == 1 && !SSL_in_init(ssl_conn)) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2926
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2927 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7765
Sergey Kandaurov <pluknet@nginx.com>
parents: 7760
diff changeset
2928 "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2929
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2930 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2931 "quic handshake completed successfully");
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2932
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2933 c->ssl->handshaked = 1;
8064
11fc65261689 QUIC: disabled bidirectional SSL shutdown after 09fb2135a589.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8063
diff changeset
2934 c->ssl->no_wait_shutdown = 1;
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2935
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
2936 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
2937 if (frame == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2938 return NGX_ERROR;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2939 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2940
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2941 /* 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
2942 frame->level = ssl_encryption_application;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2943 frame->type = NGX_QUIC_FT_HANDSHAKE_DONE;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7738
diff changeset
2944 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
2945 ngx_quic_queue_frame(c->quic, frame);
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2946
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2947 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
2948 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2949 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
2950
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2951 /*
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2952 * Generating next keys before a key update is received.
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2953 * 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
2954 */
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2955
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2956 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
2957 &c->quic->next_key)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2958 != NGX_OK)
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2959 {
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2960 return NGX_ERROR;
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
2961 }
7870
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
2962
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
2963 /*
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
2964 * 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
2965 * when the TLS handshake is confirmed
e169cce912c7 Avoid retransmitting of packets with discarded keys.
Vladimir Homutov <vl@nginx.com>
parents: 7869
diff changeset
2966 */
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2967 ngx_quic_discard_ctx(c, ssl_encryption_handshake);
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2968 }
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2969
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2970 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2971 "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
2972 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2973 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2974
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2975 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2976 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2977
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2978
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2979 static ngx_int_t
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2980 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
2981 ngx_quic_frame_t *frame)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2982 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2983 size_t window;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2984 uint64_t last;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
2985 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
2986 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
2987 ngx_connection_t *sc;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2988 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2989 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2990 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2991 ngx_quic_frames_stream_t *fs;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2992
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2993 qc = c->quic;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2994 f = &frame->u.stream;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2995
7922
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
2996 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
2997 && (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
2998 {
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
2999 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
3000 return NGX_ERROR;
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3001 }
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3002
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3003 /* 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
3004 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
3005
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3006 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3007
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3008 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
3009 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
3010
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3011 if (sn == NULL) {
7922
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3012 return NGX_ERROR;
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3013 }
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
3014
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3015 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
3016 return NGX_OK;
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
3017 }
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3018
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3019 sc = sn->c;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3020 fs = &sn->fs;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3021 b = sn->b;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3022 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
3023
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3024 if (last > window) {
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3025 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
3026 goto cleanup;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3027 }
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3028
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3029 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
3030 sn)
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3031 != NGX_OK)
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3032 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3033 goto cleanup;
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3034 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3035
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3036 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
3037
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3038 return NGX_OK;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3039 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3040
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3041 fs = &sn->fs;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3042 b = sn->b;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3043 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
3044
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3045 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
3046 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
3047 return NGX_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3048 }
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3049
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3050 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
3051 sn);
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3052
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3053 cleanup:
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3054
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3055 pool = sc->pool;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3056
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3057 ngx_close_connection(sc);
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3058 ngx_destroy_pool(pool);
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3059
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3060 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3061 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3062
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3063
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3064 static ngx_int_t
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3065 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
3066 {
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
3067 uint64_t id;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3068 ngx_buf_t *b;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3069 ngx_event_t *rev;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3070 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3071 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3072 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3073
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3074 qc = c->quic;
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3075 sn = data;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3076
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3077 f = &frame->u.stream;
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
3078 id = f->stream_id;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3079
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3080 b = sn->b;
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3081
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3082 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
3083 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
3084 "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
3085 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3086 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3087
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3088 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
3089 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
3090 b->pos = b->start;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3091 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3092
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
3093 b->last = ngx_cpymem(b->last, f->data, f->length);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3094
7760
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3095 rev = sn->c->read;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3096 rev->ready = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3097
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3098 if (f->fin) {
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3099 rev->pending_eof = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
3100 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3101
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3102 if (rev->active) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3103 rev->handler(rev);
7780
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
3104 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
3105
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
3106 /* 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
3107 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
3108 return NGX_DONE;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3109 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3110
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3111 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3112 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3113
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3114
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3115 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
3116 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
3117 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
3118 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3119 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3120 ngx_rbtree_t *tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3121 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
3122 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
3123 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
3124
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3125 qc = c->quic;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3126 tree = &qc->streams.tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3127
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3128 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
3129 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3130 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3131
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3132 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
3133
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3134 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
3135 node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3136 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
3137 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3138 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
3139 wev = qs->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3140
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3141 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3142 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3143 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
3144 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3145 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3146 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3147
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3148 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
3149
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3150 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3151 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3152
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3153
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3154 static ngx_int_t
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3155 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
3156 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
3157 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3158 return NGX_OK;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3159 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3160
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
3161
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3162 static ngx_int_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3163 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
3164 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
3165 {
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3166 size_t n;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3167 ngx_buf_t *b;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3168 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3169 ngx_quic_stream_t *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
3170 ngx_quic_connection_t *qc;
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3171
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3172 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
3173
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3174 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
3175 && (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
3176 {
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3177 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
3178 return NGX_ERROR;
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3179 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3180
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3181 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
3182
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3183 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
3184 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
3185
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3186 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3187 return NGX_ERROR;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3188 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3189
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3190 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
3191 return NGX_OK;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3192 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3193
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3194 b = sn->b;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3195 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
3196
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3197 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
3198
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3199 } else {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3200 b = sn->b;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3201 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
3202 }
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3203
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
3204 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
3205 if (frame == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3206 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3207 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3208
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3209 frame->level = pkt->level;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3210 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
3211 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
3212 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
3213
8018
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
3214 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
3215 frame->u.max_stream_data.id,
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
3216 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
3217 frame->level);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3218
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3219 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
3220
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3221 return NGX_OK;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3222 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3223
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
3224
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3225 static ngx_int_t
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3226 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
3227 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
3228 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3229 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3230 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3231 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
3232 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
3233
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3234 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
3235
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3236 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
3237 && (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
3238 {
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3239 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
3240 return NGX_ERROR;
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3241 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3242
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3243 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
3244
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3245 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
3246 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
3247
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3248 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3249 return NGX_ERROR;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3250 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3251
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3252 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
3253 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
3254 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
3255
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3256 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
3257 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
3258 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3259
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3260 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
3261
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
3262 return NGX_OK;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3263 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3264
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3265 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
3266 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3267 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3268
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3269 sent = sn->c->sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3270
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3271 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
3272 wev = sn->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3273
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3274 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3275 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3276 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
3277 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3278 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3279
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3280 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
3281
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3282 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3283 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3284
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
3285
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3286 static ngx_int_t
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3287 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
3288 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
3289 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3290 ngx_event_t *rev;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3291 ngx_connection_t *sc;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3292 ngx_quic_stream_t *sn;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3293 ngx_quic_connection_t *qc;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3294
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3295 qc = c->quic;
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3296
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3297 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
3298 && (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
3299 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3300 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
3301 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3302 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3303
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3304 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
3305
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3306 if (sn == NULL) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3307 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
3308
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3309 if (sn == NULL) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3310 return NGX_ERROR;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3311 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3312
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3313 if (sn == NGX_QUIC_STREAM_GONE) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3314 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3315 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3316
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3317 sc = sn->c;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3318
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3319 rev = sc->read;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3320 rev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3321 rev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3322
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3323 sc->listening->handler(sc);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3324
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3325 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3326 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3327
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3328 rev = sn->c->read;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3329 rev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3330 rev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3331
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3332 if (rev->active) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3333 rev->handler(rev);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3334 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3335
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3336 return NGX_OK;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3337 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3338
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3339
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3340 static ngx_int_t
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3341 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
3342 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
3343 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3344 ngx_event_t *wev;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3345 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
3346 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
3347 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
3348
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3349 qc = c->quic;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3350
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3351 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
3352 && (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
3353 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3354 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
3355 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3356 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3357
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3358 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
3359
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3360 if (sn == NULL) {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3361 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
3362
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3363 if (sn == NULL) {
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3364 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3365 }
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3366
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3367 if (sn == NGX_QUIC_STREAM_GONE) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3368 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3369 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3370
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3371 sc = sn->c;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3372
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3373 wev = sc->write;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3374 wev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3375 wev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3376
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3377 sc->listening->handler(sc);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3378
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3379 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3380 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3381
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3382 wev = sn->c->write;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3383 wev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3384 wev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3385
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3386 if (wev->active) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
3387 wev->handler(wev);
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3388 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3389
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3390 return NGX_OK;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3391 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3392
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
3393
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3394 static ngx_int_t
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3395 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
3396 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
3397 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3398 ngx_quic_connection_t *qc;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3399
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3400 qc = c->quic;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3401
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3402 if (f->bidi) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3403 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
3404 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
3405
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3406 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
3407 "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
3408 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3409
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3410 } else {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3411 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
3412 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
3413
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3414 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
3415 "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
3416 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3417 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3418
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3419 return NGX_OK;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3420 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3421
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
3422
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3423 static ngx_int_t
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3424 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
3425 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
3426 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3427 ngx_quic_frame_t *frame;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3428
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3429 frame = ngx_quic_alloc_frame(c, 0);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3430 if (frame == NULL) {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3431 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3432 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3433
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3434 frame->level = pkt->level;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3435 frame->type = NGX_QUIC_FT_PATH_RESPONSE;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3436 frame->u.path_response = *f;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3437
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3438 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
3439 *(uint64_t *) &f->data, frame->level);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3440
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3441 ngx_quic_queue_frame(c->quic, frame);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3442
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3443 return NGX_OK;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3444 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3445
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
3446
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3447 static ngx_int_t
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3448 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
3449 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
3450 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3451 ngx_queue_t *q;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3452 ngx_quic_client_id_t *cid, *item;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3453 ngx_quic_connection_t *qc;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3454
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3455 qc = c->quic;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3456
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3457 if (f->seqnum < qc->max_retired_seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3458 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3459 * 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
3460 * 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
3461 * 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
3462 * 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
3463 * 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
3464 * done so for that sequence number.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3465 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3466
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3467 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
3468 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3469 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3470
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3471 goto retire;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3472 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3473
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3474 cid = NULL;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3475
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3476 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
3477 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3478 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3479 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3480 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
3481
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3482 if (item->seqnum == f->seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3483 cid = item;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3484 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3485 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3486 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3487
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3488 if (cid) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3489 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3490 * 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
3491 * 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
3492 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3493
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3494 if (cid->len != f->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3495 || 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
3496 || 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
3497 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3498 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3499 * ..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
3500 * 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
3501 * of type PROTOCOL_VIOLATION.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3502 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3503 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3504 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
3505 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3506 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3507
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3508 } else {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3509
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3510 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
3511 if (cid == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3512 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3513 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3514
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3515 cid->seqnum = f->seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3516 cid->len = f->len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3517 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
3518
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
3519 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
3520
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3521 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
3522 qc->nclient_ids++;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3523
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3524 /* always use latest available connection id */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3525 if (f->seqnum > qc->curr_seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3526 qc->scid.len = cid->len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3527 qc->scid.data = cid->id;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3528 qc->curr_seqnum = f->seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3529 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3530 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3531
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3532 retire:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3533
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3534 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
3535 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3536 * 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
3537 * 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
3538 * 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
3539 * largest received Retire Prior To value.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3540 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3541 goto done;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3542 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3543
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3544 qc->max_retired_seqnum = f->retire;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3545
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3546 q = ngx_queue_head(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3547
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3548 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
3549
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3550 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
3551 q = ngx_queue_next(q);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3552
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3553 if (cid->seqnum >= f->retire) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3554 continue;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3555 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3556
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3557 /* this connection id must be retired */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3558
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3559 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
3560 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3561 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3562 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3563 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3564
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3565 ngx_queue_remove(&cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3566 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
3567 qc->nclient_ids--;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3568 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3569
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3570 done:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3571
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3572 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
3573 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3574 * 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
3575 * 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
3576 * 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
3577 * 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
3578 * 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
3579 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3580 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
3581 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
3582 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3583 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3584
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3585 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3586 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3587
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3588
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3589 static ngx_int_t
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3590 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
3591 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
3592 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3593 ngx_quic_frame_t *frame;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3594
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3595 frame = ngx_quic_alloc_frame(c, 0);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3596 if (frame == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3597 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3598 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3599
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3600 frame->level = level;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3601 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
3602 frame->u.retire_cid.sequence_number = seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3603
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3604 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
3605 seqnum, frame->level);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3606
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3607 ngx_quic_queue_frame(c->quic, frame);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3608
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3609 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3610 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3611
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3612
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3613 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
3614 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
3615 {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3616 ngx_queue_t *q;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
3617 ngx_quic_client_id_t *cid;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3618
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3619 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
3620
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3621 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
3622 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
3623
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3624 ngx_queue_remove(&cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3625
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3626 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
3627
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3628 } else {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3629
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3630 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
3631 if (cid == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3632 return NULL;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3633 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3634 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3635
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3636 return cid;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3637 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3638
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
3639
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3640 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3641 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
3642 {
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3643 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
3644
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3645 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
3646
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3647 ngx_queue_insert_tail(&ctx->frames, &frame->queue);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
3648
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3649 frame->len = ngx_quic_create_frame(NULL, frame);
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3650 /* always succeeds */
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3651
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3652 if (qc->closing) {
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3653 return;
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3654 }
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3655
8055
924882f42dea QUIC: do not artificially delay sending queued frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8054
diff changeset
3656 ngx_post_event(&qc->push, &ngx_posted_events);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3657 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3658
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3659
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3660 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3661 ngx_quic_output(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3662 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3663 ngx_uint_t i;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3664 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3665
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
3666 c->log->action = "sending frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
3667
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3668 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3669
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3670 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
3671 if (ngx_quic_output_frames(c, &qc->send_ctx[i]) != NGX_OK) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3672 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3673 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3674 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3675
7788
d9bc33166361 Do not set timers after the connection is closed.
Vladimir Homutov <vl@nginx.com>
parents: 7787
diff changeset
3676 if (!qc->send_timer_set && !qc->closing) {
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
3677 qc->send_timer_set = 1;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
3678 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
3679 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
3680
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3681 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3682 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3683
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3684
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3685 static ngx_int_t
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
3686 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
3687 {
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3688 size_t len, hlen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3689 ngx_uint_t need_ack;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3690 ngx_queue_t *q, range;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3691 ngx_quic_frame_t *f;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3692 ngx_quic_congestion_t *cg;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3693 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3694
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3695 qc = c->quic;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3696 cg = &qc->congestion;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3697
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3698 if (ngx_queue_empty(&ctx->frames)) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3699 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3700 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3701
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
3702 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
3703 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
3704
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
3705 /* 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
3706 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
3707 : NGX_QUIC_MAX_LONG_HEADER;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3708 hlen += EVP_GCM_TLS_TAG_LEN;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3709
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3710 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3711 len = 0;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3712 need_ack = 0;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3713 ngx_queue_init(&range);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3714
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3715 do {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3716 /* process group of frames that fits into packet */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3717 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
3718
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3719 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
3720 break;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3721 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3722
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3723 if (f->need_ack) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3724 need_ack = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3725 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3726
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3727 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
3728 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3729 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3730
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3731 if (!qc->validated) {
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3732 /*
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3733 * Prior to validation, endpoints are limited in what they
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3734 * 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
3735 * send more than three times the data it receives;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3736 */
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3737
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3738 if (((c->sent + len + f->len) / 3) > qc->received) {
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3739 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
3740 "quic hit amplification limit"
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3741 " received %uz sent %O",
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3742 qc->received, c->sent);
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3743 break;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3744 }
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3745 }
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
3746
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3747 q = ngx_queue_next(q);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3748
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3749 f->first = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3750
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3751 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3752 ngx_queue_insert_tail(&range, &f->queue);
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3753
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
3754 len += f->len;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3755
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3756 } while (q != ngx_queue_sentinel(&ctx->frames));
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3757
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3758 if (ngx_queue_empty(&range)) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3759 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3760 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3761
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3762 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
3763 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3764 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3765
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3766 } while (q != ngx_queue_sentinel(&ctx->frames));
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3767
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3768 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3769 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3770
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3771
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3772 static void
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3773 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
3774 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3775 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3776 ngx_quic_frame_t *f;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3777
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3778 do {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3779 q = ngx_queue_head(frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3780
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3781 if (q == ngx_queue_sentinel(frames)) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3782 break;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3783 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3784
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3785 ngx_queue_remove(q);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3786
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3787 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
3788
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3789 ngx_quic_free_frame(c, f);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3790 } while (1);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3791 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3792
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3793
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3794 static ngx_int_t
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3795 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
3796 ngx_queue_t *frames)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3797 {
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3798 ssize_t len;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3799 u_char *p;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3800 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
3801 ngx_str_t out, res;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3802 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
3803 ngx_ssl_conn_t *ssl_conn;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3804 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
3805 ngx_quic_header_t pkt;
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
3806 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
3807 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
3808 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
3809 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
3810 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3811
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3812 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3813 "quic ngx_quic_send_frames");
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3814
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
3815 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
3816
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3817 q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3818 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
3819
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3820 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3821
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3822 now = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3823
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3824 p = src;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3825 out.data = src;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3826
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3827 for (q = ngx_queue_head(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3828 q != ngx_queue_sentinel(frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3829 q = ngx_queue_next(q))
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3830 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3831 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3832
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3833 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3834 "quic frame out: %s", f->info);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3835
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3836 len = ngx_quic_create_frame(p, f);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3837 if (len == -1) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3838 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3839 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3840
7778
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 7777
diff changeset
3841 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
3842 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
3843 }
053fa468b044 Fixed missing propagation of need_ack flag from frames to packet.
Vladimir Homutov <vl@nginx.com>
parents: 7777
diff changeset
3844
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3845 p += len;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3846 f->pnum = ctx->pnum;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3847 f->last = now;
8131
3bde57a0e6ce QUIC: zero out packet length in frames prior to send.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8105
diff changeset
3848 f->plen = 0;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3849 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3850
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3851 out.len = p - out.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3852
7767
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
3853 while (out.len < 4) {
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
3854 *p++ = NGX_QUIC_FT_PADDING;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
3855 out.len++;
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
3856 }
c9fbe9508e1f QUIC packet padding to fulfil header protection sample demands.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7766
diff changeset
3857
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3858 qc = c->quic;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3859
7772
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
3860 keys = &c->quic->keys[start->level];
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
3861
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
3862 pkt.secret = &keys->server;
058a5af7ddfc Refactored QUIC secrets storage.
Vladimir Homutov <vl@nginx.com>
parents: 7771
diff changeset
3863
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
3864 pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
3865
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3866 if (start->level == ssl_encryption_initial) {
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
3867 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3868 pkt.token = initial_token;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3869
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3870 } 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
3871 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
3872
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3873 } else {
7847
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
3874 if (c->quic->key_phase) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
3875 pkt.flags |= NGX_QUIC_PKT_KPHASE;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 7846
diff changeset
3876 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3877 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3878
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3879 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
3880
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3881 pkt.log = c->log;
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3882 pkt.level = start->level;
7821
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 7820
diff changeset
3883 pkt.dcid = qc->scid;
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 7820
diff changeset
3884 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
3885 pkt.payload = out;
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7750
diff changeset
3886
7755
949b95e4d504 Merged ngx_quic_send_packet() into ngx_quic_send_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7754
diff changeset
3887 res.data = dst;
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7750
diff changeset
3888
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3889 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3890 "quic packet ready: %ui bytes at level %d"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3891 " need_ack: %d number: %L encoded %d:0x%xD",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3892 out.len, start->level, pkt.need_ack, pkt.number,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3893 pkt.num_len, pkt.trunc);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3894
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
3895 if (ngx_quic_encrypt(&pkt, ssl_conn, &res) != NGX_OK) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3896 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3897 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3898
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3899 len = c->send(c, res.data, res.len);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3900 if (len == NGX_ERROR || (size_t) len != res.len) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3901 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3902 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3903
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3904 /* 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
3905 ctx->pnum++;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3906
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3907 if (pkt.need_ack) {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3908 /* 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
3909
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3910 if (qc->closing) {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3911 /* 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
3912 ngx_quic_free_frames(c, frames);
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3913
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3914 } else {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3915 ngx_queue_add(&ctx->sent, frames);
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3916 if (qc->pto.timer_set) {
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3917 ngx_del_timer(&qc->pto);
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3918 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3919 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
3920
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
3921 start->plen = len;
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3922 }
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3923
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
3924 qc->congestion.in_flight += len;
7991
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3925
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3926 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
3927 "quic congestion send if:%uz",
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3928 qc->congestion.in_flight);
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3929 } else {
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3930 /* 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
3931 ngx_quic_free_frames(c, frames);
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3932 }
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3933
1b9db5c8c29b QUIC: reworked ngx_quic_send_frames() function.
Vladimir Homutov <vl@nginx.com>
parents: 7990
diff changeset
3934 return NGX_OK;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3935 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3936
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3937
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3938 static void
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3939 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
3940 {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3941 uint64_t delta;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3942
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3943 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
3944 pkt->number = ctx->pnum;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3945
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3946 if (delta <= 0x7F) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3947 pkt->num_len = 1;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3948 pkt->trunc = ctx->pnum & 0xff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3949
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3950 } else if (delta <= 0x7FFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3951 pkt->num_len = 2;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3952 pkt->flags |= 0x1;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3953 pkt->trunc = ctx->pnum & 0xffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3954
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3955 } else if (delta <= 0x7FFFFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3956 pkt->num_len = 3;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3957 pkt->flags |= 0x2;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3958 pkt->trunc = ctx->pnum & 0xffffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3959
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3960 } else {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3961 pkt->num_len = 4;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3962 pkt->flags |= 0x3;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3963 pkt->trunc = ctx->pnum & 0xffffffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3964 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3965 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3966
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3967
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
3968 static void
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
3969 ngx_quic_pto_handler(ngx_event_t *ev)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3970 {
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3971 ngx_uint_t i;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3972 ngx_queue_t *q;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3973 ngx_connection_t *c;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3974 ngx_quic_frame_t *start;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3975 ngx_quic_send_ctx_t *ctx;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3976 ngx_quic_connection_t *qc;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3977
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
3978 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
3979
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3980 c = ev->data;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3981 qc = c->quic;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3982
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3983 qc->pto_count++;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3984
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3985 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
3986
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3987 ctx = &qc->send_ctx[i];
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3988
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3989 if (ngx_queue_empty(&ctx->sent)) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3990 continue;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3991 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3992
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3993 q = ngx_queue_head(&ctx->sent);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3994 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
3995
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3996 if (start->pnum <= ctx->largest_ack
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3997 && ctx->largest_ack != (uint64_t) -1)
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3998 {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3999 continue;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4000 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4001
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4002 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
4003 "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
4004 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
4005
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4006 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
4007 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4008 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4009
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4010
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4011 static void
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4012 ngx_quic_push_handler(ngx_event_t *ev)
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4013 {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4014 ngx_connection_t *c;
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4015
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4016 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
4017
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4018 c = ev->data;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4019
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4020 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
4021 ngx_quic_close_connection(c, NGX_ERROR);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4022 return;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4023 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4024 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4025
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4026
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4027 static
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4028 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
4029 {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4030 ngx_connection_t *c;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4031
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4032 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
4033
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4034 c = ev->data;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4035
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4036 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
4037 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
4038 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4039 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4040
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4041
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4042 static ngx_int_t
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4043 ngx_quic_detect_lost(ngx_connection_t *c)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4044 {
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4045 ngx_uint_t i;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4046 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
4047 ngx_queue_t *q;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4048 ngx_quic_frame_t *start;
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4049 ngx_quic_send_ctx_t *ctx;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4050 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4051
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4052 qc = c->quic;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4053 now = ngx_current_msec;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4054
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4055 min_wait = 0;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4056
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4057 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
4058 thr = ngx_max(thr, NGX_QUIC_TIME_GRANULARITY);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4059
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4060 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4061
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4062 ctx = &qc->send_ctx[i];
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4063
8053
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4064 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
4065 continue;
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4066 }
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4067
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4068 while (!ngx_queue_empty(&ctx->sent)) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4069
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4070 q = ngx_queue_head(&ctx->sent);
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4071 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4072
8053
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4073 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
4074 break;
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4075 }
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
4076
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4077 wait = start->last + thr - now;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4078
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4079 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
4080 "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
4081 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
4082
8054
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
4083 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
4084 && 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
4085 {
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4086
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4087 if (min_wait == 0 || wait < min_wait) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4088 min_wait = wait;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4089 }
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4090
8054
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
4091 break;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4092 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4093
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4094 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
4095 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4096 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4097
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4098 /* no more preceeding packets */
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4099
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4100 if (min_wait == 0) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4101 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
4102 return NGX_OK;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4103 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4104
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4105 qc->pto.handler = ngx_quic_lost_handler;
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4106
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4107 if (qc->pto.timer_set) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4108 ngx_del_timer(&qc->pto);
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4109 }
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
4110
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4111 ngx_add_timer(&qc->pto, min_wait);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4112
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4113 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4114 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4115
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4116
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4117 static void
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4118 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
4119 {
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4120 ngx_queue_t *q;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4121 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
4122 ngx_quic_connection_t *qc;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4123
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4124 qc = c->quic;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4125 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
4126 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
4127
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4128 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
4129 "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
4130
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4131 do {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4132 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
4133
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4134 if (f->pnum != start->pnum) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4135 break;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4136 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4137
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4138 q = ngx_queue_next(q);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4139
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4140 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
4141 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
4142
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4143 } 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
4144
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4145 ngx_quic_congestion_lost(c, start);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4146
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4147 if (qc->closing) {
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4148 return;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4149 }
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4150
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
4151 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
4152 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4153
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
4154
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4155 ngx_connection_t *
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4156 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
4157 {
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4158 size_t rcvbuf_size;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4159 uint64_t id;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4160 ngx_quic_stream_t *qs, *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4161 ngx_quic_connection_t *qc;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4162
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4163 qs = c->qs;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4164 qc = qs->parent->quic;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4165
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4166 if (bidi) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4167 if (qc->streams.server_streams_bidi
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4168 >= qc->streams.server_max_streams_bidi)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4169 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4170 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
4171 "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
4172 qc->streams.server_streams_bidi);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4173 return NULL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4174 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4175
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4176 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
4177 | NGX_QUIC_STREAM_SERVER_INITIATED;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4178
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4179 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
4180 "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
4181 qc->streams.server_streams_bidi,
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4182 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
4183
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4184 qc->streams.server_streams_bidi++;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4185 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
4186
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4187 } else {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4188 if (qc->streams.server_streams_uni
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4189 >= qc->streams.server_max_streams_uni)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4190 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4191 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
4192 "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
4193 qc->streams.server_streams_uni);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4194 return NULL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4195 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4196
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4197 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
4198 | NGX_QUIC_STREAM_SERVER_INITIATED
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4199 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4200
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4201 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
4202 "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
4203 qc->streams.server_streams_uni,
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4204 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
4205
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4206 qc->streams.server_streams_uni++;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4207 rcvbuf_size = 0;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4208 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4209
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4210 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
4211 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4212 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4213 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4214
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4215 return sn->c;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4216 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4217
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4218
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4219 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4220 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4221 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4222 {
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4223 ngx_rbtree_node_t **p;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4224 ngx_quic_stream_t *qn, *qnt;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4226 for ( ;; ) {
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4227 qn = (ngx_quic_stream_t *) node;
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4228 qnt = (ngx_quic_stream_t *) temp;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4229
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4230 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4231
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4232 if (*p == sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4233 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4234 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4235
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4236 temp = *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4237 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4238
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4239 *p = node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4240 node->parent = temp;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4241 node->left = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4242 node->right = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4243 ngx_rbt_red(node);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4244 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4245
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4246
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4247 static ngx_quic_stream_t *
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4248 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
4249 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4250 ngx_rbtree_node_t *node, *sentinel;
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4251 ngx_quic_stream_t *qn;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4252
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4253 node = rbtree->root;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4254 sentinel = rbtree->sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4255
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4256 while (node != sentinel) {
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4257 qn = (ngx_quic_stream_t *) node;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4258
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4259 if (id == qn->id) {
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4260 return qn;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4261 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4262
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
4263 node = (id < qn->id) ? node->left : node->right;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4264 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4265
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4266 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4267 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4268
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4269
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4270 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
4271 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
4272 {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4273 size_t n;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4274 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
4275 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
4276 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
4277
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4278 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
4279 "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
4280
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4281 qc = c->quic;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4282
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4283 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
4284
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4285 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
4286 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
4287 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
4288 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4289
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4290 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
4291 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4292 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4293
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4294 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
4295 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
4296 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4297
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4298 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
4299 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
4300 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4301 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4302
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4303 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
4304 | 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
4305 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
4306 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
4307
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4308 } else {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4309
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4310 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
4311 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
4312 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
4313 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4314
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4315 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
4316 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4317 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4318
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4319 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
4320 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
4321 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4322
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4323 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
4324 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
4325 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4326 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4327
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4328 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
4329 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
4330 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
4331 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4332
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4333 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
4334 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
4335 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4336
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4337 /*
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4338 * 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
4339 *
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4340 * 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
4341 * 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
4342 * 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
4343 * opened.
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4344 */
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4345
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4346 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
4347
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4348 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
4349 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4350 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4351 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4352
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4353 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
4354 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4355
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4356 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
4357 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4358
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4359
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4360 static ngx_quic_stream_t *
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4361 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
4362 {
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4363 ngx_log_t *log;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4364 ngx_pool_t *pool;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4365 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
4366 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
4367 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
4368
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4369 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
4370 "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
4371
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4372 qc = c->quic;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4373
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4374 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4375 if (pool == NULL) {
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4376 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4377 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4378
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4379 sn = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4380 if (sn == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4381 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4382 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4383 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4384
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4385 sn->node.key = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4386 sn->parent = c;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4387 sn->id = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4388
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4389 sn->b = ngx_create_temp_buf(pool, rcvbuf_size);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4390 if (sn->b == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4391 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4392 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4393 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4394
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4395 ngx_queue_init(&sn->fs.frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4396
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4397 log = ngx_palloc(pool, sizeof(ngx_log_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4398 if (log == NULL) {
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4399 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4400 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4401 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4402
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4403 *log = *c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4404 pool->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4405
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4406 sn->c = ngx_get_connection(-1, log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4407 if (sn->c == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4408 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4409 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4410 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4411
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4412 sn->c->qs = sn;
8000
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
4413 sn->c->type = SOCK_STREAM;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4414 sn->c->pool = pool;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4415 sn->c->ssl = c->ssl;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4416 sn->c->sockaddr = c->sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4417 sn->c->listening = c->listening;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4418 sn->c->addr_text = c->addr_text;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4419 sn->c->local_sockaddr = c->local_sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4420 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
4421
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4422 sn->c->recv = ngx_quic_stream_recv;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4423 sn->c->send = ngx_quic_stream_send;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4424 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
4425
7997
b250b515e5b6 QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents: 7996
diff changeset
4426 sn->c->read->log = log;
b250b515e5b6 QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents: 7996
diff changeset
4427 sn->c->write->log = log;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4428
7839
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 7838
diff changeset
4429 log->connection = sn->c->number;
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 7838
diff changeset
4430
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4431 if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4432 || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4433 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4434 sn->c->write->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4435 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4436
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4437 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
4438 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
4439 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
4440 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4441
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4442 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4443 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
4444 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
4445 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4446 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
4447 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4448 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4449
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4450 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
4451 if (cln == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4452 ngx_close_connection(sn->c);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4453 ngx_destroy_pool(pool);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4454 return NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4455 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4456
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4457 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
4458 cln->data = sn->c;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4459
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4460 ngx_rbtree_insert(&c->quic->streams.tree, &sn->node);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
4461
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4462 return sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4463 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4464
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
4465
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4466 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4467 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
4468 {
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4469 ssize_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4470 ngx_buf_t *b;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4471 ngx_event_t *rev;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4472 ngx_connection_t *pc;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4473 ngx_quic_frame_t *frame;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4474 ngx_quic_stream_t *qs;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4475 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4476
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4477 qs = c->qs;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4478 b = qs->b;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4479 pc = qs->parent;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4480 qc = pc->quic;
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4481 rev = c->read;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4482
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4483 if (rev->error) {
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4484 return NGX_ERROR;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4485 }
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4486
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4487 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4488 "quic stream id 0x%xL recv: eof:%d, avail:%z",
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4489 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
4490
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4491 if (b->pos == b->last) {
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4492 rev->ready = 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4493
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4494 if (rev->pending_eof) {
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4495 rev->eof = 1;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4496 return 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4497 }
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
4498
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4499 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4500 "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
4501 return NGX_AGAIN;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4502 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4503
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4504 len = ngx_min(b->last - b->pos, (ssize_t) size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4505
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4506 ngx_memcpy(buf, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4507
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4508 b->pos += len;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4509 qc->streams.received += len;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4510
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4511 if (b->pos == b->last) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4512 b->pos = b->start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4513 b->last = b->start;
7760
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4514 rev->ready = rev->pending_eof;
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4515 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4516
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4517 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4518 "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
4519
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4520 if (!rev->pending_eof) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4521 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4522 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4523 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4524 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4525
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4526 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4527 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4528 frame->u.max_stream_data.id = qs->id;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4529 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
4530 + (b->end - b->last);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4531
8017
b0e74a54c98b QUIC: consistent Stream ID logging format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8014
diff changeset
4532 ngx_sprintf(frame->info,
8018
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4533 "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
4534 frame->u.max_stream_data.id,
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4535 frame->u.max_stream_data.limit,
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4536 frame->level);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4537
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4538 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4539 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4540
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4541 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
4542
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4543 frame = ngx_quic_alloc_frame(pc, 0);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4544
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4545 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4546 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4547 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4548
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4549 qc->streams.recv_max_data *= 2;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4550
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4551 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4552 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
4553 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
4554
8018
12576ac9556d QUIC: fixed format specifiers and removed casts.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8017
diff changeset
4555 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
4556 frame->u.max_data.max_data, frame->level);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4557
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4558 ngx_quic_queue_frame(pc->quic, frame);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4559
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4560 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4561 "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
4562 qs->id, qc->streams.recv_max_data);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4563 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
4564
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4565 return len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4566 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4567
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4568
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4569 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4570 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
4571 {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4572 ngx_buf_t b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4573 ngx_chain_t cl;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4574
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4575 ngx_memzero(&b, sizeof(ngx_buf_t));
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4576
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4577 b.memory = 1;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4578 b.pos = buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4579 b.last = buf + size;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4580
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4581 cl.buf = &b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4582 cl.next = NULL;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4583
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4584 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
4585 return NGX_ERROR;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4586 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4587
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4588 if (b.pos == buf) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4589 return NGX_AGAIN;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4590 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4591
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4592 return b.pos - buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4593 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4594
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4595
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4596 static ngx_chain_t *
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4597 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
4598 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4599 u_char *p;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4600 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
4601 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4602 size_t sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4603 #endif
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4604 ngx_buf_t *b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4605 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4606 ngx_uint_t nframes;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4607 #endif
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4608 ngx_event_t *wev;
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4609 ngx_chain_t *cl;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4610 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4611 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4612 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4613 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4614
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4615 qs = c->qs;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4616 pc = qs->parent;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4617 qc = pc->quic;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4618 wev = c->write;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4619
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
4620 if (wev->error) {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4621 return NGX_CHAIN_ERROR;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4622 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4623
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4624 max_frame = ngx_quic_max_stream_frame(qc);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4625 max_flow = ngx_quic_max_stream_flow(c);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4626 max_limit = limit;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4627
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4628 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4629 sent = 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4630 nframes = 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4631 #endif
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4632
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4633 for ( ;; ) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4634 max = ngx_min(max_frame, max_flow);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4635
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4636 if (limit) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4637 max = ngx_min(max, max_limit);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4638 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4639
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4640 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
4641
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4642 if (!ngx_buf_in_memory(in->buf)) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4643 continue;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4644 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4645
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4646 n += ngx_buf_size(in->buf);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4647
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4648 if (n > max) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4649 n = max;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4650 break;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4651 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4652 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4653
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4654 if (n == 0) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4655 wev->ready = (max_flow ? 1 : 0);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4656 break;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4657 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4658
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4659 frame = ngx_quic_alloc_frame(pc, n);
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4660 if (frame == NULL) {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4661 return NGX_CHAIN_ERROR;
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4662 }
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4663
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4664 frame->level = ssl_encryption_application;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4665 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
4666 frame->u.stream.off = 1;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4667 frame->u.stream.len = 1;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4668 frame->u.stream.fin = 0;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4669
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4670 frame->u.stream.type = frame->type;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4671 frame->u.stream.stream_id = qs->id;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4672 frame->u.stream.offset = c->sent;
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4673 frame->u.stream.length = n;
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4674 frame->u.stream.data = frame->data;
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4675
8079
dcbb58e7ed11 QUIC: added logging output stream frame offset.
Roman Arutyunyan <arut@nginx.com>
parents: 8078
diff changeset
4676 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
4677 qs->id, c->sent, n, frame->level);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4678
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4679 c->sent += n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4680 qc->streams.sent += n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4681 max_flow -= n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4682
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4683 if (limit) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4684 max_limit -= n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4685 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4686
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4687 #if (NGX_DEBUG)
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4688 sent += n;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4689 nframes++;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4690 #endif
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4691
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4692 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
4693 b = cl->buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4694
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4695 if (!ngx_buf_in_memory(b)) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4696 continue;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4697 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4698
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4699 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
4700 p = ngx_cpymem(p, b->pos, len);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4701
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4702 b->pos += len;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4703 n -= len;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4704 }
7822
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4705
6481427ca3fc Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7821
diff changeset
4706 ngx_quic_queue_frame(qc, frame);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4707 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4708
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4709 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
4710 "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
4711
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4712 return in;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4713 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4714
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4715
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4716 static size_t
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4717 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
4718 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4719 /*
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4720 * 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
4721 * 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
4722 */
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4723
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4724 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
4725 - EVP_GCM_TLS_TAG_LEN;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4726 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4727
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4728
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4729 static size_t
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4730 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
4731 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4732 size_t size;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4733 uint64_t sent, unacked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4734 ngx_quic_stream_t *qs;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4735 ngx_quic_connection_t *qc;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4736
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4737 qs = c->qs;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4738 qc = qs->parent->quic;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4739
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4740 size = NGX_QUIC_STREAM_BUFSIZE;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4741 sent = c->sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4742 unacked = sent - qs->acked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4743
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4744 if (qc->streams.send_max_data == 0) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4745 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
4746 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4747
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4748 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4749 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
4750 "quic send flow hit buffer size");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4751 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4752 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4753
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4754 if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4755 size = NGX_QUIC_STREAM_BUFSIZE - unacked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4756 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4757
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4758 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
4759 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
4760 "quic send flow hit MAX_DATA");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4761 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4762 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4763
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4764 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
4765 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
4766 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4767
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4768 if (sent >= qs->send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4769 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
4770 "quic send flow hit MAX_STREAM_DATA");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4771 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4772 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4773
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4774 if (sent + size > qs->send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4775 size = qs->send_max_data - sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4776 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4777
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4778 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
4779 "quic send flow: %uz", size);
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4780
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
4781 return size;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4782 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4783
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4784
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4785 static void
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4786 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
4787 {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4788 ngx_connection_t *c = data;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4789
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4790 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4791 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4792 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4793 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
4794
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4795 qs = c->qs;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4796 pc = qs->parent;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4797 qc = pc->quic;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4798
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4799 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4800 "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
4801
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
4802 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
4803 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
4804
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
4805 if (qc->closing) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
4806 /* 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
4807 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
4808 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
4809 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
4810
8066
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4811 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
4812 || (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0)
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4813 {
8077
62db595a86b5 QUIC: do not send STOP_SENDING after STREAM fin.
Roman Arutyunyan <arut@nginx.com>
parents: 8076
diff changeset
4814 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
4815 frame = ngx_quic_alloc_frame(pc, 0);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4816 if (frame == NULL) {
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4817 return;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4818 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4819
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4820 frame->level = ssl_encryption_application;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4821 frame->type = NGX_QUIC_FT_STOP_SENDING;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4822 frame->u.stop_sending.id = qs->id;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4823 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
4824
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4825 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
4826 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
4827
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4828 ngx_quic_queue_frame(qc, frame);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4829 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4830 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
4831
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4832 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
4833 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
4834 if (frame == NULL) {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4835 return;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4836 }
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4837
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4838 frame->level = ssl_encryption_application;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4839 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
4840
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4841 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
4842 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
4843 frame->u.max_streams.bidi = 0;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4844
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4845 } else {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4846 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
4847 frame->u.max_streams.bidi = 1;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4848 }
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4849
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4850 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
4851 frame->u.max_streams.limit,
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4852 frame->u.max_streams.bidi,
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4853 (int) frame->level);
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4854
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4855 ngx_quic_queue_frame(qc, frame);
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4856
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4857 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
4858 /* 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
4859 return;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4860 }
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4861 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4862
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4863 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7996
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7995
diff changeset
4864 "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
4865
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4866 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
4867 if (frame == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4868 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4869 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4870
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4871 frame->level = ssl_encryption_application;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4872 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
4873 frame->u.stream.off = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4874 frame->u.stream.len = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4875 frame->u.stream.fin = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4876
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4877 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
4878 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
4879 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
4880 frame->u.stream.length = 0;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4881 frame->u.stream.data = NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4882
8079
dcbb58e7ed11 QUIC: added logging output stream frame offset.
Roman Arutyunyan <arut@nginx.com>
parents: 8078
diff changeset
4883 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
4884 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
4885
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4886 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
4887
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 7756
diff changeset
4888 (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
4889 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4890
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
4891
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4892 static ngx_quic_frame_t *
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4893 ngx_quic_alloc_frame(ngx_connection_t *c, size_t size)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4894 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4895 u_char *p;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4896 ngx_queue_t *q;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4897 ngx_quic_frame_t *frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4898 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4899
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4900 if (size) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4901 p = ngx_alloc(size, c->log);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4902 if (p == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4903 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4904 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4905
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4906 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4907 p = NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4908 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4909
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4910 qc = c->quic;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4911
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4912 if (!ngx_queue_empty(&qc->free_frames)) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4913
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4914 q = ngx_queue_head(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4915 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
4916
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4917 ngx_queue_remove(&frame->queue);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4918
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4919 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4920 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4921 "quic reuse frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4922 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4923
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4924 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4925 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4926 if (frame == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4927 ngx_free(p);
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4928 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4929 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4930
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4931 #if (NGX_DEBUG)
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4932 ++qc->nframes;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4933 #endif
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4934
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4935 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4936 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4937 "quic alloc frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
4938 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4939 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4940
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4941 ngx_memzero(frame, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4942
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4943 frame->data = p;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4944
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4945 return frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4946 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4947
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4948
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
4949 static void
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4950 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
4951 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4952 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4953 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4954 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4955
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4956 if (f->plen == 0) {
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4957 return;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4958 }
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4959
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4960 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4961 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4962
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4963 cg->in_flight -= f->plen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4964
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4965 timer = f->last - cg->recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4966
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4967 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
4968 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
4969 "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
4970 cg->window, cg->ssthresh, cg->in_flight);
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4971
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4972 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4973 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4974
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4975 if (cg->window < cg->ssthresh) {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4976 cg->window += f->plen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4977
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4978 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4979 "quic congestion slow start win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4980 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4981
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4982 } else {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
4983 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
4984
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4985 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4986 "quic congestion avoidance win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4987 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4988 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4989
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4990 /* prevent recovery_start from wrapping */
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4991
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4992 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
4993
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4994 if ((ngx_msec_int_t) timer < 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4995 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
4996 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4997 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4998
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
4999
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5000 static void
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5001 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
5002 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5003 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5004 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5005 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5006
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5007 if (f->plen == 0) {
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5008 return;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5009 }
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5010
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5011 qc = c->quic;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5012 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5013
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5014 cg->in_flight -= f->plen;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5015
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5016 timer = f->last - cg->recovery_start;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5017
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5018 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
5019 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
5020 "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
5021 cg->window, cg->ssthresh, cg->in_flight);
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
5022
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5023 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5024 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5025
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5026 cg->recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5027 cg->window /= 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5028
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
5029 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
5030 cg->window = qc->tp.max_udp_payload_size * 2;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5031 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5032
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5033 cg->ssthresh = cg->window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5034
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5035 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5036 "quic congestion lost win:%uz, ss:%uz, if:%uz",
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5037 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5038 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5039
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5040
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5041 static void
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5042 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
5043 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5044 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5045
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5046 qc = c->quic;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5047
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5048 if (frame->data) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5049 ngx_free(frame->data);
7871
df18ae7161b8 Assorted fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7870
diff changeset
5050 frame->data = NULL;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5051 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5052
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5053 ngx_queue_insert_head(&qc->free_frames, &frame->queue);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5054
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5055 #ifdef NGX_QUIC_DEBUG_FRAMES_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5056 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5057 "quic free frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5058 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
5059 }