annotate src/event/quic/ngx_event_quic.c @ 8319:ffcaf0aad9f2 quic

HTTP/3: limited client header size. The limit is the size of all large client header buffers. Client header size is the total size of all client header names and values.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 17 Feb 2021 11:58:32 +0300
parents d710c457171c
children 98bacfc65c61
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>
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
12 #include <ngx_sha1.h>
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
13
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
14
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
15 /* 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
16 * so we have 3 packet number spaces:
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
17 *
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
18 * 0 - Initial
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
19 * 1 - Handshake
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
20 * 2 - 0-RTT and 1-RTT
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
21 */
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
22 #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
23 ((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
24 : (((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
25 : &((qc)->send_ctx[2]))
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
26
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
27 #define ngx_quic_lost_threshold(qc) \
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
28 ngx_max(NGX_QUIC_TIME_THR * ngx_max((qc)->latest_rtt, (qc)->avg_rtt), \
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
29 NGX_QUIC_TIME_GRANULARITY)
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
30
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
31 #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
32
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
33 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
34 * 7.4. Cryptographic Message Buffering
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
35 * Implementations MUST support buffering at least 4096 bytes of data
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
36 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
37 #define NGX_QUIC_MAX_BUFFERED 65535
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
38
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
39 #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
40
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
41 #define NGX_QUIC_UNSET_PN (uint64_t) -1
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
42
8100
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 * 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
45 * 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
46 * 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
47 */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
48 #define NGX_QUIC_MIN_PKT_LEN 21
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
49
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
50 #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
51 #define NGX_QUIC_MAX_SR_PACKET 1200
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
52
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
53 #define NGX_QUIC_MAX_ACK_GAP 2
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
54
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
55
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
56 typedef struct {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
57 ngx_rbtree_t tree;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
58 ngx_rbtree_node_t sentinel;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
59
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
60 uint64_t received;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
61 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
62 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
63 uint64_t send_max_data;
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
64
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
65 uint64_t server_max_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
66 uint64_t server_max_streams_bidi;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
67 uint64_t server_streams_uni;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
68 uint64_t server_streams_bidi;
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
69
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
70 uint64_t client_max_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
71 uint64_t client_max_streams_bidi;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
72 uint64_t client_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
73 uint64_t client_streams_bidi;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
74 } ngx_quic_streams_t;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
75
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
76
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
77 typedef struct {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
78 size_t in_flight;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
79 size_t window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
80 size_t ssthresh;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
81 ngx_msec_t recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
82 } ngx_quic_congestion_t;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
83
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
84
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
85 /*
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
86 * 12.3. Packet Numbers
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
87 *
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
88 * 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
89 * 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
90 * 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
91 * are also Initial packets.
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
92 */
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
93 typedef struct {
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
94 enum ssl_encryption_level_t level;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
95
7878
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
96 uint64_t pnum; /* to be sent */
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
97 uint64_t largest_ack; /* received from peer */
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
98 uint64_t largest_pn; /* received from peer */
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
99
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
100 ngx_queue_t frames;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
101 ngx_queue_t sent;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
102
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
103 uint64_t pending_ack; /* non sent ack-eliciting */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
104 uint64_t largest_range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
105 uint64_t first_range;
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
106 ngx_msec_t largest_received;
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
107 ngx_msec_t ack_delay_start;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
108 ngx_uint_t nranges;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
109 ngx_quic_ack_range_t ranges[NGX_QUIC_MAX_RANGES];
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
110 ngx_uint_t send_ack;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
111 } ngx_quic_send_ctx_t;
7773
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
112
dc7ac778aafe Introduced packet namespace in QUIC connection.
Vladimir Homutov <vl@nginx.com>
parents: 7772
diff changeset
113
8208
d1cf691a82e8 Core: hide "struct ngx_quic_connection_s" and further reduce diffs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8204
diff changeset
114 typedef struct {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
115 ngx_udp_connection_t udp;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
116
8194
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
117 uint32_t version;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
118 ngx_str_t scid; /* initial client ID */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
119 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
120 ngx_str_t odcid; /* original server ID */
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
121
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
122 struct sockaddr *sockaddr;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
123 socklen_t socklen;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
124
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
125 ngx_queue_t client_ids;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
126 ngx_queue_t server_ids;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
127 ngx_queue_t free_client_ids;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
128 ngx_queue_t free_server_ids;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
129 ngx_uint_t nclient_ids;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
130 ngx_uint_t nserver_ids;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
131 uint64_t max_retired_seqnum;
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
132 uint64_t client_seqnum;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
133 uint64_t server_seqnum;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
134
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
135 ngx_uint_t client_tp_done;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
136 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
137 ngx_quic_tp_t ctp;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
138
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
139 ngx_quic_send_ctx_t send_ctx[NGX_QUIC_SEND_CTX_LAST];
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
140
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
141 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
142
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
143 ngx_quic_keys_t *keys;
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
144
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
145 ngx_quic_conf_t *conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
146
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
147 ngx_event_t push;
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
148 ngx_event_t pto;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
149 ngx_event_t close;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
150 ngx_msec_t last_cc;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
151
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
152 ngx_msec_t latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
153 ngx_msec_t avg_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
154 ngx_msec_t min_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
155 ngx_msec_t rttvar;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
156
8056
f9b1a4e52597 QUIC: changed c->quic->pto_count type to ngx_uint_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8055
diff changeset
157 ngx_uint_t pto_count;
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
158
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
159 ngx_queue_t free_frames;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
160 ngx_chain_t *free_bufs;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
161 ngx_buf_t *free_shadow_bufs;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
162
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
163 #ifdef NGX_QUIC_DEBUG_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
164 ngx_uint_t nframes;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
165 ngx_uint_t nbufs;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
166 #endif
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
167
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
168 ngx_quic_streams_t streams;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
169 ngx_quic_congestion_t congestion;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
170 off_t received;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
171
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
172 ngx_uint_t error;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
173 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
174 ngx_uint_t error_ftype;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
175 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
176
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
177 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
178 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
179 unsigned closing:1;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
180 unsigned draining:1;
7785
29354c6fc5f2 TLS Key Update in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7782
diff changeset
181 unsigned key_phase:1;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
182 unsigned validated:1;
8208
d1cf691a82e8 Core: hide "struct ngx_quic_connection_s" and further reduce diffs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8204
diff changeset
183 } ngx_quic_connection_t;
7672
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 7671
diff changeset
184
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
185
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
186 typedef struct {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
187 ngx_queue_t queue;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
188 uint64_t seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
189 size_t len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
190 u_char id[NGX_QUIC_CID_LEN_MAX];
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
191 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
192 } ngx_quic_client_id_t;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
193
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
194
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
195 typedef struct {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
196 ngx_udp_connection_t udp;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
197 ngx_queue_t queue;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
198 uint64_t seqnum;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
199 size_t len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
200 u_char id[NGX_QUIC_CID_LEN_MAX];
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
201 } ngx_quic_server_id_t;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
202
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
203
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
204 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
205 ngx_quic_frame_t *frame, void *data);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
206
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
207
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
208 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
209 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
210 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
211 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
212 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
213 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
214 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
215 #else
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
216 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
217 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
218 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
219 #endif
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
220
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
221 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
222 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
223 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
224 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
225 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
226
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
227
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
228 static ngx_int_t ngx_quic_apply_transport_params(ngx_connection_t *c,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
229 ngx_quic_tp_t *ctp);
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
230 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
231 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
232 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
233 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
234 static ngx_int_t ngx_quic_new_sr_token(ngx_connection_t *c, ngx_str_t *cid,
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
235 u_char *secret, u_char *token);
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
236 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
237 ngx_quic_header_t *pkt);
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
238 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
239 ngx_quic_header_t *inpkt);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
240 static ngx_int_t ngx_quic_create_server_id(ngx_connection_t *c, u_char *id);
8269
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
241 #if (NGX_QUIC_BPF)
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
242 static ngx_int_t ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id);
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
243 #endif
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
244 static ngx_int_t ngx_quic_send_retry(ngx_connection_t *c,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
245 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
246 static ngx_int_t ngx_quic_new_token(ngx_connection_t *c, u_char *key,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
247 ngx_str_t *token, ngx_str_t *odcid, time_t expires, ngx_uint_t is_retry);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
248 static void ngx_quic_address_hash(ngx_connection_t *c, ngx_uint_t no_port,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
249 u_char buf[20]);
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
250 static ngx_int_t ngx_quic_validate_token(ngx_connection_t *c,
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
251 u_char *key, ngx_quic_header_t *pkt);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
252 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
253 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
254 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
255
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
256 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
257 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
258 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
259 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
260 ngx_quic_connection_t *qc);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
261
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
262 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
263 ngx_quic_conf_t *conf);
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
264 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
265 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
266 static ngx_int_t ngx_quic_process_payload(ngx_connection_t *c,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
267 ngx_quic_header_t *pkt);
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
268 static ngx_int_t ngx_quic_send_early_cc(ngx_connection_t *c,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
269 ngx_quic_header_t *inpkt, ngx_uint_t err, const char *reason);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
270 static void ngx_quic_discard_ctx(ngx_connection_t *c,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
271 enum ssl_encryption_level_t level);
8281
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
272 static ngx_int_t ngx_quic_check_csid(ngx_quic_connection_t *qc,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
273 ngx_quic_header_t *pkt);
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
274 static ngx_int_t ngx_quic_handle_frames(ngx_connection_t *c,
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
275 ngx_quic_header_t *pkt);
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
276 static ngx_int_t ngx_quic_ack_packet(ngx_connection_t *c,
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
277 ngx_quic_header_t *pkt);
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
278 static ngx_int_t ngx_quic_send_ack_range(ngx_connection_t *c,
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
279 ngx_quic_send_ctx_t *ctx, uint64_t smallest, uint64_t largest);
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
280 static void ngx_quic_drop_ack_ranges(ngx_connection_t *c,
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
281 ngx_quic_send_ctx_t *ctx, uint64_t pn);
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
282 static ngx_int_t ngx_quic_send_ack(ngx_connection_t *c,
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
283 ngx_quic_send_ctx_t *ctx);
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
284 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
285 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
286
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
287 static ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c,
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
288 ngx_quic_header_t *pkt, ngx_quic_frame_t *f);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
289 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
290 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
291 ngx_msec_t *send_time);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
292 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
293 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
294 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
295 ngx_quic_send_ctx_t *ctx);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
296 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
297 ngx_quic_frame_t *f);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
298
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
299 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
300 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
301 ngx_quic_frame_handler_pt handler, void *data);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
302 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
303 ngx_quic_frame_t *f, uint64_t offset_in);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
304 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
305 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
306
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
307 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
308 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
309 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
310 ngx_quic_frame_t *frame, void *data);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
311 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
312 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
313 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
314 ngx_quic_frame_t *frame, void *data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
315
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
316 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
317 ngx_quic_max_data_frame_t *f);
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
318 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
319 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
320 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
321 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
322 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
323 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
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 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
333 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
334 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
335 enum ssl_encryption_level_t level, uint64_t seqnum);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
336 static ngx_int_t ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
337 ngx_quic_header_t *pkt, ngx_quic_retire_cid_frame_t *f);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
338 static ngx_int_t ngx_quic_issue_server_ids(ngx_connection_t *c);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
339 static void ngx_quic_clear_temp_server_ids(ngx_connection_t *c);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
340 static ngx_quic_server_id_t *ngx_quic_insert_server_id(ngx_connection_t *c,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
341 ngx_str_t *id);
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
342 static ngx_quic_client_id_t *ngx_quic_alloc_client_id(ngx_connection_t *c,
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
343 ngx_quic_connection_t *qc);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
344 static ngx_quic_server_id_t *ngx_quic_alloc_server_id(ngx_connection_t *c,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
345 ngx_quic_connection_t *qc);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
346
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
347 static void ngx_quic_queue_frame(ngx_quic_connection_t *qc,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
348 ngx_quic_frame_t *frame);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
349
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
350 static ngx_int_t ngx_quic_output(ngx_connection_t *c);
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
351 static ngx_uint_t ngx_quic_get_padding_level(ngx_connection_t *c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
352 static ngx_int_t ngx_quic_generate_ack(ngx_connection_t *c,
7809
6ad871b63422 Cleaned up magic numbers in ngx_quic_output_frames().
Vladimir Homutov <vl@nginx.com>
parents: 7808
diff changeset
353 ngx_quic_send_ctx_t *ctx);
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
354 static ssize_t ngx_quic_output_packet(ngx_connection_t *c,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
355 ngx_quic_send_ctx_t *ctx, u_char *data, size_t max, size_t min);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
356 static ngx_int_t ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
357 size_t len);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
358 static void ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames);
8240
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
359 static ssize_t ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len);
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
360
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
361 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
362 ngx_quic_send_ctx_t *ctx);
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
363 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
364 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
365 static ngx_int_t ngx_quic_detect_lost(ngx_connection_t *c);
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
366 static void ngx_quic_set_lost_timer(ngx_connection_t *c);
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
367 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
368 ngx_quic_send_ctx_t *ctx);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
369 static void ngx_quic_push_handler(ngx_event_t *ev);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
370
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
371 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
372 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
373 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
374 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
375 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
376 uint64_t id);
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
377 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
378 uint64_t id, size_t rcvbuf_size);
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
379 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
380 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
381 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
382 size_t size);
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
383 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
384 ngx_chain_t *in, off_t limit);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
385 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
386 static void ngx_quic_stream_cleanup_handler(void *data);
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
387 static ngx_quic_frame_t *ngx_quic_alloc_frame(ngx_connection_t *c);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
388 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
389
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
390 static void ngx_quic_congestion_ack(ngx_connection_t *c,
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
391 ngx_quic_frame_t *frame);
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
392 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
393 ngx_quic_frame_t *frame);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
394
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
395 static ngx_chain_t *ngx_quic_alloc_buf(ngx_connection_t *c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
396 static void ngx_quic_free_bufs(ngx_connection_t *c, ngx_chain_t *in);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
397 static ngx_chain_t *ngx_quic_copy_buf(ngx_connection_t *c, u_char *data,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
398 size_t len);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
399 static ngx_chain_t *ngx_quic_copy_chain(ngx_connection_t *c, ngx_chain_t *in,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
400 size_t limit);
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
401 static ngx_chain_t *ngx_quic_split_bufs(ngx_connection_t *c, ngx_chain_t *in,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
402 size_t len);
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
403
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
404
8267
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
405 static ngx_core_module_t ngx_quic_module_ctx = {
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
406 ngx_string("quic"),
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
407 NULL,
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
408 NULL
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
409 };
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
410
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
411
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
412 ngx_module_t ngx_quic_module = {
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
413 NGX_MODULE_V1,
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
414 &ngx_quic_module_ctx, /* module context */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
415 NULL, /* module directives */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
416 NGX_CORE_MODULE, /* module type */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
417 NULL, /* init master */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
418 NULL, /* init module */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
419 NULL, /* init process */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
420 NULL, /* init thread */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
421 NULL, /* exit thread */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
422 NULL, /* exit process */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
423 NULL, /* exit master */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
424 NGX_MODULE_V1_PADDING
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
425 };
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
426
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8266
diff changeset
427
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
428 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
429 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
430 ngx_quic_set_read_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
431 ngx_quic_set_write_secret,
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
432 #else
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
433 ngx_quic_set_encryption_secrets,
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
434 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
435 ngx_quic_add_handshake_data,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
436 ngx_quic_flush_flight,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
437 ngx_quic_send_alert,
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
438 };
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
439
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
440
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
441 #if (NGX_DEBUG)
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
442
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
443 static void
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
444 ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx)
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
445 {
8172
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
446 u_char *p, *last, *pos, *end;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
447 ssize_t n;
8173
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
448 uint64_t gap, range, largest, smallest;
8172
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
449 ngx_uint_t i;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
450 u_char buf[NGX_MAX_ERROR_STR];
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
451
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
452 p = buf;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
453 last = buf + sizeof(buf);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
454
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
455 switch (f->type) {
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
456
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
457 case NGX_QUIC_FT_CRYPTO:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
458 p = ngx_slprintf(p, last, "CRYPTO len:%uL off:%uL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
459 f->u.crypto.length, f->u.crypto.offset);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
460 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
461
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
462 case NGX_QUIC_FT_PADDING:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
463 p = ngx_slprintf(p, last, "PADDING");
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
464 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
465
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
466 case NGX_QUIC_FT_ACK:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
467 case NGX_QUIC_FT_ACK_ECN:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
468
8173
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
469 p = ngx_slprintf(p, last, "ACK n:%ui delay:%uL ",
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
470 f->u.ack.range_count, f->u.ack.delay);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
471
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
472 if (f->data) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
473 pos = f->data->buf->pos;
8288
0b3d70fbba99 QUIC: fixed logging ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8287
diff changeset
474 end = f->data->buf->last;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
475
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
476 } else {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
477 pos = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
478 end = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
479 }
8172
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
480
8173
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
481 largest = f->u.ack.largest;
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
482 smallest = f->u.ack.largest - f->u.ack.first_range;
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
483
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
484 if (largest == smallest) {
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
485 p = ngx_slprintf(p, last, "%uL", largest);
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
486
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
487 } else {
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
488 p = ngx_slprintf(p, last, "%uL-%uL", largest, smallest);
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
489 }
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
490
8172
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
491 for (i = 0; i < f->u.ack.range_count; i++) {
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
492 n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range);
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
493 if (n == NGX_ERROR) {
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
494 break;
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
495 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
496
8172
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
497 pos += n;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
498
8173
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
499 largest = smallest - gap - 2;
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
500 smallest = largest - range;
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
501
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
502 if (largest == smallest) {
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
503 p = ngx_slprintf(p, last, " %uL", largest);
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
504
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
505 } else {
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
506 p = ngx_slprintf(p, last, " %uL-%uL", largest, smallest);
3d79c08bb0f1 QUIC: changed ACK frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8172
diff changeset
507 }
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
508 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
509
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
510 if (f->type == NGX_QUIC_FT_ACK_ECN) {
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
511 p = ngx_slprintf(p, last, " ECN counters ect0:%uL ect1:%uL ce:%uL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
512 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
513 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
514 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
515
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
516 case NGX_QUIC_FT_PING:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
517 p = ngx_slprintf(p, last, "PING");
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
518 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
519
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
520 case NGX_QUIC_FT_NEW_CONNECTION_ID:
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
521 p = ngx_slprintf(p, last,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
522 "NEW_CONNECTION_ID seq:%uL retire:%uL len:%ud",
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
523 f->u.ncid.seqnum, f->u.ncid.retire, f->u.ncid.len);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
524 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
525
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
526 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
527 p = ngx_slprintf(p, last, "RETIRE_CONNECTION_ID seqnum:%uL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
528 f->u.retire_cid.sequence_number);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
529 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
530
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
531 case NGX_QUIC_FT_CONNECTION_CLOSE:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
532 case NGX_QUIC_FT_CONNECTION_CLOSE_APP:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
533 p = ngx_slprintf(p, last, "CONNECTION_CLOSE%s err:%ui",
8285
0697294f79a4 QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8281
diff changeset
534 f->type == NGX_QUIC_FT_CONNECTION_CLOSE ? "" : "_APP",
0697294f79a4 QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8281
diff changeset
535 f->u.close.error_code);
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
536
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
537 if (f->u.close.reason.len) {
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
538 p = ngx_slprintf(p, last, " %V", &f->u.close.reason);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
539 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
540
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
541 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
542 p = ngx_slprintf(p, last, " ft:%ui", f->u.close.frame_type);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
543 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
544
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
545 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
546
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
547 case NGX_QUIC_FT_STREAM0:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
548 case NGX_QUIC_FT_STREAM1:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
549 case NGX_QUIC_FT_STREAM2:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
550 case NGX_QUIC_FT_STREAM3:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
551 case NGX_QUIC_FT_STREAM4:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
552 case NGX_QUIC_FT_STREAM5:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
553 case NGX_QUIC_FT_STREAM6:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
554 case NGX_QUIC_FT_STREAM7:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
555
8174
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
556 p = ngx_slprintf(p, last, "STREAM id:0x%xL", f->u.stream.stream_id);
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
557
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
558 if (f->u.stream.off) {
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
559 p = ngx_slprintf(p, last, " off:%uL", f->u.stream.offset);
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
560 }
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
561
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
562 if (f->u.stream.len) {
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
563 p = ngx_slprintf(p, last, " len:%uL", f->u.stream.length);
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
564 }
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
565
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
566 if (f->u.stream.fin) {
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
567 p = ngx_slprintf(p, last, " fin:1");
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
568 }
27e305834078 QUIC: changed STREAM frame debugging.
Roman Arutyunyan <arut@nginx.com>
parents: 8173
diff changeset
569
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
570 #ifdef NGX_QUIC_DEBUG_FRAMES
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
571 {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
572 ngx_chain_t *cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
573
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
574 p = ngx_slprintf(p, last, " data:");
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
575
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
576 for (cl = f->data; cl; cl = cl->next) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
577 p = ngx_slprintf(p, last, "%*xs",
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
578 cl->buf->last - cl->buf->pos, cl->buf->pos);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
579 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
580 }
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
581 #endif
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
582
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
583 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
584
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
585 case NGX_QUIC_FT_MAX_DATA:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
586 p = ngx_slprintf(p, last, "MAX_DATA max_data:%uL on recv",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
587 f->u.max_data.max_data);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
588 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
589
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
590 case NGX_QUIC_FT_RESET_STREAM:
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
591 p = ngx_slprintf(p, last, "RESET_STREAM"
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
592 " id:0x%xL error_code:0x%xL final_size:0x%xL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
593 f->u.reset_stream.id, f->u.reset_stream.error_code,
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
594 f->u.reset_stream.final_size);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
595 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
596
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
597 case NGX_QUIC_FT_STOP_SENDING:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
598 p = ngx_slprintf(p, last, "STOP_SENDING id:0x%xL err:0x%xL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
599 f->u.stop_sending.id, f->u.stop_sending.error_code);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
600 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
601
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
602 case NGX_QUIC_FT_STREAMS_BLOCKED:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
603 case NGX_QUIC_FT_STREAMS_BLOCKED2:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
604 p = ngx_slprintf(p, last, "STREAMS_BLOCKED limit:%uL bidi:%ui",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
605 f->u.streams_blocked.limit, f->u.streams_blocked.bidi);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
606 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
607
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
608 case NGX_QUIC_FT_MAX_STREAMS:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
609 case NGX_QUIC_FT_MAX_STREAMS2:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
610 p = ngx_slprintf(p, last, "MAX_STREAMS limit:%uL bidi:%ui",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
611 f->u.max_streams.limit, f->u.max_streams.bidi);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
612 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
613
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
614 case NGX_QUIC_FT_MAX_STREAM_DATA:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
615 p = ngx_slprintf(p, last, "MAX_STREAM_DATA id:0x%xL limit:%uL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
616 f->u.max_stream_data.id, f->u.max_stream_data.limit);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
617 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
618
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
619
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
620 case NGX_QUIC_FT_DATA_BLOCKED:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
621 p = ngx_slprintf(p, last, "DATA_BLOCKED limit:%uL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
622 f->u.data_blocked.limit);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
623 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
624
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
625 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
626 p = ngx_slprintf(p, last, "STREAM_DATA_BLOCKED id:0x%xL limit:%uL",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
627 f->u.stream_data_blocked.id,
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
628 f->u.stream_data_blocked.limit);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
629 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
630
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
631 case NGX_QUIC_FT_PATH_CHALLENGE:
8263
b14338acbf9d QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8247
diff changeset
632 p = ngx_slprintf(p, last, "PATH_CHALLENGE data:0x%*xs",
b14338acbf9d QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8247
diff changeset
633 sizeof(f->u.path_challenge.data),
b14338acbf9d QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8247
diff changeset
634 f->u.path_challenge.data);
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
635 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
636
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
637 case NGX_QUIC_FT_PATH_RESPONSE:
8263
b14338acbf9d QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8247
diff changeset
638 p = ngx_slprintf(p, last, "PATH_RESPONSE data:0x%*xs",
b14338acbf9d QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8247
diff changeset
639 sizeof(f->u.path_challenge.data),
b14338acbf9d QUIC: fixed logging PATH_CHALLENGE/RESPONSE and build with GCC < 5.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8247
diff changeset
640 f->u.path_challenge.data);
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
641 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
642
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
643 case NGX_QUIC_FT_NEW_TOKEN:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
644 p = ngx_slprintf(p, last, "NEW_TOKEN");
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
645 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
646
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
647 case NGX_QUIC_FT_HANDSHAKE_DONE:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
648 p = ngx_slprintf(p, last, "HANDSHAKE DONE");
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
649 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
650
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
651 default:
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
652 p = ngx_slprintf(p, last, "unknown type 0x%xi", f->type);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
653 break;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
654 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
655
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
656 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, "quic frame %s %s %*s",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
657 tx ? "tx" : "rx", ngx_quic_level_name(f->level),
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
658 p - buf, buf);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
659 }
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
660
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
661
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
662 static void
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
663 ngx_quic_connstate_dbg(ngx_connection_t *c)
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
664 {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
665 u_char *p, *last;
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
666 ngx_quic_connection_t *qc;
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
667 u_char buf[NGX_MAX_ERROR_STR];
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
668
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
669 p = buf;
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
670 last = p + sizeof(buf);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
671
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
672 qc = ngx_quic_get_connection(c);
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
673
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
674 p = ngx_slprintf(p, last, "state:");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
675
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
676 if (qc) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
677
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
678 if (qc->error) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
679 p = ngx_slprintf(p, last, "%s", qc->error_app ? " app" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
680 p = ngx_slprintf(p, last, " error:%ui", qc->error);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
681
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
682 if (qc->error_reason) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
683 p = ngx_slprintf(p, last, " \"%s\"", qc->error_reason);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
684 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
685 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
686
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
687 p = ngx_slprintf(p, last, "%s", qc->closing ? " closing" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
688 p = ngx_slprintf(p, last, "%s", qc->draining ? " draining" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
689 p = ngx_slprintf(p, last, "%s", qc->key_phase ? " kp" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
690 p = ngx_slprintf(p, last, "%s", qc->validated? " valid" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
691
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
692 } else {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
693 p = ngx_slprintf(p, last, " early");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
694 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
695
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
696 if (c->read->timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
697 p = ngx_slprintf(p, last,
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
698 qc && qc->send_timer_set ? " send:%M" : " read:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
699 c->read->timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
700 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
701
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
702 if (qc) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
703
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
704 if (qc->push.timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
705 p = ngx_slprintf(p, last, " push:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
706 qc->push.timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
707 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
708
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
709 if (qc->pto.timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
710 p = ngx_slprintf(p, last, " pto:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
711 qc->pto.timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
712 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
713
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
714 if (qc->close.timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
715 p = ngx_slprintf(p, last, " close:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
716 qc->close.timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
717 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
718 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
719
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
720 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
721 "quic %*s", p - buf, buf);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
722 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
723
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
724 #else
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
725
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
726 #define ngx_quic_log_frame(log, f, tx)
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
727 #define ngx_quic_connstate_dbg(c)
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
728
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
729 #endif
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
730
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
731
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
732 #if BORINGSSL_API_VERSION >= 10
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
733
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
734 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
735 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
736 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
737 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
738 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
739 ngx_connection_t *c;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
740 ngx_quic_connection_t *qc;
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
741
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
742 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
743 qc = ngx_quic_get_connection(c);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
744
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
745 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
746 "quic ngx_quic_set_read_secret() level:%d", level);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
747 #ifdef NGX_QUIC_DEBUG_CRYPTO
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
748 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
749 "quic read secret len:%uz %*xs", secret_len,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
750 secret_len, rsecret);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
751 #endif
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
752
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
753 return ngx_quic_keys_set_encryption_secret(c->pool, 0, qc->keys, level,
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
754 cipher, rsecret, secret_len);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
755 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
756
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
757
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
758 static int
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
759 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
760 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
761 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
762 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
763 ngx_connection_t *c;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
764 ngx_quic_connection_t *qc;
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
765
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
766 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
767 qc = ngx_quic_get_connection(c);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
768
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
769 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
770 "quic ngx_quic_set_write_secret() level:%d", level);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
771 #ifdef NGX_QUIC_DEBUG_CRYPTO
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
772 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
773 "quic write secret len:%uz %*xs", secret_len,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
774 secret_len, wsecret);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
775 #endif
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
776
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
777 return ngx_quic_keys_set_encryption_secret(c->pool, 1, qc->keys, level,
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
778 cipher, wsecret, secret_len);
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
779 }
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
780
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
781 #else
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
782
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
783 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
784 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
785 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
786 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
787 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
788 ngx_connection_t *c;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
789 const SSL_CIPHER *cipher;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
790 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
791
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
792 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
793 qc = ngx_quic_get_connection(c);
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
794
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
795 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
796 "quic ngx_quic_set_encryption_secrets() level:%d", level);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
797 #ifdef NGX_QUIC_DEBUG_CRYPTO
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
798 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
799 "quic read secret len:%uz %*xs", secret_len,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
800 secret_len, rsecret);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
801 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
802
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
803 cipher = SSL_get_current_cipher(ssl_conn);
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
804
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
805 if (ngx_quic_keys_set_encryption_secret(c->pool, 0, qc->keys, level,
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
806 cipher, rsecret, secret_len)
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
807 != 1)
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
808 {
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
809 return 0;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
810 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
811
7769
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
812 if (level == ssl_encryption_early_data) {
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
813 return 1;
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
814 }
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
815
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
816 #ifdef NGX_QUIC_DEBUG_CRYPTO
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
817 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
818 "quic write secret len:%uz %*xs", secret_len,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
819 secret_len, wsecret);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
820 #endif
7769
2ac03e80d013 TLS Early Data key derivation support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7768
diff changeset
821
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
822 return ngx_quic_keys_set_encryption_secret(c->pool, 1, qc->keys, level,
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
823 cipher, wsecret, secret_len);
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
824 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
825
7670
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
826 #endif
9e0c30e1f7fb Compatibility with BoringSSL revised QUIC encryption secret APIs.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7669
diff changeset
827
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
828
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
829 static int
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
830 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
831 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
832 {
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
833 u_char *p, *end;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
834 size_t client_params_len;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
835 const uint8_t *client_params;
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
836 ngx_quic_tp_t ctp;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
837 ngx_quic_frame_t *frame;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
838 ngx_connection_t *c;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
839 ngx_quic_connection_t *qc;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
840 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
841
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
842 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
843 qc = ngx_quic_get_connection(c);
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
844
7652
0a2683df5f11 Implemented improved version of quic_output().
Vladimir Homutov <vl@nginx.com>
parents: 7651
diff changeset
845 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
846 "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
847
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
848 if (!qc->client_tp_done) {
7933
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
849 /*
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
850 * things to do once during handshake: check ALPN and transport
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
851 * parameters; we want to break handshake if something is wrong
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
852 * here;
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
853 */
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
854
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
855 #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
856 if (qc->conf->require_alpn) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
857 unsigned int len;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
858 const unsigned char *data;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
859
8189
bb3f4f669417 QUIC: passing ssl_conn to SSL_get0_alpn_selected() directly.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8176
diff changeset
860 SSL_get0_alpn_selected(ssl_conn, &data, &len);
8000
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
861
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
862 if (len == 0) {
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
863 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
864 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
865
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
866 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
867 "quic unsupported protocol in ALPN extension");
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
868 return 0;
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
869 }
7933
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
870 }
a2c34e77cfc1 QUIC: added ALPN checks.
Vladimir Homutov <vl@nginx.com>
parents: 7932
diff changeset
871 #endif
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
872
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
873 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
874 &client_params_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
875
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
876 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
877 "quic SSL_get_peer_quic_transport_params():"
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
878 " params_len:%ui", client_params_len);
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
879
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
880 if (client_params_len == 0) {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
881 /* 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
882 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
883 qc->error_reason = "missing transport parameters";
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
884
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
885 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
886 "missing transport parameters");
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
887 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
888 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
889
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
890 p = (u_char *) client_params;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
891 end = p + client_params_len;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
892
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
893 /* defaults for parameters not sent by client */
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
894 ngx_memcpy(&ctp, &qc->ctp, sizeof(ngx_quic_tp_t));
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
895
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
896 if (ngx_quic_parse_transport_params(p, end, &ctp, c->log)
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
897 != NGX_OK)
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
898 {
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
899 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
900 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
901
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
902 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
903 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
904
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
905 if (ngx_quic_apply_transport_params(c, &ctp) != NGX_OK) {
7930
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
906 return 0;
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
907 }
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
908
5bc9229ec4cf QUIC: raise error on missing transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7929
diff changeset
909 qc->client_tp_done = 1;
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
910 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7725
diff changeset
911
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
912 fs = &qc->crypto[level];
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
913
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
914 frame = ngx_quic_alloc_frame(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
915 if (frame == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
916 return 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
917 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
918
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
919 frame->data = ngx_quic_copy_buf(c, (u_char *) data, len);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
920 if (frame->data == NGX_CHAIN_ERROR) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
921 return 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
922 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
923
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
924 frame->level = level;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
925 frame->type = NGX_QUIC_FT_CRYPTO;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
926 frame->u.crypto.offset = fs->sent;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
927 frame->u.crypto.length = len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
928
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
929 fs->sent += len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
930
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
931 ngx_quic_queue_frame(qc, frame);
7650
ec1f84996990 Split frame and packet generation into separate steps.
Vladimir Homutov <vl@nginx.com>
parents: 7649
diff changeset
932
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
933 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
934 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
935
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
936
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
937 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
938 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
939 {
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
940 #if (NGX_DEBUG)
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
941 ngx_connection_t *c;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
942
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
943 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
944
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
945 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
946 "quic ngx_quic_flush_flight()");
7837
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 7836
diff changeset
947 #endif
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
948 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
949 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
950
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
951
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
952 static int
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
953 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
954 uint8_t alert)
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
955 {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
956 ngx_connection_t *c;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
957 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
958
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
959 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
960
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
961 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
962 "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
963 (int) level, (int) alert);
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
964
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
965 qc = ngx_quic_get_connection(c);
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
966 if (qc == NULL) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
967 return 1;
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
968 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
969
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
970 qc->error_level = level;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
971 qc->error = NGX_QUIC_ERR_CRYPTO(alert);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
972 qc->error_reason = "TLS alert";
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
973 qc->error_app = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
974 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
975
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
976 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
977 return 0;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
978 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7700
diff changeset
979
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
980 return 1;
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
981 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
982
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
983
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
984 static ngx_int_t
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
985 ngx_quic_apply_transport_params(ngx_connection_t *c, ngx_quic_tp_t *ctp)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
986 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
987 ngx_quic_connection_t *qc;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
988
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
989 qc = ngx_quic_get_connection(c);
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
990
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
991 #if (NGX_QUIC_DRAFT_VERSION >= 28)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
992 if (qc->scid.len != ctp->initial_scid.len
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
993 || ngx_memcmp(qc->scid.data, ctp->initial_scid.data, qc->scid.len) != 0)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
994 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
995 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
996 "quic client initial_source_connection_id mismatch");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
997 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
998 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
999 #endif
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1000
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1001 if (ctp->max_udp_payload_size < NGX_QUIC_MIN_INITIAL_SIZE
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1002 || ctp->max_udp_payload_size > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1003 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1004 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1005 qc->error_reason = "invalid maximum packet size";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1006
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1007 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1008 "quic maximum packet size is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1009 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1010
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1011 } else if (ctp->max_udp_payload_size > ngx_quic_max_udp_payload(c)) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1012 ctp->max_udp_payload_size = ngx_quic_max_udp_payload(c);
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1013 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
1014 "quic client maximum packet size truncated");
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1015 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1016
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1017 if (ctp->active_connection_id_limit < 2) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1018 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1019 qc->error_reason = "invalid active_connection_id_limit";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1020
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1021 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1022 "quic active_connection_id_limit is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1023 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1024 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1025
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1026 if (ctp->ack_delay_exponent > 20) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1027 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1028 qc->error_reason = "invalid ack_delay_exponent";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1029
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1030 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1031 "quic ack_delay_exponent is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1032 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1033 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1034
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1035 if (ctp->max_ack_delay > 16384) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1036 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1037 qc->error_reason = "invalid max_ack_delay";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1038
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1039 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1040 "quic max_ack_delay is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1041 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1042 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1043
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1044 if (ctp->max_idle_timeout > 0
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1045 && ctp->max_idle_timeout < qc->tp.max_idle_timeout)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1046 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1047 qc->tp.max_idle_timeout = ctp->max_idle_timeout;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1048 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1049
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1050 qc->streams.server_max_streams_bidi = ctp->initial_max_streams_bidi;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1051 qc->streams.server_max_streams_uni = ctp->initial_max_streams_uni;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1052
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1053 ngx_memcpy(&qc->ctp, ctp, sizeof(ngx_quic_tp_t));
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1054
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1055 return NGX_OK;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1056 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1057
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1058
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1059 void
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1060 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
1061 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1062 ngx_int_t rc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1063 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1064
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1065 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
1066
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1067 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
1068 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
1069 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
1070 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1071 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1072
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1073 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1074
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1075 if (qc == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1076 ngx_quic_close_connection(c, NGX_DONE);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1077 return;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1078 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1079
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1080 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1081 ngx_quic_connstate_dbg(c);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1082
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1083 c->read->handler = ngx_quic_input_handler;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1084
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1085 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1086 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1087
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1088
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1089 static ngx_quic_connection_t *
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1090 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
1091 ngx_quic_header_t *pkt)
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1092 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1093 ngx_uint_t i;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
1094 ngx_quic_tp_t *ctp;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1095 ngx_quic_client_id_t *cid;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1096 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
1097
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1098 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1099 if (qc == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1100 return NULL;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1101 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1102
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
1103 qc->keys = ngx_quic_keys_new(c->pool);
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
1104 if (qc->keys == NULL) {
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
1105 return NULL;
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
1106 }
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
1107
8194
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
1108 qc->version = pkt->version;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
1109
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1110 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1111 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1112
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1113 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
1114 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
1115 ngx_queue_init(&qc->send_ctx[i].sent);
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
1116 qc->send_ctx[i].largest_pn = NGX_QUIC_UNSET_PN;
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
1117 qc->send_ctx[i].largest_ack = NGX_QUIC_UNSET_PN;
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
1118 qc->send_ctx[i].largest_range = NGX_QUIC_UNSET_PN;
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
1119 qc->send_ctx[i].pending_ack = NGX_QUIC_UNSET_PN;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
1120 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
1121
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
1122 qc->send_ctx[0].level = ssl_encryption_initial;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
1123 qc->send_ctx[1].level = ssl_encryption_handshake;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
1124 qc->send_ctx[2].level = ssl_encryption_application;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1125
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1126 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1127 ngx_queue_init(&qc->crypto[i].frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
1128 }
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1129
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1130 ngx_queue_init(&qc->free_frames);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1131 ngx_queue_init(&qc->client_ids);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1132 ngx_queue_init(&qc->server_ids);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1133 ngx_queue_init(&qc->free_client_ids);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1134 ngx_queue_init(&qc->free_server_ids);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1135
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1136 qc->avg_rtt = NGX_QUIC_INITIAL_RTT;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1137 qc->rttvar = NGX_QUIC_INITIAL_RTT / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1138 qc->min_rtt = NGX_TIMER_INFINITE;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1139
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1140 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1141 * qc->latest_rtt = 0
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1142 * qc->nclient_ids = 0
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1143 * qc->nserver_ids = 0
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1144 * qc->max_retired_seqnum = 0
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1145 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
1146
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1147 qc->received = pkt->raw->last - pkt->raw->start;
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1148
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1149 qc->pto.log = c->log;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1150 qc->pto.data = c;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1151 qc->pto.handler = ngx_quic_pto_handler;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
1152 qc->pto.cancelable = 1;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1153
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
1154 qc->push.log = c->log;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
1155 qc->push.data = c;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
1156 qc->push.handler = ngx_quic_push_handler;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
1157 qc->push.cancelable = 1;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
1158
7999
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
1159 qc->conf = conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 7998
diff changeset
1160 qc->tp = conf->tp;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1161
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1162 if (qc->tp.disable_active_migration) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1163 qc->sockaddr = ngx_palloc(c->pool, c->socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1164 if (qc->sockaddr == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1165 return NULL;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1166 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1167
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1168 ngx_memcpy(qc->sockaddr, c->sockaddr, c->socklen);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1169 qc->socklen = c->socklen;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1170 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1171
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
1172 ctp = &qc->ctp;
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1173
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1174 /* defaults to be used before actual client parameters are received */
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1175 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
1176 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
1177 ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY;
8294
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8291
diff changeset
1178 ctp->active_connection_id_limit = 2;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
1179
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
1180 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
1181
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
1182 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
1183 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
1184
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
1185 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
1186 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
1187 14720));
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
1188 qc->congestion.ssthresh = (size_t) -1;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
1189 qc->congestion.recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
1190
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1191 qc->odcid.len = pkt->odcid.len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1192 qc->odcid.data = ngx_pstrdup(c->pool, &pkt->odcid);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1193 if (qc->odcid.data == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1194 return NULL;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1195 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1196
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1197 qc->dcid.len = NGX_QUIC_SERVER_CID_LEN;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1198 qc->dcid.data = ngx_pnalloc(c->pool, qc->dcid.len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1199 if (qc->dcid.data == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1200 return NULL;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1201 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1202
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1203 if (ngx_quic_create_server_id(c, qc->dcid.data) != NGX_OK) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1204 return NULL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1205 }
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1206
7916
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7912
diff changeset
1207 #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
1208 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
1209 #endif
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1210 qc->tp.initial_scid = qc->dcid;
7912
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7910
diff changeset
1211
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1212 if (pkt->validated && pkt->retried) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1213 qc->tp.retry_scid.len = pkt->dcid.len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1214 qc->tp.retry_scid.data = ngx_pstrdup(c->pool, &pkt->dcid);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1215 if (qc->tp.retry_scid.data == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1216 return NULL;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1217 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1218 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1219
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1220 qc->scid.len = pkt->scid.len;
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1221 qc->scid.data = ngx_pstrdup(c->pool, &pkt->scid);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1222 if (qc->scid.data == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1223 return NULL;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1224 }
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1225
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
1226 cid = ngx_quic_alloc_client_id(c, qc);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1227 if (cid == NULL) {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1228 return NULL;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1229 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1230
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1231 cid->seqnum = 0;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1232 cid->len = pkt->scid.len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1233 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
1234
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1235 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
1236 qc->nclient_ids++;
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
1237 qc->client_seqnum = 0;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
1238
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1239 qc->server_seqnum = NGX_QUIC_UNSET_PN;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1240
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1241 if (ngx_quic_keys_set_initial_secret(c->pool, qc->keys, &pkt->dcid)
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1242 != NGX_OK)
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1243 {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1244 return NULL;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1245 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1246
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1247 c->udp = &qc->udp;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1248
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1249 if (ngx_quic_insert_server_id(c, &qc->odcid) == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1250 return NULL;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1251 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1252
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1253 qc->server_seqnum = 0;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1254
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1255 if (ngx_quic_insert_server_id(c, &qc->dcid) == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1256 return NULL;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1257 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1258
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1259 qc->validated = pkt->validated;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1260
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
1261 return qc;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1262 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1263
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 static ngx_int_t
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1266 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
1267 ngx_quic_header_t *pkt)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1268 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1269 u_char *token;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1270 size_t len, max;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1271 uint16_t rndbytes;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1272 u_char buf[NGX_QUIC_MAX_SR_PACKET];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1273
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1274 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
1275 "quic handle stateless reset output");
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1276
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1277 if (pkt->len <= NGX_QUIC_MIN_PKT_LEN) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1278 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1279 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1280
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1281 if (pkt->len <= NGX_QUIC_MIN_SR_PACKET) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1282 len = pkt->len - 1;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1283
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1284 } else {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1285 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
1286
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1287 if (RAND_bytes((u_char *) &rndbytes, sizeof(rndbytes)) != 1) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1288 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1289 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1290
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1291 len = (rndbytes % (max - NGX_QUIC_MIN_SR_PACKET + 1))
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1292 + NGX_QUIC_MIN_SR_PACKET;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1293 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1294
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1295 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
1296 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1297 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1298
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1299 buf[0] &= ~NGX_QUIC_PKT_LONG;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1300 buf[0] |= NGX_QUIC_PKT_FIXED_BIT;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1301
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1302 token = &buf[len - NGX_QUIC_SR_TOKEN_LEN];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1303
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1304 if (ngx_quic_new_sr_token(c, &pkt->dcid, conf->sr_token_key, token)
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1305 != NGX_OK)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1306 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1307 return NGX_ERROR;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1308 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1309
8240
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1310 (void) ngx_quic_send(c, buf, len);
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1311
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1312 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1313 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1314
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1315
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1316 static ngx_int_t
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1317 ngx_quic_new_sr_token(ngx_connection_t *c, ngx_str_t *cid, u_char *secret,
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1318 u_char *token)
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1319 {
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1320 ngx_str_t tmp;
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1321
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1322 tmp.data = secret;
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1323 tmp.len = NGX_QUIC_SR_KEY_LEN;
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1324
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1325 if (ngx_quic_derive_key(c->log, "sr_token_key", &tmp, cid, token,
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1326 NGX_QUIC_SR_TOKEN_LEN)
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1327 != NGX_OK)
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1328 {
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1329 return NGX_ERROR;
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1330 }
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1331
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1332 #if (NGX_DEBUG)
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1333 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1334 "quic stateless reset token %*xs",
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1335 (size_t) NGX_QUIC_SR_TOKEN_LEN, token);
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1336 #endif
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1337
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1338 return NGX_OK;
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1339 }
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1340
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1341
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1342 static ngx_int_t
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1343 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
1344 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1345 u_char *tail, ch;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1346 ngx_uint_t i;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1347 ngx_queue_t *q;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1348 ngx_quic_client_id_t *cid;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1349 ngx_quic_connection_t *qc;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1350
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1351 qc = ngx_quic_get_connection(c);
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1352
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1353 /* A stateless reset uses an entire UDP datagram */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1354 if (pkt->raw->start != pkt->data) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1355 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1356 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1357
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1358 tail = pkt->raw->last - NGX_QUIC_SR_TOKEN_LEN;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1359
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1360 for (q = ngx_queue_head(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1361 q != ngx_queue_sentinel(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1362 q = ngx_queue_next(q))
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1363 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1364 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
1365
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1366 if (cid->seqnum == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1367 /* no stateless reset token in initial connection id */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1368 continue;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1369 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1370
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1371 /* constant time comparison */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1372
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1373 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
1374 ch |= tail[i] ^ cid->sr_token[i];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1375 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1376
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1377 if (ch == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1378 return NGX_OK;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1379 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1380 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1381
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1382 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1383 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1384
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1385
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1386 static ngx_int_t
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1387 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
1388 {
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1389 size_t len;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1390 ngx_quic_header_t pkt;
8195
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8194
diff changeset
1391 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1392
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1393 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
1394 "sending version negotiation packet");
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1395
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1396 pkt.log = c->log;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1397 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
1398 pkt.dcid = inpkt->scid;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1399 pkt.scid = inpkt->dcid;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1400
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1401 len = ngx_quic_create_version_negotiation(&pkt, buf);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1402
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1403 #ifdef NGX_QUIC_DEBUG_PACKETS
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1404 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1405 "quic vnego packet to send len:%uz %*xs", len, len, buf);
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1406 #endif
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1407
8240
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1408 (void) ngx_quic_send(c, buf, len);
8060
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1409
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1410 return NGX_ERROR;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1411 }
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1412
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1413
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8057
diff changeset
1414 static ngx_int_t
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1415 ngx_quic_create_server_id(ngx_connection_t *c, u_char *id)
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1416 {
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1417 if (RAND_bytes(id, NGX_QUIC_SERVER_CID_LEN) != 1) {
7859
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
1418 return NGX_ERROR;
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
1419 }
b7704303a7e5 Server CID change refactored.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7858
diff changeset
1420
8269
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1421 #if (NGX_QUIC_BPF)
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1422 if (ngx_quic_bpf_attach_id(c, id) != NGX_OK) {
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1423 ngx_log_error(NGX_LOG_ERR, c->log, 0,
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1424 "quic bpf failed to generate socket key");
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1425 /* ignore error, things still may work */
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1426 }
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1427 #endif
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1428
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1429 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1430 "quic create server id %*xs",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1431 (size_t) NGX_QUIC_SERVER_CID_LEN, id);
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1432 return NGX_OK;
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1433 }
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1434
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1435
8269
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1436 #if (NGX_QUIC_BPF)
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1437
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1438 static ngx_int_t
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1439 ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id)
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1440 {
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1441 int fd;
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1442 uint64_t cookie;
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1443 socklen_t optlen;
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1444
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1445 fd = c->listening->fd;
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1446
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1447 optlen = sizeof(cookie);
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1448
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1449 if (getsockopt(fd, SOL_SOCKET, SO_COOKIE, &cookie, &optlen) == -1) {
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1450 ngx_log_error(NGX_LOG_ERR, c->log, ngx_socket_errno,
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1451 "quic getsockopt(SO_COOKIE) failed");
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1452
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1453 return NGX_ERROR;
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1454 }
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1455
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1456 ngx_quic_dcid_encode_key(id, cookie);
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1457
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1458 return NGX_OK;
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1459 }
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1460
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1461 #endif
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1462
7df607cb2d11 QUIC: ngx_quic_bpf module.
Vladimir Homutov <vl@nginx.com>
parents: 8267
diff changeset
1463
7845
89ccb04736b9 Server CID change.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7844
diff changeset
1464 static ngx_int_t
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1465 ngx_quic_send_retry(ngx_connection_t *c, ngx_quic_conf_t *conf,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1466 ngx_quic_header_t *inpkt)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1467 {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1468 time_t expires;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1469 ssize_t len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1470 ngx_str_t res, token;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1471 ngx_quic_header_t pkt;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1472
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1473 u_char buf[NGX_QUIC_RETRY_BUFFER_SIZE];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1474 u_char dcid[NGX_QUIC_SERVER_CID_LEN];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1475
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1476 expires = ngx_time() + NGX_QUIC_RETRY_TOKEN_LIFETIME;
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1477
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1478 if (ngx_quic_new_token(c, conf->av_token_key, &token, &inpkt->dcid,
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1479 expires, 1)
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1480 != NGX_OK)
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1481 {
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1482 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1483 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1484
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1485 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1486 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_RETRY;
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1487 pkt.version = inpkt->version;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1488 pkt.log = c->log;
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1489
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1490 pkt.odcid = inpkt->dcid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1491 pkt.dcid = inpkt->scid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1492
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1493 /* TODO: generate routable dcid */
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1494 if (RAND_bytes(dcid, NGX_QUIC_SERVER_CID_LEN) != 1) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1495 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1496 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1497
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1498 pkt.scid.len = NGX_QUIC_SERVER_CID_LEN;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1499 pkt.scid.data = dcid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1500
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1501 pkt.token = token;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1502
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1503 res.data = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1504
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
1505 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1506 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1507 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1508
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1509 #ifdef NGX_QUIC_DEBUG_PACKETS
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1510 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1511 "quic packet to send len:%uz %xV", res.len, &res);
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1512 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1513
8240
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1514 len = ngx_quic_send(c, res.data, res.len);
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1515 if (len == NGX_ERROR) {
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1516 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1517 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1518
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1519 ngx_log_debug(NGX_LOG_DEBUG_EVENT, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
1520 "quic retry packet sent to %xV", &pkt.dcid);
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1521
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1522 /*
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1523 * quic-transport 17.2.5.1: A server MUST NOT send more than one Retry
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1524 * packet in response to a single UDP datagram.
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1525 * NGX_DONE will stop quic_input() from processing further
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1526 */
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1527 return NGX_DONE;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1528 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1529
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1530
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1531 static ngx_int_t
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1532 ngx_quic_new_token(ngx_connection_t *c, u_char *key, ngx_str_t *token,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1533 ngx_str_t *odcid, time_t exp, ngx_uint_t is_retry)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1534 {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1535 int len, iv_len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1536 u_char *p, *iv;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1537 EVP_CIPHER_CTX *ctx;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1538 const EVP_CIPHER *cipher;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1539
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1540 u_char in[NGX_QUIC_MAX_TOKEN_SIZE];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1541
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1542 ngx_quic_address_hash(c, !is_retry, in);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1543
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1544 p = in + 20;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1545
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1546 p = ngx_cpymem(p, &exp, sizeof(time_t));
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1547
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1548 *p++ = is_retry ? 1 : 0;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1549
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1550 if (odcid) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1551 *p++ = odcid->len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1552 p = ngx_cpymem(p, odcid->data, odcid->len);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1553
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1554 } else {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1555 *p++ = 0;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1556 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1557
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1558 len = p - in;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1559
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1560 cipher = EVP_aes_256_cbc();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1561 iv_len = EVP_CIPHER_iv_length(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1562
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1563 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
1564 token->data = ngx_pnalloc(c->pool, token->len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1565 if (token->data == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1566 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1567 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1568
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1569 ctx = EVP_CIPHER_CTX_new();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1570 if (ctx == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1571 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1572 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1573
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1574 iv = token->data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1575
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1576 if (RAND_bytes(iv, iv_len) <= 0
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1577 || !EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv))
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1578 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1579 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1580 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1581 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1582
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1583 token->len = iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1584
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1585 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
1586 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1587 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1588 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1589
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1590 token->len += len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1591
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1592 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
1593 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1594 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1595 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1596
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1597 token->len += len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1598
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1599 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1600
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1601 #ifdef NGX_QUIC_DEBUG_PACKETS
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1602 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1603 "quic new token len:%uz %xV", token->len, token);
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1604 #endif
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1605
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1606 return NGX_OK;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1607 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1608
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1609
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1610 static void
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1611 ngx_quic_address_hash(ngx_connection_t *c, ngx_uint_t no_port, u_char buf[20])
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1612 {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1613 size_t len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1614 u_char *data;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1615 ngx_sha1_t sha1;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1616 struct sockaddr_in *sin;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1617 #if (NGX_HAVE_INET6)
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1618 struct sockaddr_in6 *sin6;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1619 #endif
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1620
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1621 len = (size_t) c->socklen;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1622 data = (u_char *) c->sockaddr;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1623
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1624 if (no_port) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1625 switch (c->sockaddr->sa_family) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1626
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1627 #if (NGX_HAVE_INET6)
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1628 case AF_INET6:
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1629 sin6 = (struct sockaddr_in6 *) c->sockaddr;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1630
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1631 len = sizeof(struct in6_addr);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1632 data = sin6->sin6_addr.s6_addr;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1633
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1634 break;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1635 #endif
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1636
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1637 case AF_INET:
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1638 sin = (struct sockaddr_in *) c->sockaddr;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1639
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1640 len = sizeof(in_addr_t);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1641 data = (u_char *) &sin->sin_addr;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1642
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1643 break;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1644 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1645 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1646
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1647 ngx_sha1_init(&sha1);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1648 ngx_sha1_update(&sha1, data, len);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1649 ngx_sha1_final(buf, &sha1);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1650 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1651
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1652
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1653 static ngx_int_t
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1654 ngx_quic_validate_token(ngx_connection_t *c, u_char *key,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1655 ngx_quic_header_t *pkt)
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1656 {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1657 int len, tlen, iv_len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1658 u_char *iv, *p;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1659 time_t now, exp;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1660 size_t total;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1661 ngx_str_t odcid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1662 EVP_CIPHER_CTX *ctx;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1663 const EVP_CIPHER *cipher;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1664
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1665 u_char addr_hash[20];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1666 u_char tdec[NGX_QUIC_MAX_TOKEN_SIZE];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1667
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1668 /* Retry token or NEW_TOKEN in a previous connection */
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1669
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1670 cipher = EVP_aes_256_cbc();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1671 iv = pkt->token.data;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1672 iv_len = EVP_CIPHER_iv_length(cipher);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1673
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1674 /* sanity checks */
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1675
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1676 if (pkt->token.len < (size_t) iv_len + EVP_CIPHER_block_size(cipher)) {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1677 goto garbage;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1678 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1679
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1680 if (pkt->token.len > (size_t) iv_len + NGX_QUIC_MAX_TOKEN_SIZE) {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1681 goto garbage;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1682 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1683
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1684 ctx = EVP_CIPHER_CTX_new();
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1685 if (ctx == NULL) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1686 return NGX_ERROR;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1687 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1688
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1689 if (!EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv)) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1690 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1691 return NGX_ERROR;
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
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1694 p = pkt->token.data + iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1695 len = pkt->token.len - iv_len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1696
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1697 if (EVP_DecryptUpdate(ctx, tdec, &len, p, len) != 1) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1698 EVP_CIPHER_CTX_free(ctx);
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1699 goto garbage;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1700 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1701 total = len;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1702
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1703 if (EVP_DecryptFinal_ex(ctx, tdec + len, &tlen) <= 0) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1704 EVP_CIPHER_CTX_free(ctx);
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1705 goto garbage;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1706 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1707 total += tlen;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1708
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1709 EVP_CIPHER_CTX_free(ctx);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1710
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1711 if (total < (20 + sizeof(time_t) + 2)) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1712 goto garbage;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1713 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1714
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1715 p = tdec + 20;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1716
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1717 ngx_memcpy(&exp, p, sizeof(time_t));
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1718 p += sizeof(time_t);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1719
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1720 pkt->retried = (*p++ == 1);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1721
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1722 ngx_quic_address_hash(c, !pkt->retried, addr_hash);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1723
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1724 if (ngx_memcmp(tdec, addr_hash, 20) != 0) {
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1725 goto bad_token;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1726 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1727
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1728 odcid.len = *p++;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1729 if (odcid.len) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1730 if (odcid.len > NGX_QUIC_MAX_CID_LEN) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1731 goto bad_token;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1732 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1733
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1734 if ((size_t)(tdec + total - p) < odcid.len) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1735 goto bad_token;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1736 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1737
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1738 odcid.data = p;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1739 p += odcid.len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1740 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1741
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1742 now = ngx_time();
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1743
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1744 if (now > exp) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1745 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
1746 return NGX_DECLINED;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1747 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1748
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1749 if (odcid.len) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1750 pkt->odcid.len = odcid.len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1751 pkt->odcid.data = ngx_pstrdup(c->pool, &odcid);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1752 if (pkt->odcid.data == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1753 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1754 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1755
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1756 } else {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1757 pkt->odcid = pkt->dcid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1758 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1759
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1760 pkt->validated = 1;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1761
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1762 return NGX_OK;
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1763
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1764 garbage:
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1765
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1766 ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic garbage token");
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1767
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1768 return NGX_ABORT;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1769
7876
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1770 bad_token:
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
1771
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
1772 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
1773
8192
183275308d9a QUIC: fixed address validation issues in a new connection.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8191
diff changeset
1774 return NGX_DECLINED;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1775 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1776
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1777
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1778 static ngx_int_t
7687
69345a26ba69 Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents: 7686
diff changeset
1779 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
1780 {
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1781 u_char *p;
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1782 size_t clen;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1783 ssize_t len;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1784 ngx_ssl_conn_t *ssl_conn;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1785 ngx_quic_connection_t *qc;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1786
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1787 qc = ngx_quic_get_connection(c);
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1788
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1789 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
1790 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1791 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1792
8239
f596a4e5794b QUIC: disabling bidirectional SSL shutdown earlier.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1793 c->ssl->no_wait_shutdown = 1;
f596a4e5794b QUIC: disabling bidirectional SSL shutdown earlier.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1794
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1795 ssl_conn = c->ssl->connection;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1796
7698
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1797 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
1798 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1799 "quic SSL_set_quic_method() failed");
7698
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1800 return NGX_ERROR;
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1801 }
253cf267f95a Moved setting QUIC methods to runtime.
Roman Arutyunyan <arut@nginx.com>
parents: 7697
diff changeset
1802
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1803 #ifdef SSL_READ_EARLY_DATA_SUCCESS
8102
b52b2a33b0e5 QUIC: fixed build with OpenSSL after bed310672f39.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8101
diff changeset
1804 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
1805 SSL_set_quic_early_data_enabled(ssl_conn, 1);
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1806 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1807 #endif
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
1808
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
1809 if (ngx_quic_new_sr_token(c, &qc->dcid, qc->conf->sr_token_key,
8204
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8201
diff changeset
1810 qc->tp.sr_token)
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8201
diff changeset
1811 != NGX_OK)
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8201
diff changeset
1812 {
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8201
diff changeset
1813 return NGX_ERROR;
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8201
diff changeset
1814 }
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8201
diff changeset
1815
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1816 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1817 "quic stateless reset token %*xs",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1818 (size_t) NGX_QUIC_SR_TOKEN_LEN, qc->tp.sr_token);
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
1819
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1820 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
1821 /* always succeeds */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1822
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1823 p = ngx_pnalloc(c->pool, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1824 if (p == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1825 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1826 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1827
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1828 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
1829 if (len < 0) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1830 return NGX_ERROR;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1831 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1832
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1833 #ifdef NGX_QUIC_DEBUG_PACKETS
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1834 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
1835 "quic transport parameters len:%uz %*xs", len, len, p);
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1836 #endif
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
1837
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7712
diff changeset
1838 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
1839 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1840 "quic SSL_set_quic_transport_params() failed");
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1841 return NGX_ERROR;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1842 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1843
7917
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1844 #if NGX_OPENSSL_QUIC_ZRTT_CTX
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1845 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
1846 ngx_log_error(NGX_LOG_INFO, c->log, 0,
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1847 "quic SSL_set_quic_early_data_context() failed");
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1848 return NGX_ERROR;
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1849 }
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1850 #endif
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7916
diff changeset
1851
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1852 return NGX_OK;
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1853 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1854
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1855
7931
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1856 static ngx_inline size_t
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1857 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
1858 {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1859 /* TODO: path MTU discovery */
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1860
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1861 #if (NGX_HAVE_INET6)
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1862 if (c->sockaddr->sa_family == AF_INET6) {
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1863 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT6;
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1864 }
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1865 #endif
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1866
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1867 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT;
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1868 }
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1869
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 7930
diff changeset
1870
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1871 static void
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
1872 ngx_quic_input_handler(ngx_event_t *rev)
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1873 {
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1874 ssize_t n;
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1875 ngx_int_t rc;
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1876 ngx_buf_t b;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1877 ngx_connection_t *c;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1878 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
1879 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
1880
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1881 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler");
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1882
7871
df18ae7161b8 Assorted fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7870
diff changeset
1883 ngx_memzero(&b, sizeof(ngx_buf_t));
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1884 b.start = buf;
7731
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 7729
diff changeset
1885 b.end = buf + sizeof(buf);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1886 b.pos = b.last = b.start;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
1887 b.memory = 1;
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1888
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1889 c = rev->data;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1890 qc = ngx_quic_get_connection(c);
7677
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 7675
diff changeset
1891
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
1892 c->log->action = "handling quic input";
7678
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1893
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1894 if (rev->timedout) {
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1895 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
1896 "quic client timed out");
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1897 ngx_quic_close_connection(c, NGX_DONE);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1898 return;
7678
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1899 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 7677
diff changeset
1900
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1901 if (c->close) {
7937
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7934
diff changeset
1902 qc->error_reason = "graceful shutdown";
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7934
diff changeset
1903 ngx_quic_close_connection(c, NGX_OK);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1904 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1905 }
7686
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7684
diff changeset
1906
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1907 n = c->recv(c, b.start, b.end - b.start);
7681
38c0898b6df7 HTTP/3.
Roman Arutyunyan <arut@nginx.com>
parents: 7680
diff changeset
1908
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1909 if (n == NGX_AGAIN) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1910 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1911 ngx_quic_close_connection(c, NGX_OK);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1912 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1913 return;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1914 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1915
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1916 if (n == NGX_ERROR) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1917 c->read->eof = 1;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1918 ngx_quic_close_connection(c, NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1919 return;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1920 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1921
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1922 if (qc->tp.disable_active_migration) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1923 if (c->socklen != qc->socklen
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1924 || ngx_memcmp(c->sockaddr, qc->sockaddr, c->socklen) != 0)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1925 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1926 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1927 "quic dropping packet from new address");
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1928 return;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1929 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1930 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
1931
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1932 b.last += n;
7995
031918df51c0 QUIC: added anti-amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 7994
diff changeset
1933 qc->received += n;
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1934
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
1935 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
1936
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1937 if (rc == NGX_ERROR) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1938 ngx_quic_close_connection(c, NGX_ERROR);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1939 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1940 }
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1941
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1942 if (rc == NGX_DECLINED) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1943 return;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1944 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1945
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1946 /* rc == NGX_OK */
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
1947
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1948 qc->send_timer_set = 0;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
1949 ngx_add_timer(rev, qc->tp.max_idle_timeout);
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
1950
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
1951 ngx_quic_connstate_dbg(c);
7665
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1952 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1953
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 7664
diff changeset
1954
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1955 static void
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1956 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
1957 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1958 ngx_pool_t *pool;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1959 ngx_quic_connection_t *qc;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
1960
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1961 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
1962 "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
1963
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1964 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1965
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
1966 if (qc == NULL) {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1967 if (rc == NGX_ERROR) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1968 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
1969 "quic close connection early error");
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1970 }
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1971
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1972 } 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
1973 return;
7747
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
1974 }
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1975
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1976 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1977 (void) ngx_ssl_shutdown(c);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1978 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1979
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1980 if (c->read->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1981 ngx_del_timer(c->read);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1982 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
1983
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1984 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1985 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1986 #endif
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1987
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1988 c->destroyed = 1;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1989
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1990 pool = c->pool;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1991
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1992 ngx_close_connection(c);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1993
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
1994 ngx_destroy_pool(pool);
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1995 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1996
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
1997
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
1998 static ngx_int_t
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
1999 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
2000 {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2001 ngx_uint_t i;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2002 ngx_queue_t *q;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2003 ngx_quic_send_ctx_t *ctx;
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2004 ngx_quic_server_id_t *sid;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2005 ngx_quic_connection_t *qc;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2006
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2007 qc = ngx_quic_get_connection(c);
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2008
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2009 if (!qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2010
7875
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
2011 /* 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
2012 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8236
e9bd4305e68b QUIC: fixed send contexts cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
2013 ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
7875
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
2014 }
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 7874
diff changeset
2015
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2016 if (rc == NGX_DONE) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2017
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2018 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2019 * 10.2. Idle Timeout
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2020 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2021 * 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
2022 * 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
2023 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2024
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2025 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
2026 "quic closing %s connection",
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2027 qc->draining ? "drained" : "idle");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2028
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2029 } else {
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2030
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2031 /*
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2032 * 10.3. Immediate Close
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2033 *
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2034 * 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
2035 * to terminate the connection immediately.
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2036 */
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2037
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2038 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
2039 : ssl_encryption_initial;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2040
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2041 if (rc == NGX_OK) {
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
2042 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
2043 "quic immediate close drain:%d",
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
2044 qc->draining);
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2045
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2046 qc->close.log = c->log;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2047 qc->close.data = c;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2048 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
2049 qc->close.cancelable = 1;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2050
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2051 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
2052
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
2053 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
2054
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2055 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
2056
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2057 } else {
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2058 if (qc->error == 0 && !qc->error_app) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2059 qc->error = NGX_QUIC_ERR_INTERNAL_ERROR;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2060 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2061
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2062 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
2063 "quic immediate close due to %s error: %ui %s",
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2064 qc->error_app ? "app " : "", qc->error,
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2065 qc->error_reason ? qc->error_reason : "");
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2066 }
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2067
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2068 (void) ngx_quic_send_cc(c);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2069
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2070 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
2071 /* 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
2072 qc->error_level = ssl_encryption_initial;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2073 (void) ngx_quic_send_cc(c);
7877
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7876
diff changeset
2074 }
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2075 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2076
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2077 qc->closing = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2078 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2079
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2080 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
2081 /* 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
2082 ngx_del_timer(&qc->close);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2083 }
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2084
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2085 if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2086 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2087 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2088
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2089 if (qc->push.timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2090 ngx_del_timer(&qc->push);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2091 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2092
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
2093 if (qc->pto.timer_set) {
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
2094 ngx_del_timer(&qc->pto);
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2095 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2096
7929
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
2097 if (qc->push.posted) {
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
2098 ngx_delete_posted_event(&qc->push);
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
2099 }
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7928
diff changeset
2100
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2101 while (!ngx_queue_empty(&qc->server_ids)) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2102 q = ngx_queue_head(&qc->server_ids);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2103 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2104
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2105 ngx_queue_remove(q);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2106 ngx_rbtree_delete(&c->listening->rbtree, &sid->udp.node);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2107 qc->nserver_ids--;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2108 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2109
8091
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
2110 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
2111 return NGX_AGAIN;
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
2112 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8084
diff changeset
2113
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2114 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
2115 "quic part of connection is terminated");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2116
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2117 /* may be tested from SSL callback during SSL shutdown */
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2118 c->udp = NULL;
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2119
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2120 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2121 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2122
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2123
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2124 void
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2125 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
2126 const char *reason)
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2127 {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2128 ngx_quic_connection_t *qc;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2129
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2130 qc = ngx_quic_get_connection(c);
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2131 qc->error = err;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2132 qc->error_reason = reason;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2133 qc->error_app = 1;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2134 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2135
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2136 ngx_quic_close_connection(c, NGX_ERROR);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2137 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2138
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2139
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2140 static void
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2141 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
2142 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2143 ngx_connection_t *c;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2144
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2145 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
2146
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2147 c = ev->data;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2148 ngx_quic_close_connection(c, NGX_DONE);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2149 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2150
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2151
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2152 static ngx_int_t
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2153 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
2154 {
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
2155 ngx_event_t *rev, *wev;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2156 ngx_rbtree_t *tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2157 ngx_rbtree_node_t *node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2158 ngx_quic_stream_t *qs;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2159
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2160 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2161 ngx_uint_t ns;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2162 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2163
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2164 tree = &qc->streams.tree;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2165
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2166 if (tree->root == tree->sentinel) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2167 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2168 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2169
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2170 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2171 ns = 0;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2172 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2173
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2174 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2175 node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2176 node = ngx_rbtree_next(tree, node))
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2177 {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2178 qs = (ngx_quic_stream_t *) node;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2179
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2180 rev = qs->c->read;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
2181 rev->error = 1;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2182 rev->ready = 1;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
2183
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
2184 wev = qs->c->write;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
2185 wev->error = 1;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
2186 wev->ready = 1;
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2187
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2188 ngx_post_event(rev, &ngx_posted_events);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2189
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2190 if (rev->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2191 ngx_del_timer(rev);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2192 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2193
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2194 #if (NGX_DEBUG)
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2195 ns++;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2196 #endif
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2197 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2198
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2199 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
2200 "quic connection has %ui active streams", ns);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2201
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2202 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2203 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2204
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2205
8296
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2206 ngx_int_t
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2207 ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err)
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2208 {
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2209 ngx_event_t *wev;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2210 ngx_connection_t *pc;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2211 ngx_quic_frame_t *frame;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2212 ngx_quic_stream_t *qs;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2213 ngx_quic_connection_t *qc;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2214
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2215 qs = c->quic;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2216 pc = qs->parent;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2217 qc = ngx_quic_get_connection(pc);
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2218
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2219 frame = ngx_quic_alloc_frame(pc);
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2220 if (frame == NULL) {
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2221 return NGX_ERROR;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2222 }
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2223
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2224 frame->level = ssl_encryption_application;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2225 frame->type = NGX_QUIC_FT_RESET_STREAM;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2226 frame->u.reset_stream.id = qs->id;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2227 frame->u.reset_stream.error_code = err;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2228 frame->u.reset_stream.final_size = c->sent;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2229
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2230 ngx_quic_queue_frame(qc, frame);
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2231
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2232 wev = c->write;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2233 wev->error = 1;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2234 wev->ready = 1;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2235
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2236 return NGX_OK;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2237 }
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2238
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
2239
7831
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 7827
diff changeset
2240 static ngx_int_t
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
2241 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
2242 {
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2243 u_char *p;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2244 ngx_int_t rc;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2245 ngx_uint_t good;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2246 ngx_quic_header_t pkt;
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
2247
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2248 good = 0;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2249
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2250 p = b->pos;
7674
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 7673
diff changeset
2251
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2252 while (p < b->last) {
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2253
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2254 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2255 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2256 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2257 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2258 pkt.log = c->log;
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
2259 pkt.flags = p[0];
8097
a89a58c642ef QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents: 8096
diff changeset
2260 pkt.raw->pos++;
7659
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 7658
diff changeset
2261
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
2262 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
2263
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2264 #if (NGX_DEBUG)
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2265 if (pkt.parsed) {
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
2266 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,
8168
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8167
diff changeset
2267 "quic packet %s done decr:%d pn:%L perr:%ui rc:%i",
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2268 ngx_quic_level_name(pkt.level), pkt.decrypted,
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
2269 pkt.pn, pkt.error, rc);
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2270 } else {
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2271 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8168
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8167
diff changeset
2272 "quic packet done parse failed rc:%i", rc);
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2273 }
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2274 #endif
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2275
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2276 if (rc == NGX_ERROR) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2277 return NGX_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2278 }
7672
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 7671
diff changeset
2279
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2280 if (rc == NGX_DONE) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2281 /* stop further processing */
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2282 return NGX_DECLINED;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2283 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2284
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2285 if (rc == NGX_OK) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2286 good = 1;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2287 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2288
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2289 /* NGX_OK || NGX_DECLINED */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2290
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2291 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2292 * 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
2293 * to decrypt packet.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2294 * 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
2295 * retransmission:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2296 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2297 * 12.2. Coalescing Packets:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2298 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2299 * For example, if decryption fails (because the keys are
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2300 * not available or any other reason), the receiver MAY either
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2301 * discard or buffer the packet for later processing and MUST
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2302 * attempt to process the remaining packets.
8073
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
2303 *
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8071
diff changeset
2304 * 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
2305 * or cannot be parsed properly.
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2306 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2307
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2308 /* 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
2309 b->pos = pkt.data + pkt.len;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2310
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2311 /* 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
2312 while (b->pos < b->last && *(b->pos) == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2313 b->pos++;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2314 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2315
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2316 p = b->pos;
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2317 }
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2318
8083
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8079
diff changeset
2319 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
2320 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2321
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2322
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2323 static ngx_int_t
8101
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8100
diff changeset
2324 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
2325 ngx_quic_header_t *pkt)
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2326 {
8074
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
2327 ngx_int_t rc;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2328 ngx_quic_connection_t *qc;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2329
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2330 c->log->action = "parsing quic packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2331
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2332 rc = ngx_quic_parse_packet(pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2333
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2334 if (rc == NGX_DECLINED || rc == NGX_ERROR) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2335 return rc;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2336 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2337
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2338 pkt->parsed = 1;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2339
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2340 c->log->action = "processing quic packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2341
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2342 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2343 "quic packet rx dcid len:%uz %xV",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2344 pkt->dcid.len, &pkt->dcid);
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2345
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
2346 #if (NGX_DEBUG)
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
2347 if (pkt->level != ssl_encryption_application) {
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2348 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2349 "quic packet rx scid len:%uz %xV",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2350 pkt->scid.len, &pkt->scid);
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
2351 }
8211
fe53def49945 QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8209
diff changeset
2352
fe53def49945 QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8209
diff changeset
2353 if (pkt->level == ssl_encryption_initial) {
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2354 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
2355 "quic address validation token len:%uz %xV",
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
2356 pkt->token.len, &pkt->token);
8211
fe53def49945 QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8209
diff changeset
2357 }
8137
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
2358 #endif
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8136
diff changeset
2359
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2360 qc = ngx_quic_get_connection(c);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2361
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2362 if (qc) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2363
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2364 if (rc == NGX_ABORT) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2365 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2366 "quic unsupported version: 0x%xD", pkt->version);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2367 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2368 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2369
8194
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
2370 if (pkt->level != ssl_encryption_application) {
8281
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2371
8194
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
2372 if (pkt->version != qc->version) {
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
2373 ngx_log_error(NGX_LOG_INFO, c->log, 0,
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
2374 "quic version mismatch: 0x%xD", pkt->version);
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
2375 return NGX_DECLINED;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8193
diff changeset
2376 }
8281
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2377
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2378 if (ngx_quic_check_csid(qc, pkt) != NGX_OK) {
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2379 return NGX_DECLINED;
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
2380 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
2381
8281
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2382 } else {
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2383
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2384 if (ngx_quic_process_stateless_reset(c, pkt) == NGX_OK) {
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2385 ngx_log_error(NGX_LOG_INFO, c->log, 0,
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2386 "quic stateless reset packet detected");
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2387
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2388 qc->draining = 1;
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2389 ngx_quic_close_connection(c, NGX_OK);
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2390
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2391 return NGX_OK;
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2392 }
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2393 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2394
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2395 return ngx_quic_process_payload(c, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2396 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2397
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2398 /* packet does not belong to a connection */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2399
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2400 if (rc == NGX_ABORT) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2401 return ngx_quic_negotiate_version(c, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2402 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2403
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2404 if (pkt->level == ssl_encryption_application) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2405 return ngx_quic_send_stateless_reset(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2406 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2407
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2408 if (pkt->level != ssl_encryption_initial) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2409 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2410 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2411
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2412 c->log->action = "processing initial packet";
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2413
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2414 if (pkt->dcid.len < NGX_QUIC_CID_LEN_MIN) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2415 /* 7.2. Negotiating Connection IDs */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2416 ngx_log_error(NGX_LOG_INFO, c->log, 0,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2417 "quic too short dcid in initial"
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2418 " packet: len:%i", pkt->dcid.len);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2419 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2420 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2421
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2422 /* process retry and initialize connection IDs */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2423
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2424 if (pkt->token.len) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2425
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
2426 rc = ngx_quic_validate_token(c, conf->av_token_key, pkt);
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2427
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2428 if (rc == NGX_ERROR) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2429 /* internal error */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2430 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2431
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2432 } else if (rc == NGX_ABORT) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2433 /* token cannot be decrypted */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2434 return ngx_quic_send_early_cc(c, pkt,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2435 NGX_QUIC_ERR_INVALID_TOKEN,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2436 "cannot decrypt token");
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2437 } else if (rc == NGX_DECLINED) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2438 /* token is invalid */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2439
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2440 if (pkt->retried) {
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
2441 /* invalid address validation token */
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2442 return ngx_quic_send_early_cc(c, pkt,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2443 NGX_QUIC_ERR_INVALID_TOKEN,
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
2444 "invalid address validation token");
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2445 } else if (conf->retry) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2446 /* invalid NEW_TOKEN */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2447 return ngx_quic_send_retry(c, conf, pkt);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2448 }
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2449 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2450
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2451 /* NGX_OK */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2452
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2453 } else if (conf->retry) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2454 return ngx_quic_send_retry(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2455
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2456 } else {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2457 pkt->odcid = pkt->dcid;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2458 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2459
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2460 if (ngx_terminate || ngx_exiting) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2461 if (conf->retry) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2462 return ngx_quic_send_retry(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2463 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2464
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2465 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2466 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2467
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2468 c->log->action = "creating quic connection";
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2469
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2470 qc = ngx_quic_new_connection(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2471 if (qc == NULL) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2472 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2473 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2474
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2475 return ngx_quic_process_payload(c, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2476 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2477
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2478
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2479 static ngx_int_t
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2480 ngx_quic_process_payload(ngx_connection_t *c, ngx_quic_header_t *pkt)
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2481 {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2482 ngx_int_t rc;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2483 ngx_quic_send_ctx_t *ctx;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2484 ngx_quic_connection_t *qc;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2485 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2486
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2487 qc = ngx_quic_get_connection(c);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2488
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2489 qc->error = 0;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2490 qc->error_reason = 0;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2491
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2492 c->log->action = "decrypting packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2493
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2494 if (!ngx_quic_keys_available(qc->keys, pkt->level)) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2495 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2496 "quic no level %d keys yet, ignoring packet", pkt->level);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2497 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2498 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2499
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2500 pkt->keys = qc->keys;
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2501 pkt->key_phase = qc->key_phase;
7860
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2502 pkt->plaintext = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2503
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2504 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7859
diff changeset
2505
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2506 rc = ngx_quic_decrypt(pkt, &ctx->largest_pn);
8074
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8073
diff changeset
2507 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
2508 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
2509 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
2510 return rc;
7689
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
2511 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
2512
8139
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2513 pkt->decrypted = 1;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8138
diff changeset
2514
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2515 if (c->ssl == NULL) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2516 if (ngx_quic_init_connection(c) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2517 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2518 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2519 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2520
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2521 if (pkt->level == ssl_encryption_handshake) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2522 /*
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2523 * 4.10.1. The successful use of Handshake packets indicates
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2524 * that no more Initial packets need to be exchanged
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2525 */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2526 ngx_quic_discard_ctx(c, ssl_encryption_initial);
8170
e2086d8181fa QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents: 8169
diff changeset
2527
e2086d8181fa QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents: 8169
diff changeset
2528 if (qc->validated == 0) {
e2086d8181fa QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents: 8169
diff changeset
2529 qc->validated = 1;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2530 ngx_post_event(&qc->push, &ngx_posted_events);
8170
e2086d8181fa QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents: 8169
diff changeset
2531 }
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2532 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2533
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2534 if (qc->closing) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2535 /*
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2536 * 10.1 Closing and Draining Connection States
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2537 * ... delayed or reordered packets are properly discarded.
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2538 *
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2539 * An endpoint retains only enough information to generate
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2540 * a packet containing a CONNECTION_CLOSE frame and to identify
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2541 * packets as belonging to the connection.
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2542 */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2543
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2544 qc->error_level = pkt->level;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2545 qc->error = NGX_QUIC_ERR_NO_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2546 qc->error_reason = "connection is closing, packet discarded";
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2547 qc->error_ftype = 0;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2548 qc->error_app = 0;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2549
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2550 return ngx_quic_send_cc(c);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2551 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2552
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
2553 pkt->received = ngx_current_msec;
8133
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8132
diff changeset
2554
8135
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2555 c->log->action = "handling payload";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8134
diff changeset
2556
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2557 if (pkt->level != ssl_encryption_application) {
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2558 return ngx_quic_handle_frames(c, pkt);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2559 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2560
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2561 if (!pkt->key_update) {
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2562 return ngx_quic_handle_frames(c, pkt);
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2563 }
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2564
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2565 /* switch keys and generate next on Key Phase change */
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2566
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2567 qc->key_phase ^= 1;
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2568 ngx_quic_keys_switch(c, qc->keys);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2569
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2570 rc = ngx_quic_handle_frames(c, pkt);
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2571 if (rc != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2572 return rc;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2573 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2574
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2575 return ngx_quic_keys_update(c, qc->keys);
7689
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
2576 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
2577
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 7688
diff changeset
2578
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2579 static ngx_int_t
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2580 ngx_quic_send_early_cc(ngx_connection_t *c, ngx_quic_header_t *inpkt,
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2581 ngx_uint_t err, const char *reason)
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2582 {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2583 ssize_t len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2584 ngx_str_t res;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2585 ngx_quic_frame_t frame;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2586 ngx_quic_header_t pkt;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2587
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2588 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2589 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2590
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2591 ngx_memzero(&frame, sizeof(ngx_quic_frame_t));
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2592 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2593
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2594 frame.level = inpkt->level;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2595 frame.type = NGX_QUIC_FT_CONNECTION_CLOSE;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2596 frame.u.close.error_code = err;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2597
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2598 frame.u.close.reason.data = (u_char *) reason;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2599 frame.u.close.reason.len = ngx_strlen(reason);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2600
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2601 len = ngx_quic_create_frame(NULL, &frame);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2602 if (len > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2603 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2604 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2605
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2606 ngx_quic_log_frame(c->log, &frame, 1);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2607
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2608 len = ngx_quic_create_frame(src, &frame);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2609 if (len == -1) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2610 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2611 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2612
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2613 pkt.keys = ngx_quic_keys_new(c->pool);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2614 if (pkt.keys == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2615 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2616 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2617
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2618 if (ngx_quic_keys_set_initial_secret(c->pool, pkt.keys, &inpkt->dcid)
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2619 != NGX_OK)
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2620 {
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2621 return NGX_ERROR;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2622 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2623
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2624 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2625 | NGX_QUIC_PKT_INITIAL;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2626
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2627 pkt.num_len = 1;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2628 /*
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2629 * pkt.num = 0;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2630 * pkt.trunc = 0;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2631 */
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2632
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2633 pkt.version = inpkt->version;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2634 pkt.log = c->log;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2635 pkt.level = inpkt->level;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2636 pkt.dcid = inpkt->scid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2637 pkt.scid = inpkt->dcid;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2638 pkt.payload.data = src;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2639 pkt.payload.len = len;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2640
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2641 res.data = dst;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2642
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2643 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2644 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2645 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2646
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2647 if (ngx_quic_send(c, res.data, res.len) == NGX_ERROR) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2648 return NGX_ERROR;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
2649 }
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2650
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2651 return NGX_OK;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2652 }
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2653
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
2654
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2655 static void
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2656 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
2657 {
8025
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
2658 ngx_queue_t *q;
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
2659 ngx_quic_frame_t *f;
7816
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7815
diff changeset
2660 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
2661 ngx_quic_connection_t *qc;
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
2662
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2663 qc = ngx_quic_get_connection(c);
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2664
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2665 if (!ngx_quic_keys_available(qc->keys, level)) {
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2666 return;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2667 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2668
8191
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2669 ngx_quic_keys_discard(qc->keys, level);
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8190
diff changeset
2670
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2671 qc->pto_count = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2672
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2673 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
2674
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
2675 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
2676 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
2677 ngx_queue_remove(q);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
2678
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8024
diff changeset
2679 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
2680 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
2681 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
2682 }
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2683
8171
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2684 while (!ngx_queue_empty(&ctx->frames)) {
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2685 q = ngx_queue_head(&ctx->frames);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2686 ngx_queue_remove(q);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2687
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2688 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2689 ngx_quic_congestion_ack(c, f);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2690 ngx_quic_free_frame(c, f);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2691 }
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
2692
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2693 if (level == ssl_encryption_initial) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2694 ngx_quic_clear_temp_server_ids(c);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2695 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2696
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2697 ctx->send_ack = 0;
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
2698
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
2699 ngx_quic_set_lost_timer(c);
7770
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2700 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2701
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2702
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7769
diff changeset
2703 static ngx_int_t
8281
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
2704 ngx_quic_check_csid(ngx_quic_connection_t *qc, ngx_quic_header_t *pkt)
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
2705 {
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2706 ngx_queue_t *q;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2707 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
2708
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2709 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
2710 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2711 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2712 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2713 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
2714
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2715 if (pkt->scid.len == cid->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2716 && 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
2717 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2718 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2719 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2720 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2721
8098
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8097
diff changeset
2722 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
2723 return NGX_ERROR;
7648
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 7646
diff changeset
2724 }
7637
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2725
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2726
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2727 static ngx_int_t
8280
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8279
diff changeset
2728 ngx_quic_handle_frames(ngx_connection_t *c, ngx_quic_header_t *pkt)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2729 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2730 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2731 ssize_t len;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2732 ngx_buf_t buf;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2733 ngx_uint_t do_close;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2734 ngx_chain_t chain;
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2735 ngx_quic_frame_t frame;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2736 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2737
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2738 qc = ngx_quic_get_connection(c);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2739
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2740 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2741 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2742
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2743 do_close = 0;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2744
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2745 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2746
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2747 c->log->action = "parsing frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2748
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2749 ngx_memzero(&buf, sizeof(ngx_buf_t));
8243
d9f673d18e9b QUIC: set the temporary flag for input frame buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8242
diff changeset
2750 buf.temporary = 1;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2751
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2752 chain.buf = &buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2753 chain.next = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2754 frame.data = &chain;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2755
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7705
diff changeset
2756 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
2757
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2758 if (len < 0) {
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2759 qc->error = pkt->error;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2760 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2761 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2762
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
2763 ngx_quic_log_frame(c->log, &frame, 0);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
2764
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2765 c->log->action = "handling frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
2766
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2767 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2768
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2769 switch (frame.type) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2770
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2771 case NGX_QUIC_FT_ACK:
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
2772 if (ngx_quic_handle_ack_frame(c, pkt, &frame) != NGX_OK) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2773 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2774 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2775
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2776 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2777
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2778 case NGX_QUIC_FT_PADDING:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2779 /* no action required */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2780 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2781
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2782 case NGX_QUIC_FT_CONNECTION_CLOSE:
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
2783 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
2784 do_close = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2785 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2786 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2787
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2788 /* got there with ack-eliciting packet */
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2789 pkt->need_ack = 1;
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2790
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2791 switch (frame.type) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2792
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2793 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2794
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
2795 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
2796 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2797 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2798
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2799 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2800
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2801 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2802 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2803
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2804 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2805 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2806 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2807 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2808 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2809 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2810 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2811 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2812
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
2813 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
2814 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2815 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2816
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2817 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2818
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2819 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
2820
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2821 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
2822 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2823 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2824 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2825
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2826 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
2827
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2828 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2829 case NGX_QUIC_FT_STREAMS_BLOCKED2:
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2830
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2831 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
2832 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2833 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2834 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2835 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2836 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
2837
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2838 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
2839
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2840 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
2841
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2842 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
2843 &frame.u.stream_data_blocked)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2844 != NGX_OK)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2845 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2846 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2847 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2848
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2849 break;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
2850
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2851 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
2852
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2853 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
2854 &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
2855 != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2856 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2857 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2858 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2859
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2860 break;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
2861
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2862 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
2863
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2864 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
2865 &frame.u.reset_stream)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2866 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2867 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2868 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2869 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2870
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2871 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2872
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2873 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
2874
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2875 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
2876 &frame.u.stop_sending)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2877 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2878 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2879 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2880 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2881
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2882 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
2883
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2884 case NGX_QUIC_FT_MAX_STREAMS:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2885 case NGX_QUIC_FT_MAX_STREAMS2:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2886
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2887 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
2888 != NGX_OK)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2889 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2890 return NGX_ERROR;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2891 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2892
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2893 break;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
2894
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2895 case NGX_QUIC_FT_PATH_CHALLENGE:
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2896
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2897 if (ngx_quic_handle_path_challenge_frame(c, pkt,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2898 &frame.u.path_challenge)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2899 != NGX_OK)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2900 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2901 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2902 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2903
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2904 break;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
2905
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2906 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
2907
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2908 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
2909 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2910 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2911 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2912 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2913
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2914 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
2915
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2916 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2917
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2918 if (ngx_quic_handle_retire_connection_id_frame(c, pkt,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2919 &frame.u.retire_cid)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2920 != NGX_OK)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2921 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2922 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2923 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2924
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2925 break;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
2926
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2927 case NGX_QUIC_FT_PATH_RESPONSE:
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2928
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2929 /* TODO: handle */
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
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 frame handler not implemented");
7791
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2932 break;
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 7788
diff changeset
2933
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2934 default:
7823
4e4485793418 Added MAX_STREAM_DATA stub handler.
Vladimir Homutov <vl@nginx.com>
parents: 7822
diff changeset
2935 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
2936 "quic missing frame handler");
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2937 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2938 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2939 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2940
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2941 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2942 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
2943 "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
2944
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
2945 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2946 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2947 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2948
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2949 if (do_close) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2950 qc->draining = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
2951 ngx_quic_close_connection(c, NGX_OK);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2952 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
2953
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2954 if (ngx_quic_ack_packet(c, pkt) != NGX_OK) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2955 return NGX_ERROR;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2956 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2957
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2958 return NGX_OK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2959 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2960
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2961
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
2962 static ngx_int_t
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2963 ngx_quic_ack_packet(ngx_connection_t *c, ngx_quic_header_t *pkt)
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2964 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2965 uint64_t base, largest, smallest, gs, ge, gap, range, pn;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2966 uint64_t prev_pending;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2967 ngx_uint_t i, nr;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2968 ngx_quic_send_ctx_t *ctx;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2969 ngx_quic_ack_range_t *r;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2970 ngx_quic_connection_t *qc;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2971
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2972 c->log->action = "preparing ack";
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2973
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2974 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2975
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2976 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2977
8158
c01964fd7b8b QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents: 8157
diff changeset
2978 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
2979 "quic ngx_quic_ack_packet pn:%uL largest %L fr:%uL"
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
2980 " nranges:%ui", pkt->pn, (int64_t) ctx->largest_range,
8158
c01964fd7b8b QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents: 8157
diff changeset
2981 ctx->first_range, ctx->nranges);
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2982
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2983 prev_pending = ctx->pending_ack;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2984
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2985 if (pkt->need_ack) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2986
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
2987 ngx_post_event(&qc->push, &ngx_posted_events);
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2988
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
2989 if (ctx->send_ack == 0) {
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
2990 ctx->ack_delay_start = ngx_current_msec;
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
2991 }
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
2992
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
2993 ctx->send_ack++;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2994
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
2995 if (ctx->pending_ack == NGX_QUIC_UNSET_PN
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2996 || ctx->pending_ack < pkt->pn)
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2997 {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2998 ctx->pending_ack = pkt->pn;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
2999 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3000 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3001
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3002 base = ctx->largest_range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3003 pn = pkt->pn;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3004
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3005 if (base == NGX_QUIC_UNSET_PN) {
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3006 ctx->largest_range = pn;
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3007 ctx->largest_received = pkt->received;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3008 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3009 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3010
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3011 if (base == pn) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3012 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3013 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3014
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3015 largest = base;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3016 smallest = largest - ctx->first_range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3017
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3018 if (pn > base) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3019
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3020 if (pn - base == 1) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3021 ctx->first_range++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3022 ctx->largest_range = pn;
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3023 ctx->largest_received = pkt->received;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3024
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3025 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3026
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3027 } else {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3028 /* new gap in front of current largest */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3029
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3030 /* no place for new range, send current range as is */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3031 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3032
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3033 if (prev_pending != NGX_QUIC_UNSET_PN) {
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3034 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3035 return NGX_ERROR;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3036 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3037 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3038
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3039 if (prev_pending == ctx->pending_ack || !pkt->need_ack) {
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3040 ctx->pending_ack = NGX_QUIC_UNSET_PN;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3041 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3042 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3043
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3044 gap = pn - base - 2;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3045 range = ctx->first_range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3046
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3047 ctx->first_range = 0;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3048 ctx->largest_range = pn;
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3049 ctx->largest_received = pkt->received;
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3050
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3051 /* packet is out of order, force send */
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3052 if (pkt->need_ack) {
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3053 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3054 }
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3055
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3056 i = 0;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3057
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3058 goto insert;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3059 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3060 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3061
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3062 /* pn < base, perform lookup in existing ranges */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3063
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3064 /* packet is out of order */
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3065 if (pkt->need_ack) {
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3066 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3067 }
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3068
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3069 if (pn >= smallest && pn <= largest) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3070 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3071 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3072
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3073 #if (NGX_SUPPRESS_WARN)
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3074 r = NULL;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3075 #endif
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3076
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3077 for (i = 0; i < ctx->nranges; i++) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3078 r = &ctx->ranges[i];
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3079
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3080 ge = smallest - 1;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3081 gs = ge - r->gap;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3082
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3083 if (pn >= gs && pn <= ge) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3084
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3085 if (gs == ge) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3086 /* gap size is exactly one packet, now filled */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3087
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3088 /* data moves to previous range, current is removed */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3089
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3090 if (i == 0) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3091 ctx->first_range += r->range + 2;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3092
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3093 } else {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3094 ctx->ranges[i - 1].range += r->range + 2;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3095 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3096
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3097 nr = ctx->nranges - i - 1;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3098 if (nr) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3099 ngx_memmove(&ctx->ranges[i], &ctx->ranges[i + 1],
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3100 sizeof(ngx_quic_ack_range_t) * nr);
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3101 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3102
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3103 ctx->nranges--;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3104
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3105 } else if (pn == gs) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3106 /* current gap shrinks from tail (current range grows) */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3107 r->gap--;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3108 r->range++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3109
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3110 } else if (pn == ge) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3111 /* current gap shrinks from head (previous range grows) */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3112 r->gap--;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3113
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3114 if (i == 0) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3115 ctx->first_range++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3116
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3117 } else {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3118 ctx->ranges[i - 1].range++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3119 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3120
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3121 } else {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3122 /* current gap is split into two parts */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3123
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3124 gap = ge - pn - 1;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3125 range = 0;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3126
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3127 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3128 if (prev_pending != NGX_QUIC_UNSET_PN) {
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3129 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3130 return NGX_ERROR;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3131 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3132 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3133
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3134 if (prev_pending == ctx->pending_ack || !pkt->need_ack) {
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3135 ctx->pending_ack = NGX_QUIC_UNSET_PN;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3136 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3137 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3138
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3139 r->gap = pn - gs - 1;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3140 goto insert;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3141 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3142
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3143 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3144 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3145
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3146 largest = smallest - r->gap - 2;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3147 smallest = largest - r->range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3148
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3149 if (pn >= smallest && pn <= largest) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3150 /* this packet number is already known */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3151 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3152 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3153
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3154 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3156 if (pn == smallest - 1) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3157 /* extend first or last range */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3158
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3159 if (i == 0) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3160 ctx->first_range++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3161
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3162 } else {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3163 r->range++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3164 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3165
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3166 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3167 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3168
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3169 /* nothing found, add new range at the tail */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3170
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3171 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3172 /* packet is too old to keep it */
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3173
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3174 if (pkt->need_ack) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3175 return ngx_quic_send_ack_range(c, ctx, pn, pn);
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3176 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3177
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3178 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3179 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3180
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3181 gap = smallest - 2 - pn;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3182 range = 0;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3183
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3184 insert:
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3185
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3186 if (ctx->nranges < NGX_QUIC_MAX_RANGES) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3187 ctx->nranges++;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3188 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3189
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3190 ngx_memmove(&ctx->ranges[i + 1], &ctx->ranges[i],
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3191 sizeof(ngx_quic_ack_range_t) * (ctx->nranges - i - 1));
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3192
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3193 ctx->ranges[i].gap = gap;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3194 ctx->ranges[i].range = range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3195
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3196 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3197 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3198
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3199
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3200 static ngx_int_t
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3201 ngx_quic_send_ack_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3202 uint64_t smallest, uint64_t largest)
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
3203 {
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
3204 ngx_quic_frame_t *frame;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3205
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3206 frame = ngx_quic_alloc_frame(c);
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
3207 if (frame == NULL) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3208 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3209 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3210
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3211 frame->level = ctx->level;
7844
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7842
diff changeset
3212 frame->type = NGX_QUIC_FT_ACK;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3213 frame->u.ack.largest = largest;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3214 frame->u.ack.delay = 0;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3215 frame->u.ack.range_count = 0;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3216 frame->u.ack.first_range = largest - smallest;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3217
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3218 return NGX_OK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3219 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3220
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3221
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3222 static void
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3223 ngx_quic_drop_ack_ranges(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3224 uint64_t pn)
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3225 {
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3226 uint64_t base;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3227 ngx_uint_t i, smallest, largest;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3228 ngx_quic_ack_range_t *r;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3229
8158
c01964fd7b8b QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents: 8157
diff changeset
3230 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3231 "quic ngx_quic_drop_ack_ranges pn:%uL largest:%uL"
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3232 " fr:%uL nranges:%ui", pn, ctx->largest_range,
8158
c01964fd7b8b QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents: 8157
diff changeset
3233 ctx->first_range, ctx->nranges);
c01964fd7b8b QUIC: fixed dropping output ack ranges on input ack.
Vladimir Homutov <vl@nginx.com>
parents: 8157
diff changeset
3234
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3235 base = ctx->largest_range;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3236
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3237 if (base == NGX_QUIC_UNSET_PN) {
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3238 return;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3239 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3240
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3241 if (ctx->pending_ack != NGX_QUIC_UNSET_PN && pn >= ctx->pending_ack) {
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3242 ctx->pending_ack = NGX_QUIC_UNSET_PN;
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3243 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3244
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3245 largest = base;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3246 smallest = largest - ctx->first_range;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3247
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3248 if (pn >= largest) {
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3249 ctx->largest_range = NGX_QUIC_UNSET_PN;
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3250 ctx->first_range = 0;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3251 ctx->nranges = 0;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3252 return;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3253 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3254
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3255 if (pn >= smallest) {
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3256 ctx->first_range = largest - pn - 1;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3257 ctx->nranges = 0;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3258 return;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3259 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3260
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3261 for (i = 0; i < ctx->nranges; i++) {
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3262 r = &ctx->ranges[i];
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3263
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3264 largest = smallest - r->gap - 2;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3265 smallest = largest - r->range;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3266
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3267 if (pn >= largest) {
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3268 ctx->nranges = i;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3269 return;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3270 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3271 if (pn >= smallest) {
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3272 r->range = largest - pn - 1;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3273 ctx->nranges = i + 1;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3274 return;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3275 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3276 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3277 }
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3278
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3279
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3280 static ngx_int_t
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3281 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3282 {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3283 size_t len, left;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3284 uint64_t ack_delay;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3285 ngx_buf_t *b;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3286 ngx_uint_t i;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3287 ngx_chain_t *cl, **ll;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3288 ngx_quic_frame_t *frame;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3289 ngx_quic_connection_t *qc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3290
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3291 qc = ngx_quic_get_connection(c);
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3292
8246
b9ac4752d0e6 QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
3293 ack_delay = ngx_current_msec - ctx->largest_received;
b9ac4752d0e6 QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
3294 ack_delay *= 1000;
8286
3956bbf91002 QUIC: use server ack_delay_exponent when sending ack.
Roman Arutyunyan <arut@nginx.com>
parents: 8285
diff changeset
3295 ack_delay >>= qc->tp.ack_delay_exponent;
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3296
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3297 frame = ngx_quic_alloc_frame(c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3298 if (frame == NULL) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3299 return NGX_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3300 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3301
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3302 ll = &frame->data;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3303 b = NULL;
8172
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
3304
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8171
diff changeset
3305 for (i = 0; i < ctx->nranges; i++) {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3306 len = ngx_quic_create_ack_range(NULL, ctx->ranges[i].gap,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3307 ctx->ranges[i].range);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3308
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3309 left = b ? b->end - b->last : 0;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3310
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3311 if (left < len) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3312 cl = ngx_quic_alloc_buf(c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3313 if (cl == NULL) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3314 return NGX_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3315 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3316
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3317 *ll = cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3318 ll = &cl->next;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3319
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3320 b = cl->buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3321 left = b->end - b->last;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3322
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3323 if (left < len) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3324 return NGX_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3325 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3326 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3327
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3328 b->last += ngx_quic_create_ack_range(b->last, ctx->ranges[i].gap,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3329 ctx->ranges[i].range);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3330
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3331 frame->u.ack.ranges_length += len;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3332 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3333
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3334 *ll = NULL;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3335
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3336 frame->level = ctx->level;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3337 frame->type = NGX_QUIC_FT_ACK;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3338 frame->u.ack.largest = ctx->largest_range;
8162
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8161
diff changeset
3339 frame->u.ack.delay = ack_delay;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3340 frame->u.ack.range_count = ctx->nranges;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3341 frame->u.ack.first_range = ctx->first_range;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
3342
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3343 ngx_quic_queue_frame(qc, frame);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3344
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
3345 return NGX_OK;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3346 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3347
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3348
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3349 static ngx_int_t
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3350 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
3351 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3352 ngx_quic_frame_t *frame;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3353 ngx_quic_connection_t *qc;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3354
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3355 qc = ngx_quic_get_connection(c);
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3356
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3357 if (qc->draining) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3358 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3359 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3360
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3361 if (qc->closing
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3362 && 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
3363 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3364 /* dot not send CC too often */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3365 return NGX_OK;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3366 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3367
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3368 frame = ngx_quic_alloc_frame(c);
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3369 if (frame == NULL) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3370 return NGX_ERROR;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3371 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3372
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3373 frame->level = qc->error_level;
8285
0697294f79a4 QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8281
diff changeset
3374 frame->type = qc->error_app ? NGX_QUIC_FT_CONNECTION_CLOSE_APP
0697294f79a4 QUIC: removed redundant "app" flag from ngx_quic_close_frame_t.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8281
diff changeset
3375 : NGX_QUIC_FT_CONNECTION_CLOSE;
7953
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3376 frame->u.close.error_code = qc->error;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3377 frame->u.close.frame_type = qc->error_ftype;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3378
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3379 if (qc->error_reason) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 7945
diff changeset
3380 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
3381 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
3382 }
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
3383
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3384 ngx_quic_queue_frame(qc, frame);
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3385
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3386 qc->last_cc = ngx_current_msec;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3387
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3388 return ngx_quic_output(c);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3389 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3390
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3391
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
3392 static ngx_int_t
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3393 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
3394 {
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
3395 time_t expires;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3396 ngx_str_t token;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3397 ngx_quic_frame_t *frame;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3398 ngx_quic_connection_t *qc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3399
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3400 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3401
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3402 if (!qc->conf->retry) {
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3403 return NGX_OK;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3404 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3405
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
3406 expires = ngx_time() + NGX_QUIC_NEW_TOKEN_LIFETIME;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
3407
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
3408 if (ngx_quic_new_token(c, qc->conf->av_token_key, &token, NULL, expires, 0)
8279
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
3409 != NGX_OK)
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
3410 {
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3411 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3412 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3413
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3414 frame = ngx_quic_alloc_frame(c);
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3415 if (frame == NULL) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3416 return NGX_ERROR;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3417 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3418
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3419 frame->level = ssl_encryption_application;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3420 frame->type = NGX_QUIC_FT_NEW_TOKEN;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3421 frame->u.token.length = token.len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3422 frame->u.token.data = token.data;
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
3423
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3424 ngx_quic_queue_frame(qc, frame);
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3425
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3426 return NGX_OK;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3427 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3428
7945
Vladimir Homutov <vl@nginx.com>
parents: 7942
diff changeset
3429
7861
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7860
diff changeset
3430 static ngx_int_t
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3431 ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3432 ngx_quic_frame_t *f)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3433 {
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
3434 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
3435 u_char *pos, *end;
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3436 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
3437 ngx_msec_t send_time;
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3438 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
3439 ngx_quic_send_ctx_t *ctx;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3440 ngx_quic_ack_frame_t *ack;
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
3441 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
3442
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3443 qc = ngx_quic_get_connection(c);
7989
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
3444
9ed4c12ec948 QUIC: caching c->quic in the ngx_quic_handle_ack_frame() function.
Vladimir Homutov <vl@nginx.com>
parents: 7988
diff changeset
3445 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
3446
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3447 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3448 "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
3449
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3450 ack = &f->u.ack;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3451
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3452 /*
7862
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
3453 * 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
3454 * 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
3455 * (19.3.1)
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3456 */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3457
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3458 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
3459 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3460 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7838
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
3461 "quic invalid first range in ack frame");
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3462 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3463 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3464
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3465 min = ack->largest - ack->first_range;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3466 max = ack->largest;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3467
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3468 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
3469 != NGX_OK)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3470 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3471 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3472 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3473
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3474 /* 13.2.3. Receiver Tracking of ACK Frames */
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
3475 if (ctx->largest_ack < max || ctx->largest_ack == NGX_QUIC_UNSET_PN) {
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3476 ctx->largest_ack = max;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3477 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3478 "quic updated largest received ack:%uL", max);
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3479
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3480 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3481 * An endpoint generates an RTT sample on receiving an
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3482 * ACK frame that meets the following two conditions:
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3483 *
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3484 * - the largest acknowledged packet number is newly acknowledged
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3485 * - 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
3486 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3487
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3488 if (send_time != NGX_TIMER_INFINITE) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3489 ngx_quic_rtt_sample(c, ack, pkt->level, send_time);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3490 }
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3491 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3492
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3493 if (f->data) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3494 pos = f->data->buf->pos;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3495 end = f->data->buf->last;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3496
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3497 } else {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3498 pos = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3499 end = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3500 }
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3501
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3502 for (i = 0; i < ack->range_count; i++) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3503
8163
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8162
diff changeset
3504 n = ngx_quic_parse_ack_range(pkt->log, pos, end, &gap, &range);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3505 if (n == NGX_ERROR) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3506 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3507 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3508 pos += n;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3509
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3510 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
3511 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3512 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3513 "quic invalid range:%ui in ack frame", i);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3514 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3515 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3516
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3517 max = min - gap - 2;
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3518
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3519 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
3520 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3521 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3522 "quic invalid range:%ui in ack frame", i);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3523 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3524 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3525
8020
69033a50c3ae QUIC: fixed ACK Ranges processing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8019
diff changeset
3526 min = max - range;
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3527
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3528 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
3529 != NGX_OK)
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3530 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3531 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3532 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3533 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3534
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
3535 return ngx_quic_detect_lost(c);
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3536 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3537
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3538
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3539 static ngx_int_t
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3540 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
3541 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
3542 {
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3543 ngx_uint_t found;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3544 ngx_queue_t *q;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3545 ngx_quic_frame_t *f;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3546 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3547
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3548 qc = ngx_quic_get_connection(c);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3549
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3550 *send_time = NGX_TIMER_INFINITE;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3551 found = 0;
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3552
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3553 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
3554
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
3555 while (q != ngx_queue_sentinel(&ctx->sent)) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3556
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3557 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
3558 q = ngx_queue_prev(q);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3559
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3560 if (f->pnum >= min && f->pnum <= max) {
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3561 ngx_quic_congestion_ack(c, f);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3562
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3563 switch (f->type) {
8159
06af25901b1a QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents: 8158
diff changeset
3564 case NGX_QUIC_FT_ACK:
06af25901b1a QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents: 8158
diff changeset
3565 case NGX_QUIC_FT_ACK_ECN:
06af25901b1a QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents: 8158
diff changeset
3566 ngx_quic_drop_ack_ranges(c, ctx, f->u.ack.largest);
06af25901b1a QUIC: restored proper usage of ngx_quic_drop_ack_ranges().
Sergey Kandaurov <pluknet@nginx.com>
parents: 8158
diff changeset
3567 break;
8156
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3568
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3569 case NGX_QUIC_FT_STREAM0:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3570 case NGX_QUIC_FT_STREAM1:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3571 case NGX_QUIC_FT_STREAM2:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3572 case NGX_QUIC_FT_STREAM3:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3573 case NGX_QUIC_FT_STREAM4:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3574 case NGX_QUIC_FT_STREAM5:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3575 case NGX_QUIC_FT_STREAM6:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3576 case NGX_QUIC_FT_STREAM7:
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3577 ngx_quic_handle_stream_ack(c, f);
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3578 break;
0351fcf52a03 QUIC: drop acknowledged ranges.
Vladimir Homutov <vl@nginx.com>
parents: 8155
diff changeset
3579 }
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3580
8247
1823e2152fc4 QUIC: always calculate rtt for largest acknowledged packet.
Roman Arutyunyan <arut@nginx.com>
parents: 8246
diff changeset
3581 if (f->pnum == max) {
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3582 *send_time = f->last;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3583 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3584
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3585 ngx_queue_remove(&f->queue);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3586 ngx_quic_free_frame(c, f);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3587 found = 1;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3588 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3589 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3590
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3591 if (!found) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3592
7932
4e75267865de QUIC: fixed off-by-one in frame range handler.
Vladimir Homutov <vl@nginx.com>
parents: 7931
diff changeset
3593 if (max < ctx->pnum) {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3594 /* duplicate ACK or ACK for non-ack-eliciting frame */
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7791
diff changeset
3595 return NGX_OK;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3596 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3597
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3598 ngx_log_error(NGX_LOG_INFO, c->log, 0,
7878
Vladimir Homutov <vl@nginx.com>
parents: 7877
diff changeset
3599 "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
3600
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 7861
diff changeset
3601 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
3602 qc->error_ftype = NGX_QUIC_FT_ACK;
ffd362e87eb2 Added more context to CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 7875
diff changeset
3603 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
3604
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3605 return NGX_ERROR;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3606 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
3607
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3608 if (!qc->push.timer_set) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3609 ngx_post_event(&qc->push, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3610 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3611
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3612 qc->pto_count = 0;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3613
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3614 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3615 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3616
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3617
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3618 static void
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3619 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
3620 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
3621 {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3622 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
3623 ngx_quic_connection_t *qc;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3624
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3625 qc = ngx_quic_get_connection(c);
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3626
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3627 latest_rtt = ngx_current_msec - send_time;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3628 qc->latest_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3629
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3630 if (qc->min_rtt == NGX_TIMER_INFINITE) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3631 qc->min_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3632 qc->avg_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3633 qc->rttvar = latest_rtt / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3634
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3635 } else {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3636 qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3637
8246
b9ac4752d0e6 QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
3638 ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000;
b9ac4752d0e6 QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
3639
b9ac4752d0e6 QUIC: send and process ack_delay for Initial and Handshake levels.
Roman Arutyunyan <arut@nginx.com>
parents: 8245
diff changeset
3640 if (c->ssl->handshaked) {
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3641 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
3642 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3643
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3644 adjusted_rtt = latest_rtt;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3645
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3646 if (qc->min_rtt + ack_delay < latest_rtt) {
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3647 adjusted_rtt -= ack_delay;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3648 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3649
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3650 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
3651 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
3652 qc->rttvar = 0.75 * qc->rttvar + 0.25 * rttvar_sample;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3653 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3654
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3655 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3656 "quic rtt sample latest:%M min:%M avg:%M var:%M",
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3657 latest_rtt, qc->min_rtt, qc->avg_rtt, qc->rttvar);
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3658 }
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3659
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3660
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3661 static ngx_inline ngx_msec_t
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3662 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
3663 {
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3664 ngx_msec_t duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3665 ngx_quic_connection_t *qc;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3666
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3667 qc = ngx_quic_get_connection(c);
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3668
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3669 /* PTO calculation: quic-recovery, Appendix 8 */
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3670 duration = qc->avg_rtt;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3671
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3672 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
3673 duration <<= qc->pto_count;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3674
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3675 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
3676 return duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3677 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3678
8245
49efd27dace6 QUIC: use client max_ack_delay when computing pto timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
3679 if (ctx->level == ssl_encryption_application && c->ssl->handshaked) {
49efd27dace6 QUIC: use client max_ack_delay when computing pto timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
3680 duration += qc->ctp.max_ack_delay << qc->pto_count;
7993
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3681 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3682
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3683 return duration;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3684 }
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3685
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 7992
diff changeset
3686
7987
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 7953
diff changeset
3687 static void
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3688 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
3689 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3690 uint64_t sent, unacked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3691 ngx_event_t *wev;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3692 ngx_quic_stream_t *sn;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3693 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3694
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3695 qc = ngx_quic_get_connection(c);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3696
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3697 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
3698 if (sn == NULL) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3699 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3700 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3701
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3702 wev = sn->c->write;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3703 sent = sn->c->sent;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3704 unacked = sent - sn->acked;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3705
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3706 if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3707 wev->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3708 ngx_post_event(wev, &ngx_posted_events);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3709 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3710
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3711 sn->acked += f->u.stream.length;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3712
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3713 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, sn->c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3714 "quic stream ack len:%uL acked:%uL unacked:%uL",
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3715 f->u.stream.length, sn->acked, sent - sn->acked);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3716 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3717
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
3718
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3719 static ngx_int_t
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3720 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
3721 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
3722 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3723 size_t full_len;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3724 ngx_int_t rc;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3725 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3726 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3727
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3728 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3729
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3730 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3731 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3732 "quic out-of-order frame: expecting:%uL got:%uL",
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3733 fs->received, f->offset);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3734
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3735 return ngx_quic_buffer_frame(c, fs, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3736 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3737
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3738 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3739
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3740 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3741 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3742 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3743 /* old/duplicate data range */
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3744 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
3745 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3746
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3747 /* intersecting data range, frame modified */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3748 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3749
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3750 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3751
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3752 rc = handler(c, frame, data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3753 if (rc == NGX_ERROR) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3754 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3755
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3756 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3757 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3758 return NGX_OK;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3759 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3760
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3761 /* rc == NGX_OK */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3762
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3763 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3764
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3765 /* 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
3766
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3767 do {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3768 q = ngx_queue_head(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3769 if (q == ngx_queue_sentinel(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3770 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3771 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3772
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3773 frame = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3774 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3775
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3776 if (f->offset > fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3777 /* gap found, nothing more to do */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3778 break;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3779 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3780
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3781 full_len = f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3782
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3783 if (f->offset < fs->received) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3784
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3785 if (ngx_quic_adjust_frame_offset(c, frame, fs->received)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3786 == NGX_DONE)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3787 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3788 /* old/duplicate data range */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3789 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3790 fs->total -= f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3791
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3792 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3793 "quic skipped buffered frame, total:%ui",
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3794 fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3795 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3796 continue;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3797 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3798
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3799 /* frame was adjusted, proceed to input */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3800 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3801
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3802 /* f->offset == fs->received */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3803
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3804 rc = handler(c, frame, data);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3805
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3806 if (rc == NGX_ERROR) {
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3807 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3808
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3809 } else if (rc == NGX_DONE) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3810 /* handler destroyed stream, queue no longer exists */
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
3811 return NGX_OK;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3812 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3813
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3814 fs->received += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3815 fs->total -= full_len;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3816
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3817 ngx_queue_remove(q);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3818
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3819 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3820 "quic consumed buffered frame, total:%ui", fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3821
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3822 ngx_quic_free_frame(c, frame);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3823
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3824 } while (1);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3825
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3826 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3827 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3828
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3829
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3830 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3831 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
3832 uint64_t offset_in)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3833 {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3834 size_t tail, n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3835 ngx_buf_t *b;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3836 ngx_chain_t *cl;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3837 ngx_quic_ordered_frame_t *f;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3838
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3839 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3840
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3841 tail = offset_in - f->offset;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3842
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3843 if (tail >= f->length) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3844 /* range preceeding already received data or duplicate, ignore */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3845
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3846 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3847 "quic old or duplicate data in ordered frame, ignored");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3848 return NGX_DONE;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3849 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3850
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3851 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3852 "quic adjusted ordered frame data start to expected offset");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3853
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3854 /* intersecting range: adjust data size */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3855
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3856 f->offset += tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3857 f->length -= tail;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3858
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3859 for (cl = frame->data; cl; cl = cl->next) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3860 b = cl->buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3861 n = ngx_buf_size(b);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3862
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3863 if (n >= tail) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3864 b->pos += tail;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3865 break;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3866 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3867
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3868 cl->buf->pos = cl->buf->last;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3869 tail -= n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3870 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3871
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3872 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3873 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3874
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3875
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3876 static ngx_int_t
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3877 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
3878 ngx_quic_frame_t *frame)
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3879 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3880 ngx_queue_t *q;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3881 ngx_quic_frame_t *dst, *item;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3882 ngx_quic_ordered_frame_t *f, *df;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3883
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3884 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
3885 "quic ngx_quic_buffer_frame");
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3886
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3887 f = &frame->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3888
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3889 /* frame start offset is in the future, buffer it */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3890
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3891 dst = ngx_quic_alloc_frame(c);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3892 if (dst == NULL) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3893 return NGX_ERROR;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3894 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3895
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3896 ngx_memcpy(dst, frame, sizeof(ngx_quic_frame_t));
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3897
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3898 dst->data = ngx_quic_copy_chain(c, frame->data, 0);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3899 if (dst->data == NGX_CHAIN_ERROR) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3900 return NGX_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3901 }
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3902
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3903 df = &dst->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3904
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3905 fs->total += f->length;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3906
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3907 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8295
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3908 "quic ordered frame with unexpected offset:"
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8294
diff changeset
3909 " buffered total:%ui", fs->total);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3910
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3911 if (ngx_queue_empty(&fs->frames)) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3912 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3913 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3914 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3915
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3916 for (q = ngx_queue_last(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3917 q != ngx_queue_sentinel(&fs->frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3918 q = ngx_queue_prev(q))
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3919 {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3920 item = ngx_queue_data(q, ngx_quic_frame_t, queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3921 f = &item->u.ord;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3922
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3923 if (f->offset < df->offset) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3924 ngx_queue_insert_after(q, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3925 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3926 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3927 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3928
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3929 ngx_queue_insert_after(&fs->frames, &dst->queue);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3930
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3931 return NGX_OK;
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3932 }
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3933
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3934
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3935 static ngx_int_t
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3936 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
3937 ngx_quic_frame_t *frame)
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3938 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3939 uint64_t last;
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3940 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
3941 ngx_quic_send_ctx_t *ctx;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3942 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
3943 ngx_quic_crypto_frame_t *f;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3944 ngx_quic_frames_stream_t *fs;
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3945
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3946 qc = ngx_quic_get_connection(c);
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3947 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
3948 f = &frame->u.crypto;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3949
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3950 /* no overflow since both values are 62-bit */
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3951 last = f->offset + f->length;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3952
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3953 if (last > fs->received && last - fs->received > NGX_QUIC_MAX_BUFFERED) {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3954 qc->error = NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3955 return NGX_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
3956 }
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3957
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3958 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
3959 NULL);
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3960 if (rc != NGX_DECLINED) {
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3961 return rc;
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3962 }
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3963
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3964 /* speeding up handshake completion */
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3965
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3966 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
3967 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
3968
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3969 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
3970 ngx_quic_resend_frames(c, ctx);
8244
6201cef77b1d QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
3971
6201cef77b1d QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
3972 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_handshake);
6201cef77b1d QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
3973 while (!ngx_queue_empty(&ctx->sent)) {
6201cef77b1d QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
3974 ngx_quic_resend_frames(c, ctx);
6201cef77b1d QUIC: resend handshake packets along with initial.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
3975 }
8132
6226f834b420 QUIC: do not resend empty queue when speeding up handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8131
diff changeset
3976 }
8104
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3977 }
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3978
9588a2782c62 QUIC: speeding up handshake completion.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8103
diff changeset
3979 return NGX_OK;
7812
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3980 }
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3981
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3982
76839f55bc48 Sorted functions and functions declarations.
Vladimir Homutov <vl@nginx.com>
parents: 7811
diff changeset
3983 static ngx_int_t
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
3984 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
3985 {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3986 int n, sslerr;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3987 ngx_buf_t *b;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3988 ngx_chain_t *cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3989 ngx_ssl_conn_t *ssl_conn;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
3990 ngx_quic_connection_t *qc;
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7809
diff changeset
3991
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3992 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
3993
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3994 ssl_conn = c->ssl->connection;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3995
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3996 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
3997 "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
3998 (int) SSL_quic_read_level(ssl_conn),
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
3999 (int) SSL_quic_write_level(ssl_conn));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4000
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4001 for (cl = frame->data; cl; cl = cl->next) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4002 b = cl->buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4003
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4004 if (!SSL_provide_quic_data(ssl_conn, SSL_quic_read_level(ssl_conn),
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4005 b->pos, b->last - b->pos))
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4006 {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4007 ngx_ssl_error(NGX_LOG_INFO, c->log, 0,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4008 "SSL_provide_quic_data() failed");
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4009 return NGX_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4010 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4011 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4012
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4013 n = SSL_do_handshake(ssl_conn);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4014
8190
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4015 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4016 "quic SSL_quic_read_level:%d SSL_quic_write_level:%d",
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4017 (int) SSL_quic_read_level(ssl_conn),
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4018 (int) SSL_quic_write_level(ssl_conn));
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4019
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4020 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
4021
8190
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4022 if (n <= 0) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4023 sslerr = SSL_get_error(ssl_conn, n);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4024
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4025 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
4026 sslerr);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4027
7766
23a2b5e7acc8 Improved SSL_do_handshake() error handling in QUIC.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7765
diff changeset
4028 if (sslerr != SSL_ERROR_WANT_READ) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4029 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
4030 return NGX_ERROR;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4031 }
7729
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
4032
8190
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4033 return NGX_OK;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4034 }
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4035
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4036 if (SSL_in_init(ssl_conn)) {
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4037 return NGX_OK;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4038 }
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4039
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4040 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4041 "quic ssl cipher:%s", SSL_get_cipher(ssl_conn));
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4042
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4043 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4044 "quic handshake completed successfully");
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4045
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4046 c->ssl->handshaked = 1;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4047
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4048 frame = ngx_quic_alloc_frame(c);
8190
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4049 if (frame == NULL) {
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4050 return NGX_ERROR;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4051 }
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4052
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4053 /* 12.4 Frames and frame types, figure 8 */
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4054 frame->level = ssl_encryption_application;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4055 frame->type = NGX_QUIC_FT_HANDSHAKE_DONE;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4056 ngx_quic_queue_frame(qc, frame);
8190
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4057
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4058 if (ngx_quic_send_new_token(c) != NGX_OK) {
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4059 return NGX_ERROR;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4060 }
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4061
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4062 /*
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4063 * Generating next keys before a key update is received.
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4064 * See quic-tls 9.4 Header Protection Timing Side-Channels.
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4065 */
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4066
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4067 if (ngx_quic_keys_update(c, qc->keys) != NGX_OK) {
8190
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4068 return NGX_ERROR;
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4069 }
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4070
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4071 /*
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4072 * 4.10.2 An endpoint MUST discard its handshake keys
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4073 * when the TLS handshake is confirmed
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4074 */
d10118e38943 QUIC: refactored SSL_do_handshake() handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8189
diff changeset
4075 ngx_quic_discard_ctx(c, ssl_encryption_handshake);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4076
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4077 if (ngx_quic_issue_server_ids(c) != NGX_OK) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4078 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4079 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4080
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4081 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4082 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4083
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4084
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4085 static ngx_int_t
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4086 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
4087 ngx_quic_frame_t *frame)
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4088 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4089 size_t window;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4090 uint64_t last;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4091 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
4092 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
4093 ngx_connection_t *sc;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4094 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4095 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4096 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4097 ngx_quic_frames_stream_t *fs;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4098
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4099 qc = ngx_quic_get_connection(c);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4100 f = &frame->u.stream;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4101
7922
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4102 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
4103 && (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
4104 {
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4105 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
4106 return NGX_ERROR;
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4107 }
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4108
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4109 /* 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
4110 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
4111
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4112 sn = ngx_quic_find_stream(&qc->streams.tree, f->stream_id);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4113
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4114 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
4115 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
4116
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4117 if (sn == NULL) {
7922
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4118 return NGX_ERROR;
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4119 }
d437ee1ce81e Reject invalid STREAM ID with STREAM_STATE_ERROR connection error.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7919
diff changeset
4120
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4121 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
4122 return NGX_OK;
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
4123 }
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4124
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4125 sc = sn->c;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4126 fs = &sn->fs;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4127 b = sn->b;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4128 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
4129
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4130 if (last > window) {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4131 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4132 goto cleanup;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4133 }
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4134
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4135 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
4136 sn)
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4137 != NGX_OK)
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4138 {
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4139 goto cleanup;
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4140 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4141
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4142 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
4143
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4144 return NGX_OK;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4145 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4146
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4147 fs = &sn->fs;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4148 b = sn->b;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4149 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
4150
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4151 if (last > fs->received && last - fs->received > window) {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4152 qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR;
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4153 return NGX_ERROR;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4154 }
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4155
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
4156 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
4157 sn);
8068
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4158
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4159 cleanup:
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4160
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4161 pool = sc->pool;
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4162
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4163 ngx_close_connection(sc);
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4164 ngx_destroy_pool(pool);
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4165
f882b1784f30 QUIC: enforce flow control on incoming STREAM and CRYPTO frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8066
diff changeset
4166 return NGX_ERROR;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4167 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4168
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4169
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4170 static ngx_int_t
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
4171 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
4172 {
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
4173 uint64_t id;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4174 ngx_buf_t *b;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4175 ngx_event_t *rev;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4176 ngx_chain_t *cl;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4177 ngx_quic_stream_t *sn;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4178 ngx_quic_connection_t *qc;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4179 ngx_quic_stream_frame_t *f;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4180
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4181 qc = ngx_quic_get_connection(c);
7855
81a4f98a2556 Cleaned up reordering code.
Vladimir Homutov <vl@nginx.com>
parents: 7854
diff changeset
4182 sn = data;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4183
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4184 f = &frame->u.stream;
8019
fc16e303003a QUIC: fixed possible use-after-free on stream cleanup.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8018
diff changeset
4185 id = f->stream_id;
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4186
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4187 b = sn->b;
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4188
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4189 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
4190 ngx_log_error(NGX_LOG_INFO, c->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7837
diff changeset
4191 "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
4192 return NGX_ERROR;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4193 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4194
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4195 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
4196 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
4197 b->pos = b->start;
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4198 }
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4199
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4200 for (cl = frame->data; cl; cl = cl->next) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4201 b->last = ngx_cpymem(b->last, cl->buf->pos,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4202 cl->buf->last - cl->buf->pos);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4203 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4204
7760
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4205 rev = sn->c->read;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4206 rev->ready = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4207
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4208 if (f->fin) {
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4209 rev->pending_eof = 1;
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
4210 }
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4211
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4212 if (rev->active) {
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4213 rev->handler(rev);
7780
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
4214 }
de8981bf2dd5 Advertizing MAX_STREAMS (0x12) credit in advance.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7778
diff changeset
4215
7814
ab443e80d9e4 Create new stream immediately on receiving new stream id.
Vladimir Homutov <vl@nginx.com>
parents: 7813
diff changeset
4216 /* 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
4217 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
4218 return NGX_DONE;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4219 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
4220
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4221 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4222 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4223
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4224
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
4225 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
4226 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
4227 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
4228 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4229 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4230 ngx_rbtree_t *tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4231 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
4232 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
4233 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
4234
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4235 qc = ngx_quic_get_connection(c);
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4236 tree = &qc->streams.tree;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4237
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4238 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
4239 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4240 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4241
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4242 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
4243
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4244 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
4245 node;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4246 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
4247 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4248 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
4249 wev = qs->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4250
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4251 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4252 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4253 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
4254 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4255 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4256 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4257
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4258 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
4259
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4260 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4261 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4262
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4263
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4264 static ngx_int_t
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
4265 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
4266 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
4267 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
4268 return NGX_OK;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
4269 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
4270
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7707
diff changeset
4271
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4272 static ngx_int_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4273 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
4274 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
4275 {
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4276 size_t n;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4277 ngx_buf_t *b;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4278 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4279 ngx_quic_stream_t *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
4280 ngx_quic_connection_t *qc;
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4281
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4282 qc = ngx_quic_get_connection(c);
7924
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4283
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4284 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
4285 && (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
4286 {
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4287 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
4288 return NGX_ERROR;
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4289 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4290
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4291 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
4292
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4293 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
4294 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
4295
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4296 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4297 return NGX_ERROR;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4298 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4299
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4300 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
4301 return NGX_OK;
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
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4304 b = sn->b;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4305 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
4306
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4307 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
4308
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4309 } else {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4310 b = sn->b;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4311 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
4312 }
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4313
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4314 frame = ngx_quic_alloc_frame(c);
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4315 if (frame == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4316 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4317 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4318
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4319 frame->level = pkt->level;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4320 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
4321 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
4322 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
4323
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4324 ngx_quic_queue_frame(qc, frame);
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4325
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4326 return NGX_OK;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4327 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4328
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
4329
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4330 static ngx_int_t
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4331 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
4332 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
4333 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4334 uint64_t sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4335 ngx_event_t *wev;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4336 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
4337 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
4338
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4339 qc = ngx_quic_get_connection(c);
7924
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4340
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4341 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
4342 && (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
4343 {
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4344 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
4345 return NGX_ERROR;
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4346 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4347
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4348 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
4349
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4350 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
4351 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
4352
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4353 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4354 return NGX_ERROR;
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
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4357 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
4358 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
4359 }
8fc9fcf18608 Stream ID handling in MAX_STREAM_DATA and STREAM_DATA_BLOCKED.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7923
diff changeset
4360
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4361 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
4362 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
4363 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4364
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4365 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
4366
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
4367 return NGX_OK;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4368 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4369
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4370 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
4371 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4372 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4373
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4374 sent = sn->c->sent;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4375
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4376 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
4377 wev = sn->c->write;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4378
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4379 if (wev->active) {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4380 wev->ready = 1;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4381 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
4382 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4383 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4384
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4385 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
4386
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4387 return NGX_OK;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4388 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4389
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
4390
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4391 static ngx_int_t
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4392 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
4393 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
4394 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4395 ngx_event_t *rev;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4396 ngx_connection_t *sc;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4397 ngx_quic_stream_t *sn;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4398 ngx_quic_connection_t *qc;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4399
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4400 qc = ngx_quic_get_connection(c);
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4401
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4402 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
4403 && (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
4404 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4405 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
4406 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4407 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4408
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4409 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
4410
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4411 if (sn == NULL) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4412 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
4413
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4414 if (sn == NULL) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4415 return NGX_ERROR;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4416 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4417
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4418 if (sn == NGX_QUIC_STREAM_GONE) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4419 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4420 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4421
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4422 sc = sn->c;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4423
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4424 rev = sc->read;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4425 rev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4426 rev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4427
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4428 sc->listening->handler(sc);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4429
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4430 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4431 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4432
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4433 rev = sn->c->read;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4434 rev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4435 rev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4436
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4437 if (rev->active) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4438 rev->handler(rev);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4439 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4440
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4441 return NGX_OK;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4442 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4443
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4444
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4445 static ngx_int_t
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4446 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
4447 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
4448 {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4449 ngx_event_t *wev;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4450 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
4451 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
4452 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
4453
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4454 qc = ngx_quic_get_connection(c);
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4455
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4456 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
4457 && (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
4458 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4459 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
4460 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4461 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4462
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4463 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
4464
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4465 if (sn == NULL) {
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4466 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
4467
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4468 if (sn == NULL) {
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4469 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4470 }
8023
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4471
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4472 if (sn == NGX_QUIC_STREAM_GONE) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4473 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4474 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4475
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4476 sc = sn->c;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4477
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4478 wev = sc->write;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4479 wev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4480 wev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4481
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4482 sc->listening->handler(sc);
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4483
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4484 return NGX_OK;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4485 }
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4486
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4487 wev = sn->c->write;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4488 wev->error = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4489 wev->ready = 1;
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4490
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4491 if (wev->active) {
240931629995 QUIC: handle client RESET_STREAM and STOP_SENDING.
Roman Arutyunyan <arut@nginx.com>
parents: 8022
diff changeset
4492 wev->handler(wev);
7923
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4493 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4494
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4495 return NGX_OK;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4496 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4497
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7922
diff changeset
4498
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4499 static ngx_int_t
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4500 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
4501 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
4502 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4503 ngx_quic_connection_t *qc;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4504
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4505 qc = ngx_quic_get_connection(c);
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4506
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4507 if (f->bidi) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4508 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
4509 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
4510
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4511 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
4512 "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
4513 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4514
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4515 } else {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4516 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
4517 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
4518
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4519 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
4520 "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
4521 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4522 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4523
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4524 return NGX_OK;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4525 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4526
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
4527
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4528 static ngx_int_t
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4529 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
4530 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
4531 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4532 ngx_quic_frame_t *frame;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4533 ngx_quic_connection_t *qc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4534
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4535 qc = ngx_quic_get_connection(c);
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4536
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4537 frame = ngx_quic_alloc_frame(c);
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4538 if (frame == NULL) {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4539 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4540 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4541
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4542 frame->level = pkt->level;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4543 frame->type = NGX_QUIC_FT_PATH_RESPONSE;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4544 frame->u.path_response = *f;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4545
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4546 ngx_quic_queue_frame(qc, frame);
8069
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4547
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4548 return NGX_OK;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4549 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4550
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8068
diff changeset
4551
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4552 static ngx_int_t
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4553 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
4554 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
4555 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4556 ngx_queue_t *q;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4557 ngx_quic_client_id_t *cid, *item;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4558 ngx_quic_connection_t *qc;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4559
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4560 qc = ngx_quic_get_connection(c);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4561
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4562 if (f->seqnum < qc->max_retired_seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4563 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4564 * 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
4565 * 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
4566 * 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
4567 * 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
4568 * 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
4569 * done so for that sequence number.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4570 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4571
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4572 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
4573 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4574 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4575
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4576 goto retire;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4577 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4578
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4579 cid = NULL;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4580
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4581 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
4582 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4583 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4584 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4585 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
4586
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4587 if (item->seqnum == f->seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4588 cid = item;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4589 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4590 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4591 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4592
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4593 if (cid) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4594 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4595 * 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
4596 * 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
4597 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4598
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4599 if (cid->len != f->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4600 || 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
4601 || 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
4602 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4603 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4604 * ..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
4605 * 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
4606 * of type PROTOCOL_VIOLATION.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4607 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4608 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4609 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
4610 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4611 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4612
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4613 } else {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4614
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
4615 cid = ngx_quic_alloc_client_id(c, qc);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4616 if (cid == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4617 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4618 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4619
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4620 cid->seqnum = f->seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4621 cid->len = f->len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4622 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
4623
8100
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8099
diff changeset
4624 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
4625
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4626 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
4627 qc->nclient_ids++;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4628
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4629 /* always use latest available connection id */
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
4630 if (f->seqnum > qc->client_seqnum) {
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4631 qc->scid.len = cid->len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4632 qc->scid.data = cid->id;
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
4633 qc->client_seqnum = f->seqnum;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4634 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4635 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4636
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4637 retire:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4638
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4639 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
4640 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4641 * 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
4642 * 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
4643 * 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
4644 * largest received Retire Prior To value.
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4645 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4646 goto done;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4647 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4648
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4649 qc->max_retired_seqnum = f->retire;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4650
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4651 q = ngx_queue_head(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4652
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4653 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
4654
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4655 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
4656 q = ngx_queue_next(q);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4657
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4658 if (cid->seqnum >= f->retire) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4659 continue;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4660 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4661
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4662 /* this connection id must be retired */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4663
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4664 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
4665 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4666 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4667 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4668 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4669
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4670 ngx_queue_remove(&cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4671 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
4672 qc->nclient_ids--;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4673 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4674
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4675 done:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4676
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4677 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
4678 /*
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4679 * 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
4680 * 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
4681 * 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
4682 * 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
4683 * 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
4684 */
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4685 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
4686 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
4687 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4688 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4689
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4690 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4691 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4692
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4693
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4694 static ngx_int_t
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4695 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
4696 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
4697 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4698 ngx_quic_frame_t *frame;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4699 ngx_quic_connection_t *qc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4700
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4701 qc = ngx_quic_get_connection(c);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4702
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4703 frame = ngx_quic_alloc_frame(c);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4704 if (frame == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4705 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4706 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4707
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4708 frame->level = level;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4709 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
4710 frame->u.retire_cid.sequence_number = seqnum;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4711
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4712 ngx_quic_queue_frame(qc, frame);
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4713
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4714 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4715 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4716
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4717
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4718 static ngx_int_t
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4719 ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4720 ngx_quic_header_t *pkt, ngx_quic_retire_cid_frame_t *f)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4721 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4722 ngx_queue_t *q;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4723 ngx_quic_server_id_t *sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4724 ngx_quic_connection_t *qc;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4725
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4726 qc = ngx_quic_get_connection(c);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4727
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4728 for (q = ngx_queue_head(&qc->server_ids);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4729 q != ngx_queue_sentinel(&qc->server_ids);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4730 q = ngx_queue_next(q))
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4731 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4732 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4733
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4734 if (sid->seqnum == f->sequence_number) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4735 ngx_queue_remove(q);
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4736 ngx_queue_insert_tail(&qc->free_server_ids, &sid->queue);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4737 ngx_rbtree_delete(&c->listening->rbtree, &sid->udp.node);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4738 qc->nserver_ids--;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4739 break;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4740 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4741 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4742
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4743 return ngx_quic_issue_server_ids(c);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4744 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4745
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4746
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4747 static ngx_int_t
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4748 ngx_quic_issue_server_ids(ngx_connection_t *c)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4749 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4750 ngx_str_t dcid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4751 ngx_uint_t n;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4752 ngx_quic_frame_t *frame;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4753 ngx_quic_server_id_t *sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4754 ngx_quic_connection_t *qc;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4755 u_char id[NGX_QUIC_SERVER_CID_LEN];
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4756
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4757 qc = ngx_quic_get_connection(c);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4758
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4759 n = ngx_min(NGX_QUIC_MAX_SERVER_IDS, qc->ctp.active_connection_id_limit);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4760
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4761 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4762 "quic issue server ids has:%ui max:%ui", qc->nserver_ids, n);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4763
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4764 while (qc->nserver_ids < n) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4765 if (ngx_quic_create_server_id(c, id) != NGX_OK) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4766 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4767 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4768
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4769 dcid.len = NGX_QUIC_SERVER_CID_LEN;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4770 dcid.data = id;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4771
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4772 sid = ngx_quic_insert_server_id(c, &dcid);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4773 if (sid == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4774 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4775 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4776
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
4777 frame = ngx_quic_alloc_frame(c);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4778 if (frame == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4779 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4780 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4781
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4782 frame->level = ssl_encryption_application;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4783 frame->type = NGX_QUIC_FT_NEW_CONNECTION_ID;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4784 frame->u.ncid.seqnum = sid->seqnum;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4785 frame->u.ncid.retire = 0;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4786 frame->u.ncid.len = NGX_QUIC_SERVER_CID_LEN;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4787 ngx_memcpy(frame->u.ncid.cid, id, NGX_QUIC_SERVER_CID_LEN);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4788
8287
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8286
diff changeset
4789 if (ngx_quic_new_sr_token(c, &dcid, qc->conf->sr_token_key,
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4790 frame->u.ncid.srt)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4791 != NGX_OK)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4792 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4793 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4794 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4795
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4796 ngx_quic_queue_frame(qc, frame);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4797 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4798
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4799 return NGX_OK;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4800 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4801
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4802
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4803 static void
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4804 ngx_quic_clear_temp_server_ids(ngx_connection_t *c)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4805 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4806 ngx_queue_t *q, *next;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4807 ngx_quic_server_id_t *sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4808 ngx_quic_connection_t *qc;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4809
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4810 qc = ngx_quic_get_connection(c);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4811
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4812 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4813 "quic clear temp server ids");
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4814
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4815 for (q = ngx_queue_head(&qc->server_ids);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4816 q != ngx_queue_sentinel(&qc->server_ids);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4817 q = next)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4818 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4819 next = ngx_queue_next(q);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4820 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4821
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4822 if (sid->seqnum != NGX_QUIC_UNSET_PN) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4823 continue;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4824 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4825
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4826 ngx_queue_remove(q);
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4827 ngx_queue_insert_tail(&qc->free_server_ids, &sid->queue);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4828 ngx_rbtree_delete(&c->listening->rbtree, &sid->udp.node);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4829 qc->nserver_ids--;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4830 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4831 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4832
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4833
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4834 static ngx_quic_server_id_t *
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4835 ngx_quic_insert_server_id(ngx_connection_t *c, ngx_str_t *id)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4836 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4837 ngx_str_t dcid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4838 ngx_quic_server_id_t *sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4839 ngx_quic_connection_t *qc;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4840
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4841 qc = ngx_quic_get_connection(c);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4842
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4843 sid = ngx_quic_alloc_server_id(c, qc);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4844 if (sid == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4845 return NULL;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4846 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4847
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4848 sid->seqnum = qc->server_seqnum;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4849
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4850 if (qc->server_seqnum != NGX_QUIC_UNSET_PN) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4851 qc->server_seqnum++;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4852 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4853
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4854 sid->len = id->len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4855 ngx_memcpy(sid->id, id->data, id->len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4856
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4857 ngx_queue_insert_tail(&qc->server_ids, &sid->queue);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4858 qc->nserver_ids++;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4859
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4860 dcid.data = sid->id;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4861 dcid.len = sid->len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4862
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4863 ngx_insert_udp_connection(c, &sid->udp, &dcid);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4864
8235
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
4865 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
4866 "quic insert server id seqnum:%uL id len:%uz %xV",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8212
diff changeset
4867 sid->seqnum, id->len, id);
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4868
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4869 return sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4870 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4871
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4872
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4873 static ngx_quic_client_id_t *
8197
405b6e8eb523 QUIC: renamed field and function related to client ids.
Roman Arutyunyan <arut@nginx.com>
parents: 8196
diff changeset
4874 ngx_quic_alloc_client_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
4875 {
8099
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
4876 ngx_queue_t *q;
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8098
diff changeset
4877 ngx_quic_client_id_t *cid;
8076
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4878
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4879 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
4880
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4881 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
4882 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
4883
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4884 ngx_queue_remove(&cid->queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4885
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4886 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
4887
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4888 } else {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4889
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4890 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
4891 if (cid == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4892 return NULL;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4893 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4894 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4895
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4896 return cid;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4897 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4898
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8074
diff changeset
4899
8198
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4900 static ngx_quic_server_id_t *
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4901 ngx_quic_alloc_server_id(ngx_connection_t *c, ngx_quic_connection_t *qc)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4902 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4903 ngx_queue_t *q;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4904 ngx_quic_server_id_t *sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4905
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4906 if (!ngx_queue_empty(&qc->free_server_ids)) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4907
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4908 q = ngx_queue_head(&qc->free_server_ids);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4909 sid = ngx_queue_data(q, ngx_quic_server_id_t, queue);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4910
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4911 ngx_queue_remove(&sid->queue);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4912
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4913 ngx_memzero(sid, sizeof(ngx_quic_server_id_t));
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4914
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4915 } else {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4916
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4917 sid = ngx_pcalloc(c->pool, sizeof(ngx_quic_server_id_t));
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4918 if (sid == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4919 return NULL;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4920 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4921 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4922
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4923 return sid;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4924 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4925
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8197
diff changeset
4926
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4927 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4928 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
4929 {
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4930 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
4931
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4932 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
4933
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
4934 ngx_queue_insert_tail(&ctx->frames, &frame->queue);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
4935
7994
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4936 frame->len = ngx_quic_create_frame(NULL, frame);
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4937 /* always succeeds */
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4938
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4939 if (qc->closing) {
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4940 return;
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4941 }
f9fbeb4ee0de QUIC: added limit of queued data.
Vladimir Homutov <vl@nginx.com>
parents: 7993
diff changeset
4942
8055
924882f42dea QUIC: do not artificially delay sending queued frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8054
diff changeset
4943 ngx_post_event(&qc->push, &ngx_posted_events);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4944 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4945
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4946
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4947 static ngx_int_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4948 ngx_quic_output(ngx_connection_t *c)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4949 {
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4950 off_t max;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4951 size_t len, min;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4952 ssize_t n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4953 u_char *p;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4954 ngx_uint_t i, pad;
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
4955 ngx_quic_send_ctx_t *ctx;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4956 ngx_quic_connection_t *qc;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4957 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
4958
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
4959 c->log->action = "sending frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7740
diff changeset
4960
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
4961 qc = ngx_quic_get_connection(c);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
4962
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4963 for ( ;; ) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4964 p = dst;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4965
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4966 len = ngx_min(qc->ctp.max_udp_payload_size,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4967 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4968
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4969 if (!qc->validated) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4970 max = qc->received * 3;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4971 max = (c->sent >= max) ? 0 : max - c->sent;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4972 len = ngx_min(len, (size_t) max);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4973 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4974
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4975 pad = ngx_quic_get_padding_level(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4976
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4977 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4978
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4979 ctx = &qc->send_ctx[i];
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4980
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4981 if (ngx_quic_generate_ack(c, ctx) != NGX_OK) {
8155
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
4982 return NGX_ERROR;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8154
diff changeset
4983 }
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4984
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4985 min = (i == pad && p - dst < NGX_QUIC_MIN_INITIAL_SIZE)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4986 ? NGX_QUIC_MIN_INITIAL_SIZE - (p - dst) : 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4987
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4988 n = ngx_quic_output_packet(c, ctx, p, len, min);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4989 if (n == NGX_ERROR) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4990 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4991 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4992
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4993 p += n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4994 len -= n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4995 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4996
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4997 len = p - dst;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4998 if (len == 0) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
4999 break;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5000 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5001
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5002 n = ngx_quic_send(c, dst, len);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5003 if (n == NGX_ERROR) {
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5004 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5005 }
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5006
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5007 if (!qc->send_timer_set && !qc->closing) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5008 qc->send_timer_set = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5009 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5010 }
7737
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
5011 }
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 7736
diff changeset
5012
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5013 ngx_quic_set_lost_timer(c);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5014
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5015 return NGX_OK;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5016 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5017
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5018
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5019 static ngx_uint_t
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5020 ngx_quic_get_padding_level(ngx_connection_t *c)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5021 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5022 ngx_queue_t *q;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5023 ngx_quic_frame_t *f;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5024 ngx_quic_send_ctx_t *ctx;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5025 ngx_quic_connection_t *qc;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5026
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5027 /*
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5028 * 14.1. Initial Datagram Size
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5029 *
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5030 * Similarly, a server MUST expand the payload of all UDP datagrams
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5031 * carrying ack-eliciting Initial packets to at least the smallest
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5032 * allowed maximum datagram size of 1200 bytes
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5033 */
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5034
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5035 qc = ngx_quic_get_connection(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5036 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5037
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5038 for (q = ngx_queue_head(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5039 q != ngx_queue_sentinel(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5040 q = ngx_queue_next(q))
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5041 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5042 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5043
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5044 if (f->need_ack) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5045 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_handshake);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5046
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5047 if (ngx_queue_empty(&ctx->frames)) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5048 return 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5049 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5050
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5051 return 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5052 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5053 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5054
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5055 return NGX_QUIC_SEND_CTX_LAST;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5056 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5057
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5058
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5059 static ngx_int_t
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5060 ngx_quic_generate_ack(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
5061 {
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5062 ngx_msec_t delay;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5063 ngx_quic_connection_t *qc;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5064
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5065 if (!ctx->send_ack) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5066 return NGX_OK;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5067 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5068
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5069 if (ctx->level == ssl_encryption_application) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5070
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5071 delay = ngx_current_msec - ctx->ack_delay_start;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5072 qc = ngx_quic_get_connection(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5073
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5074 if (ctx->send_ack < NGX_QUIC_MAX_ACK_GAP
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5075 && delay < qc->tp.max_ack_delay)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5076 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5077 if (!qc->push.timer_set && !qc->closing) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5078 ngx_add_timer(&qc->push,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5079 qc->tp.max_ack_delay - delay);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5080 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5081
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5082 return NGX_OK;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5083 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5084 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5085
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5086 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5087 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5088 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5089
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5090 ctx->send_ack = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5091
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5092 return NGX_OK;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5093 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5094
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5095
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5096 static ssize_t
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5097 ngx_quic_output_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5098 u_char *data, size_t max, size_t min)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5099 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5100 size_t len, hlen, pad_len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5101 u_char *p;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5102 ssize_t flen;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5103 ngx_str_t out, res;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5104 ngx_int_t rc;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5105 ngx_uint_t nframes;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5106 ngx_msec_t now;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5107 ngx_queue_t *q;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5108 ngx_quic_frame_t *f;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5109 ngx_quic_header_t pkt;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5110 ngx_quic_congestion_t *cg;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5111 ngx_quic_connection_t *qc;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5112 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5113
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5114 if (ngx_queue_empty(&ctx->frames)) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5115 return 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5116 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5117
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5118 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5119 "quic output %s packet max:%uz min:%uz",
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5120 ngx_quic_level_name(ctx->level), max, min);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5121
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
5122 qc = ngx_quic_get_connection(c);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5123 cg = &qc->congestion;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5124
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5125 hlen = (ctx->level == ssl_encryption_application)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5126 ? NGX_QUIC_MAX_SHORT_HEADER
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5127 : NGX_QUIC_MAX_LONG_HEADER;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5128
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5129 hlen += EVP_GCM_TLS_TAG_LEN;
8149
44991d728899 QUIC: account packet header length in amplification limit.
Vladimir Homutov <vl@nginx.com>
parents: 8148
diff changeset
5130 hlen -= NGX_QUIC_MAX_CID_LEN - qc->scid.len;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5131
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5132 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5133
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5134 now = ngx_current_msec;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5135 nframes = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5136 p = src;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5137 len = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5138
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5139 for (q = ngx_queue_head(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5140 q != ngx_queue_sentinel(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5141 q = ngx_queue_next(q))
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5142 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5143 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5144
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5145 if (!pkt.need_ack && f->need_ack && max > cg->window) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5146 max = cg->window;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5147 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5148
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5149 if (hlen + len >= max) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5150 break;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5151 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5152
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5153 if (hlen + len + f->len > max) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5154 rc = ngx_quic_split_frame(c, f, max - hlen - len);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5155
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5156 if (rc == NGX_ERROR) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5157 return NGX_ERROR;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5158 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5159
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5160 if (rc == NGX_DECLINED) {
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5161 break;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
5162 }
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5163 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5164
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5165 if (f->need_ack) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5166 pkt.need_ack = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5167 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5168
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5169 ngx_quic_log_frame(c->log, f, 1);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5170
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5171 flen = ngx_quic_create_frame(p, f);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5172 if (flen == -1) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5173 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5174 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5175
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5176 len += flen;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5177 p += flen;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5178
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5179 f->pnum = ctx->pnum;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5180 f->first = now;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5181 f->last = now;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5182 f->plen = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5183
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5184 nframes++;
8291
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5185
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5186 if (f->flush) {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5187 break;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5188 }
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5189 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5190
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5191 if (nframes == 0) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5192 return 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5193 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5194
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5195 out.data = src;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5196 out.len = len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5197
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5198 pkt.keys = qc->keys;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5199 pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5200
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5201 if (ctx->level == ssl_encryption_initial) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5202 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5203
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5204 } else if (ctx->level == ssl_encryption_handshake) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5205 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5206
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5207 } else {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5208 if (qc->key_phase) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5209 pkt.flags |= NGX_QUIC_PKT_KPHASE;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5210 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5211 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5212
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5213 ngx_quic_set_packet_number(&pkt, ctx);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5214
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5215 pkt.version = qc->version;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5216 pkt.log = c->log;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5217 pkt.level = ctx->level;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5218 pkt.dcid = qc->scid;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5219 pkt.scid = qc->dcid;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5220
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5221 pad_len = 4;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5222
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5223 if (min) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5224 hlen = EVP_GCM_TLS_TAG_LEN
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5225 + ngx_quic_create_header(&pkt, NULL, out.len, NULL);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5226
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5227 if (min > hlen + pad_len) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5228 pad_len = min - hlen;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5229 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5230 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5231
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5232 if (out.len < pad_len) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5233 ngx_memset(p, NGX_QUIC_FT_PADDING, pad_len - out.len);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5234 out.len = pad_len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5235 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5236
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5237 pkt.payload = out;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5238
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5239 res.data = data;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5240
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5241 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5242 "quic packet tx %s bytes:%ui"
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5243 " need_ack:%d number:%L encoded nl:%d trunc:0x%xD",
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5244 ngx_quic_level_name(ctx->level), out.len, pkt.need_ack,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5245 pkt.number, pkt.num_len, pkt.trunc);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5246
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5247 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5248 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5249 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5250
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5251 ctx->pnum++;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5252
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5253 if (pkt.need_ack) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5254 /* move frames into the sent queue to wait for ack */
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5255
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5256 if (!qc->closing) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5257 q = ngx_queue_head(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5258 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5259 f->plen = res.len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5260
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5261 do {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5262 q = ngx_queue_head(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5263 ngx_queue_remove(q);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5264 ngx_queue_insert_tail(&ctx->sent, q);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5265 } while (--nframes);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5266 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5267
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5268 cg->in_flight += res.len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5269
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5270 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5271 "quic congestion send if:%uz", cg->in_flight);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5272 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5273
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5274 while (nframes--) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5275 q = ngx_queue_head(&ctx->frames);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5276 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5277
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5278 ngx_queue_remove(q);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5279 ngx_quic_free_frame(c, f);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5280 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5281
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5282 return res.len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5283 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5284
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5285
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5286 static ngx_int_t
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5287 ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5288 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5289 size_t shrink;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5290 ngx_quic_frame_t *nf;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5291 ngx_quic_ordered_frame_t *of, *onf;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5292
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5293 switch (f->type) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5294 case NGX_QUIC_FT_CRYPTO:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5295 case NGX_QUIC_FT_STREAM0:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5296 case NGX_QUIC_FT_STREAM1:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5297 case NGX_QUIC_FT_STREAM2:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5298 case NGX_QUIC_FT_STREAM3:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5299 case NGX_QUIC_FT_STREAM4:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5300 case NGX_QUIC_FT_STREAM5:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5301 case NGX_QUIC_FT_STREAM6:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5302 case NGX_QUIC_FT_STREAM7:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5303 break;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5304
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5305 default:
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5306 return NGX_DECLINED;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5307 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5308
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5309 if ((size_t) f->len <= len) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5310 return NGX_OK;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5311 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5312
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5313 shrink = f->len - len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5314
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5315 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5316 "quic split frame now:%uz need:%uz shrink:%uz",
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5317 f->len, len, shrink);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5318
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5319 of = &f->u.ord;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5320
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5321 if (of->length <= shrink) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5322 return NGX_DECLINED;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5323 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5324
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5325 of->length -= shrink;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5326 f->len = ngx_quic_create_frame(NULL, f);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5327
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5328 if ((size_t) f->len > len) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5329 ngx_log_error(NGX_LOG_ERR, c->log, 0, "could not split QUIC frame");
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5330 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5331 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5332
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5333 nf = ngx_quic_alloc_frame(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5334 if (nf == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5335 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5336 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5337
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5338 *nf = *f;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5339 onf = &nf->u.ord;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5340 onf->offset += of->length;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5341 onf->length = shrink;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5342 nf->len = ngx_quic_create_frame(NULL, nf);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5343
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5344 nf->data = ngx_quic_split_bufs(c, f->data, of->length);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5345 if (nf->data == NGX_CHAIN_ERROR) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5346 return NGX_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5347 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5348
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
5349 ngx_queue_insert_after(&f->queue, &nf->queue);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5350
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5351 return NGX_OK;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5352 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5353
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5354
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5355 static void
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5356 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
5357 {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5358 ngx_queue_t *q;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5359 ngx_quic_frame_t *f;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5360
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5361 do {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5362 q = ngx_queue_head(frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5363
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5364 if (q == ngx_queue_sentinel(frames)) {
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5365 break;
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5366 }
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5367
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5368 ngx_queue_remove(q);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5369
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5370 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
5371
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5372 ngx_quic_free_frame(c, f);
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5373 } while (1);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5374 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5375
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5376
8240
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5377 static ssize_t
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5378 ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len)
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5379 {
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5380 ngx_buf_t b;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5381 ngx_chain_t cl, *res;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5382
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5383 ngx_memzero(&b, sizeof(ngx_buf_t));
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5384
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5385 b.pos = b.start = buf;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5386 b.last = b.end = buf + len;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5387 b.last_buf = 1;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5388 b.temporary = 1;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5389
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5390 cl.buf = &b;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5391 cl.next= NULL;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5392
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5393 res = c->send_chain(c, &cl, 0);
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5394 if (res == NGX_CHAIN_ERROR) {
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5395 return NGX_ERROR;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5396 }
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5397
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5398 return len;
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5399 }
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5400
43f3574b3e6f QUIC: fixed handling of clients connected to wildcard address.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
5401
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5402 static void
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
5403 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
5404 {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5405 uint64_t delta;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5406
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
5407 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
5408 pkt->number = ctx->pnum;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5409
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5410 if (delta <= 0x7F) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5411 pkt->num_len = 1;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
5412 pkt->trunc = ctx->pnum & 0xff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5413
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5414 } else if (delta <= 0x7FFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5415 pkt->num_len = 2;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5416 pkt->flags |= 0x1;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
5417 pkt->trunc = ctx->pnum & 0xffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5418
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5419 } else if (delta <= 0x7FFFFF) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5420 pkt->num_len = 3;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5421 pkt->flags |= 0x2;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
5422 pkt->trunc = ctx->pnum & 0xffffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5423
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5424 } else {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5425 pkt->num_len = 4;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5426 pkt->flags |= 0x3;
7808
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 7794
diff changeset
5427 pkt->trunc = ctx->pnum & 0xffffffff;
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5428 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5429 }
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5430
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5431
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7780
diff changeset
5432 static void
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
5433 ngx_quic_pto_handler(ngx_event_t *ev)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5434 {
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5435 ngx_uint_t i;
8291
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5436 ngx_msec_t now;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5437 ngx_queue_t *q, *next;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5438 ngx_connection_t *c;
8291
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5439 ngx_quic_frame_t *f;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5440 ngx_quic_send_ctx_t *ctx;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5441 ngx_quic_connection_t *qc;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5442
7990
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 7989
diff changeset
5443 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
5444
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5445 c = ev->data;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
5446 qc = ngx_quic_get_connection(c);
8291
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5447 now = ngx_current_msec;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5448
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5449 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
5450
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5451 ctx = &qc->send_ctx[i];
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5452
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5453 if (ngx_queue_empty(&ctx->sent)) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5454 continue;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5455 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5456
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5457 q = ngx_queue_head(&ctx->sent);
8291
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5458 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5459
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5460 if (f->pnum <= ctx->largest_ack
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
5461 && ctx->largest_ack != NGX_QUIC_UNSET_PN)
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5462 {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5463 continue;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5464 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5465
8291
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5466 if ((ngx_msec_int_t) (f->last + ngx_quic_pto(c, ctx) - now) > 0) {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5467 continue;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5468 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5469
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5470 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5471 "quic pto %s pto_count:%ui",
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5472 ngx_quic_level_name(ctx->level), qc->pto_count);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5473
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5474 for (q = ngx_queue_head(&ctx->frames);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5475 q != ngx_queue_sentinel(&ctx->frames);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5476 /* void */)
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5477 {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5478 next = ngx_queue_next(q);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5479 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5480
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5481 if (f->type == NGX_QUIC_FT_PING) {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5482 ngx_queue_remove(q);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5483 ngx_quic_free_frame(c, f);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5484 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5485
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5486 q = next;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5487 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5488
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5489 for (q = ngx_queue_head(&ctx->sent);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5490 q != ngx_queue_sentinel(&ctx->sent);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5491 /* void */)
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5492 {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5493 next = ngx_queue_next(q);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5494 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5495
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5496 if (f->type == NGX_QUIC_FT_PING) {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5497 ngx_quic_congestion_lost(c, f);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5498 ngx_queue_remove(q);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5499 ngx_quic_free_frame(c, f);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5500 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5501
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5502 q = next;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5503 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5504
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5505 /* enforce 2 udp datagrams */
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5506
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5507 f = ngx_quic_alloc_frame(c);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5508 if (f == NULL) {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5509 break;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5510 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5511
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5512 f->level = ctx->level;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5513 f->type = NGX_QUIC_FT_PING;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5514 f->flush = 1;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5515
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5516 ngx_quic_queue_frame(qc, f);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5517
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5518 f = ngx_quic_alloc_frame(c);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5519 if (f == NULL) {
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5520 break;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5521 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5522
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5523 f->level = ctx->level;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5524 f->type = NGX_QUIC_FT_PING;
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5525
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5526 ngx_quic_queue_frame(qc, f);
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5527 }
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5528
9ed95726b99b QUIC: send PING frames on PTO expiration.
Roman Arutyunyan <arut@nginx.com>
parents: 8290
diff changeset
5529 qc->pto_count++;
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
5530
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
5531 ngx_quic_connstate_dbg(c);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5532 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5533
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5534
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5535 static void
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5536 ngx_quic_push_handler(ngx_event_t *ev)
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5537 {
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
5538 ngx_connection_t *c;
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5539
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
5540 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
5541
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5542 c = ev->data;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5543
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5544 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
5545 ngx_quic_close_connection(c, NGX_ERROR);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5546 return;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5547 }
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
5548
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
5549 ngx_quic_connstate_dbg(c);
7775
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5550 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5551
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
5552
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5553 static
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5554 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
5555 {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5556 ngx_connection_t *c;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5557
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5558 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
5559
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5560 c = ev->data;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5561
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5562 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
5563 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
5564 }
8166
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
5565
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8165
diff changeset
5566 ngx_quic_connstate_dbg(c);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5567 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5568
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5569
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5570 static ngx_int_t
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5571 ngx_quic_detect_lost(ngx_connection_t *c)
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5572 {
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5573 ngx_uint_t i;
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5574 ngx_msec_t now, wait, thr;
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5575 ngx_queue_t *q;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5576 ngx_quic_frame_t *start;
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5577 ngx_quic_send_ctx_t *ctx;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5578 ngx_quic_connection_t *qc;
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5579
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
5580 qc = ngx_quic_get_connection(c);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5581 now = ngx_current_msec;
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5582 thr = ngx_quic_lost_threshold(qc);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5583
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5584 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5585
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5586 ctx = &qc->send_ctx[i];
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5587
8157
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8156
diff changeset
5588 if (ctx->largest_ack == NGX_QUIC_UNSET_PN) {
8053
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
5589 continue;
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
5590 }
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
5591
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5592 while (!ngx_queue_empty(&ctx->sent)) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5593
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5594 q = ngx_queue_head(&ctx->sent);
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5595 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5596
8053
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
5597 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
5598 break;
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
5599 }
4e3a71621c9a QUIC: do not arm loss detection timer for succeeding packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8052
diff changeset
5600
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5601 wait = start->last + thr - now;
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5602
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5603 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
5604 "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
5605 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
5606
8054
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
5607 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
5608 && 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
5609 {
355e079c5eee QUIC: do not arm loss detection timer on packet threshold.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8053
diff changeset
5610 break;
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5611 }
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
5612
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5613 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
5614 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5615 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5616
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5617 ngx_quic_set_lost_timer(c);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5618
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5619 return NGX_OK;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5620 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5621
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5622
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5623 static void
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5624 ngx_quic_set_lost_timer(ngx_connection_t *c)
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5625 {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5626 ngx_uint_t i;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5627 ngx_msec_t now;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5628 ngx_queue_t *q;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5629 ngx_msec_int_t lost, pto, w;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5630 ngx_quic_frame_t *f;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5631 ngx_quic_send_ctx_t *ctx;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5632 ngx_quic_connection_t *qc;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5633
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5634 qc = ngx_quic_get_connection(c);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5635 now = ngx_current_msec;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5636
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5637 lost = -1;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5638 pto = -1;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5639
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5640 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5641 ctx = &qc->send_ctx[i];
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5642
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5643 if (ngx_queue_empty(&ctx->sent)) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5644 continue;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5645 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5646
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5647 if (ctx->largest_ack != NGX_QUIC_UNSET_PN) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5648 q = ngx_queue_head(&ctx->sent);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5649 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5650 w = (ngx_msec_int_t) (f->last + ngx_quic_lost_threshold(qc) - now);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5651
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5652 if (f->pnum <= ctx->largest_ack) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5653 if (w < 0 || ctx->largest_ack - f->pnum >= NGX_QUIC_PKT_THR) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5654 w = 0;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5655 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5656
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5657 if (lost == -1 || w < lost) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5658 lost = w;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5659 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5660 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5661 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5662
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5663 q = ngx_queue_last(&ctx->sent);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5664 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5665 w = (ngx_msec_int_t) (f->last + ngx_quic_pto(c, ctx) - now);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5666
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5667 if (w < 0) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5668 w = 0;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5669 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5670
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5671 if (pto == -1 || w < pto) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5672 pto = w;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5673 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5674 }
7992
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5675
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5676 if (qc->pto.timer_set) {
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5677 ngx_del_timer(&qc->pto);
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5678 }
909b989ec088 QUIC: reworked retransmission mechanism.
Vladimir Homutov <vl@nginx.com>
parents: 7991
diff changeset
5679
8290
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5680 if (lost != -1) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5681 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5682 "quic lost timer lost:%M", lost);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5683
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5684 qc->pto.handler = ngx_quic_lost_handler;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5685 ngx_add_timer(&qc->pto, lost);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5686 return;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5687 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5688
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5689 if (pto != -1) {
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5690 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5691 "quic lost timer pto:%M", pto);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5692
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5693 qc->pto.handler = ngx_quic_pto_handler;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5694 ngx_add_timer(&qc->pto, pto);
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5695 return;
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5696 }
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5697
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8289
diff changeset
5698 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic lost timer unset");
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5699 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5700
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5701
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5702 static void
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5703 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
5704 {
8176
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5705 size_t n;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5706 ngx_buf_t *b;
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5707 ngx_queue_t *q;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5708 ngx_quic_frame_t *f, *start;
8176
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5709 ngx_quic_stream_t *sn;
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5710 ngx_quic_connection_t *qc;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5711
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
5712 qc = ngx_quic_get_connection(c);
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5713 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
5714 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
5715
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5716 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
5717 "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
5718
8175
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5719 ngx_quic_congestion_lost(c, start);
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5720
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5721 do {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5722 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
5723
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5724 if (f->pnum != start->pnum) {
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5725 break;
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5726 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5727
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5728 q = ngx_queue_next(q);
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5729
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5730 ngx_queue_remove(&f->queue);
8175
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5731
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5732 switch (f->type) {
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5733 case NGX_QUIC_FT_ACK:
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5734 case NGX_QUIC_FT_ACK_ECN:
8289
88c9c868a7c9 QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents: 8288
diff changeset
5735 if (ctx->level == ssl_encryption_application) {
88c9c868a7c9 QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents: 8288
diff changeset
5736 /* force generation of most recent acknowledgment */
88c9c868a7c9 QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents: 8288
diff changeset
5737 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
88c9c868a7c9 QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents: 8288
diff changeset
5738 }
88c9c868a7c9 QUIC: disabled non-immediate ACKs for Initial and Handshake.
Roman Arutyunyan <arut@nginx.com>
parents: 8288
diff changeset
5739
8175
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5740 ngx_quic_free_frame(c, f);
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5741 break;
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5742
8176
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5743 case NGX_QUIC_FT_PING:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5744 case NGX_QUIC_FT_PATH_RESPONSE:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5745 case NGX_QUIC_FT_CONNECTION_CLOSE:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5746 ngx_quic_free_frame(c, f);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5747 break;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5748
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5749 case NGX_QUIC_FT_MAX_DATA:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5750 f->u.max_data.max_data = qc->streams.recv_max_data;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5751 ngx_quic_queue_frame(qc, f);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5752 break;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5753
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5754 case NGX_QUIC_FT_MAX_STREAMS:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5755 case NGX_QUIC_FT_MAX_STREAMS2:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5756 f->u.max_streams.limit = f->u.max_streams.bidi
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5757 ? qc->streams.client_max_streams_bidi
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5758 : qc->streams.client_max_streams_uni;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5759 ngx_quic_queue_frame(qc, f);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5760 break;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5761
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5762 case NGX_QUIC_FT_MAX_STREAM_DATA:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5763 sn = ngx_quic_find_stream(&qc->streams.tree,
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5764 f->u.max_stream_data.id);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5765 if (sn == NULL) {
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5766 ngx_quic_free_frame(c, f);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5767 break;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5768 }
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5769
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5770 b = sn->b;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5771 n = sn->fs.received + (b->pos - b->start) + (b->end - b->last);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5772
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5773 if (f->u.max_stream_data.limit < n) {
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5774 f->u.max_stream_data.limit = n;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5775 }
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5776
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5777 ngx_quic_queue_frame(qc, f);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5778 break;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5779
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5780 case NGX_QUIC_FT_STREAM0:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5781 case NGX_QUIC_FT_STREAM1:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5782 case NGX_QUIC_FT_STREAM2:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5783 case NGX_QUIC_FT_STREAM3:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5784 case NGX_QUIC_FT_STREAM4:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5785 case NGX_QUIC_FT_STREAM5:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5786 case NGX_QUIC_FT_STREAM6:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5787 case NGX_QUIC_FT_STREAM7:
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5788 sn = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5789
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5790 if (sn && sn->c->write->error) {
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5791 /* RESET_STREAM was sent */
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5792 ngx_quic_free_frame(c, f);
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5793 break;
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5794 }
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5795
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5796 /* fall through */
69dc750cf66f QUIC: handle more frames in ngx_quic_resend_frames().
Roman Arutyunyan <arut@nginx.com>
parents: 8175
diff changeset
5797
8175
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5798 default:
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5799 ngx_queue_insert_tail(&ctx->frames, &f->queue);
64405f970f6f QUIC: avoided retransmission of stale ack frames.
Vladimir Homutov <vl@nginx.com>
parents: 8174
diff changeset
5800 }
8051
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5801
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5802 } 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
5803
8094
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5804 if (qc->closing) {
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5805 return;
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5806 }
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5807
b383120afca3 QUIC: resend frames by moving them to output queue.
Roman Arutyunyan <arut@nginx.com>
parents: 8091
diff changeset
5808 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
5809 }
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5810
38f1be6c603f QUIC: sending probe packets on PTO timer expiration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8050
diff changeset
5811
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5812 ngx_connection_t *
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5813 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
5814 {
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5815 size_t rcvbuf_size;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5816 uint64_t id;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5817 ngx_quic_stream_t *qs, *sn;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5818 ngx_quic_connection_t *qc;
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
5819
8200
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8199
diff changeset
5820 qs = c->quic;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
5821 qc = ngx_quic_get_connection(qs->parent);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
5822
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5823 if (bidi) {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5824 if (qc->streams.server_streams_bidi
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5825 >= qc->streams.server_max_streams_bidi)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5826 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5827 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5828 "quic too many server bidi streams:%uL",
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5829 qc->streams.server_streams_bidi);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5830 return NULL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5831 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5832
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5833 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
5834 | NGX_QUIC_STREAM_SERVER_INITIATED;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5835
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5836 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5837 "quic creating server bidi stream"
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5838 " streams:%uL max:%uL id:0x%xL",
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5839 qc->streams.server_streams_bidi,
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5840 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
5841
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5842 qc->streams.server_streams_bidi++;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5843 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
5844
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5845 } else {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5846 if (qc->streams.server_streams_uni
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5847 >= qc->streams.server_max_streams_uni)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5848 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5849 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5850 "quic too many server uni streams:%uL",
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5851 qc->streams.server_streams_uni);
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5852 return NULL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5853 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5854
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5855 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
5856 | NGX_QUIC_STREAM_SERVER_INITIATED
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5857 | NGX_QUIC_STREAM_UNIDIRECTIONAL;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5858
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5859 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5860 "quic creating server uni stream"
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5861 " streams:%uL max:%uL id:0x%xL",
8013
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5862 qc->streams.server_streams_uni,
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5863 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
5864
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5865 qc->streams.server_streams_uni++;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5866 rcvbuf_size = 0;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5867 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5868
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8004
diff changeset
5869 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
5870 if (sn == NULL) {
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
5871 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
5872 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
5873
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
5874 return sn->c;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5875 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5876
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5877
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5878 static void
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5879 ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5880 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5881 {
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5882 ngx_rbtree_node_t **p;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5883 ngx_quic_stream_t *qn, *qnt;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5884
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5885 for ( ;; ) {
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5886 qn = (ngx_quic_stream_t *) node;
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5887 qnt = (ngx_quic_stream_t *) temp;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5888
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5889 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5890
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5891 if (*p == sentinel) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5892 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5893 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5894
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5895 temp = *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5896 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5897
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5898 *p = node;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5899 node->parent = temp;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5900 node->left = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5901 node->right = sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5902 ngx_rbt_red(node);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5903 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5904
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5905
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5906 static ngx_quic_stream_t *
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5907 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
5908 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5909 ngx_rbtree_node_t *node, *sentinel;
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5910 ngx_quic_stream_t *qn;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5911
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5912 node = rbtree->root;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5913 sentinel = rbtree->sentinel;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5914
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5915 while (node != sentinel) {
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5916 qn = (ngx_quic_stream_t *) node;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5917
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5918 if (id == qn->id) {
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5919 return qn;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5920 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5921
7750
2935a11c55b6 Fixed QUIC stream insert and find.
Roman Arutyunyan <arut@nginx.com>
parents: 7748
diff changeset
5922 node = (id < qn->id) ? node->left : node->right;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5923 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5924
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5925 return NULL;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5926 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5927
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
5928
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
5929 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
5930 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
5931 {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5932 size_t n;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5933 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
5934 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
5935 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
5936
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5937 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
5938 "quic stream id:0x%xL is new", id);
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5939
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
5940 qc = ngx_quic_get_connection(c);
8022
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5941
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5942 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
5943
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5944 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
5945 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
5946 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
5947 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5948
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5949 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
5950 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5951 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5952
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5953 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
5954 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
5955 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5956
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5957 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
5958 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
5959 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5960 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5961
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5962 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
5963 | 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
5964 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
5965 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
5966
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5967 } else {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5968
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5969 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
5970 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
5971 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
5972 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5973
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5974 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
5975 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5976 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5977
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5978 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
5979 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
5980 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5981
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5982 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
5983 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
5984 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5985 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5986
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5987 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
5988 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
5989 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
5990 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5991
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5992 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
5993 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
5994 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5995
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5996 /*
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5997 * 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
5998 *
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
5999 * 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
6000 * 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
6001 * 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
6002 * opened.
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6003 */
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6004
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6005 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
6006
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6007 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
6008 if (sn == NULL) {
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6009 return NULL;
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6010 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6011
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6012 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
6013 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6014
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6015 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
6016 }
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6017
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6018
d277e25e37fc QUIC: create streams for STREAM_DATA_BLOCKED and MAX_STREAM_DATA.
Roman Arutyunyan <arut@nginx.com>
parents: 8021
diff changeset
6019 static ngx_quic_stream_t *
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6020 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
6021 {
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6022 ngx_log_t *log;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6023 ngx_pool_t *pool;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6024 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
6025 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
6026 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
6027
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6028 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6029 "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
6030
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6031 qc = ngx_quic_get_connection(c);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6032
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6033 pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6034 if (pool == NULL) {
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6035 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6036 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6037
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6038 sn = ngx_pcalloc(pool, sizeof(ngx_quic_stream_t));
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6039 if (sn == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6040 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6041 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6042 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6043
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6044 sn->node.key = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6045 sn->parent = c;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6046 sn->id = id;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6047
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6048 sn->b = ngx_create_temp_buf(pool, rcvbuf_size);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6049 if (sn->b == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6050 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6051 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6052 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6053
7811
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
6054 ngx_queue_init(&sn->fs.frames);
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
6055
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6056 log = ngx_palloc(pool, sizeof(ngx_log_t));
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6057 if (log == NULL) {
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6058 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6059 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6060 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6061
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6062 *log = *c->log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6063 pool->log = log;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6064
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6065 sn->c = ngx_get_connection(-1, log);
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6066 if (sn->c == NULL) {
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6067 ngx_destroy_pool(pool);
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6068 return NULL;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6069 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6070
8200
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8199
diff changeset
6071 sn->c->quic = sn;
8000
893b3313f53c QUIC: added "quic" listen parameter in Stream.
Roman Arutyunyan <arut@nginx.com>
parents: 7999
diff changeset
6072 sn->c->type = SOCK_STREAM;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6073 sn->c->pool = pool;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6074 sn->c->ssl = c->ssl;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6075 sn->c->sockaddr = c->sockaddr;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6076 sn->c->listening = c->listening;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6077 sn->c->addr_text = c->addr_text;
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6078 sn->c->local_sockaddr = c->local_sockaddr;
8138
d57cfdebe301 QUIC: set local_socklen in stream connections.
Roman Arutyunyan <arut@nginx.com>
parents: 8137
diff changeset
6079 sn->c->local_socklen = c->local_socklen;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6080 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
6081
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6082 sn->c->recv = ngx_quic_stream_recv;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6083 sn->c->send = ngx_quic_stream_send;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6084 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
6085
7997
b250b515e5b6 QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents: 7996
diff changeset
6086 sn->c->read->log = log;
b250b515e5b6 QUIC: fixed stream read event log.
Roman Arutyunyan <arut@nginx.com>
parents: 7996
diff changeset
6087 sn->c->write->log = log;
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6088
7839
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 7838
diff changeset
6089 log->connection = sn->c->number;
44cac24aaa44 Assign connection number to every QUIC stream log.
Roman Arutyunyan <arut@nginx.com>
parents: 7838
diff changeset
6090
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6091 if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6092 || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6093 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6094 sn->c->write->ready = 1;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6095 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6096
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6097 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
6098 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
6099 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
6100 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6101
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6102 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6103 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
6104 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
6105 } else {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6106 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
6107 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6108 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6109
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6110 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
6111 if (cln == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6112 ngx_close_connection(sn->c);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6113 ngx_destroy_pool(pool);
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6114 return NULL;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6115 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6116
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6117 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
6118 cln->data = sn->c;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6119
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6120 ngx_rbtree_insert(&qc->streams.tree, &sn->node);
7748
4cf00c14f11a Safe QUIC stream creation.
Roman Arutyunyan <arut@nginx.com>
parents: 7747
diff changeset
6121
7695
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6122 return sn;
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6123 }
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6124
cfc429911c0d Implemented creation of server unidirectional streams.
Vladimir Homutov <vl@nginx.com>
parents: 7691
diff changeset
6125
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6126 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6127 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
6128 {
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6129 ssize_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6130 ngx_buf_t *b;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6131 ngx_event_t *rev;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6132 ngx_connection_t *pc;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6133 ngx_quic_frame_t *frame;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6134 ngx_quic_stream_t *qs;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6135 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6136
8200
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8199
diff changeset
6137 qs = c->quic;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6138 b = qs->b;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6139 pc = qs->parent;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6140 qc = ngx_quic_get_connection(pc);
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6141 rev = c->read;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6142
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6143 if (rev->error) {
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6144 return NGX_ERROR;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6145 }
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6146
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6147 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6148 "quic stream recv id:0x%xL eof:%d avail:%z",
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6149 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
6150
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
6151 if (b->pos == b->last) {
7745
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6152 rev->ready = 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6153
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6154 if (rev->pending_eof) {
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6155 rev->eof = 1;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6156 return 0;
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6157 }
5f223cdad40e Implemented eof in QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7744
diff changeset
6158
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6159 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6160 "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
6161 return NGX_AGAIN;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6162 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6163
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6164 len = ngx_min(b->last - b->pos, (ssize_t) size);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6165
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6166 ngx_memcpy(buf, b->pos, len);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6167
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6168 b->pos += len;
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6169 qc->streams.received += len;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6170
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
6171 if (b->pos == b->last) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
6172 b->pos = b->start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
6173 b->last = b->start;
7760
32db41d603cd Fixed handling QUIC stream eof.
Roman Arutyunyan <arut@nginx.com>
parents: 7759
diff changeset
6174 rev->ready = rev->pending_eof;
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
6175 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7731
diff changeset
6176
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6177 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6178 "quic stream id:0x%xL recv len:%z of size:%uz",
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6179 qs->id, len, size);
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6180
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6181 if (!rev->pending_eof) {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6182 frame = ngx_quic_alloc_frame(pc);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6183 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6184 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6185 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6186
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6187 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6188 frame->type = NGX_QUIC_FT_MAX_STREAM_DATA;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6189 frame->u.max_stream_data.id = qs->id;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6190 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
6191 + (b->end - b->last);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6192
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6193 ngx_quic_queue_frame(qc, frame);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6194 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6195
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6196 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
6197
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6198 frame = ngx_quic_alloc_frame(pc);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6199
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6200 if (frame == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6201 return NGX_ERROR;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6202 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6203
7842
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 7841
diff changeset
6204 qc->streams.recv_max_data *= 2;
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6205
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6206 frame->level = ssl_encryption_application;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6207 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
6208 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
6209
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6210 ngx_quic_queue_frame(qc, frame);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6211
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6212 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6213 "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
6214 qs->id, qc->streams.recv_max_data);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6215 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7814
diff changeset
6216
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6217 return len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6218 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6219
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6220
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6221 static ssize_t
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6222 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
6223 {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6224 ngx_buf_t b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6225 ngx_chain_t cl;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6226
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6227 ngx_memzero(&b, sizeof(ngx_buf_t));
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6228
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6229 b.memory = 1;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6230 b.pos = buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6231 b.last = buf + size;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6232
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6233 cl.buf = &b;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6234 cl.next = NULL;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6235
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6236 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
6237 return NGX_ERROR;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6238 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6239
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6240 if (b.pos == buf) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6241 return NGX_AGAIN;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6242 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6243
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6244 return b.pos - buf;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6245 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6246
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6247
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6248 static ngx_chain_t *
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6249 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
6250 {
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6251 size_t n, flow;
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6252 ngx_event_t *wev;
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6253 ngx_chain_t *cl;
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6254 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6255 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6256 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6257 ngx_quic_connection_t *qc;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6258
8200
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8199
diff changeset
6259 qs = c->quic;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6260 pc = qs->parent;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6261 qc = ngx_quic_get_connection(pc);
8021
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6262 wev = c->write;
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6263
b66a2a041d7e QUIC: fixed ngx_http_test_reading() for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8020
diff changeset
6264 if (wev->error) {
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6265 return NGX_CHAIN_ERROR;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6266 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6267
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6268 flow = ngx_quic_max_stream_flow(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6269 if (flow == 0) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6270 wev->ready = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6271 return in;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6272 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6273
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6274 n = (limit && (size_t) limit < flow) ? (size_t) limit : flow;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6275
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6276 frame = ngx_quic_alloc_frame(pc);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6277 if (frame == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6278 return NGX_CHAIN_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6279 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6280
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6281 frame->data = ngx_quic_copy_chain(pc, in, n);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6282 if (frame->data == NGX_CHAIN_ERROR) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6283 return NGX_CHAIN_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6284 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6285
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6286 for (n = 0, cl = frame->data; cl; cl = cl->next) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6287 n += ngx_buf_size(cl->buf);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6288 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6289
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6290 while (in && ngx_buf_size(in->buf) == 0) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6291 in = in->next;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6292 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6293
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6294 frame->level = ssl_encryption_application;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6295 frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6296 frame->u.stream.off = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6297 frame->u.stream.len = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6298 frame->u.stream.fin = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6299
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6300 frame->u.stream.type = frame->type;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6301 frame->u.stream.stream_id = qs->id;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6302 frame->u.stream.offset = c->sent;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6303 frame->u.stream.length = n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6304
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6305 c->sent += n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6306 qc->streams.sent += n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6307
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6308 ngx_quic_queue_frame(qc, frame);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6309
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6310 wev->ready = (n < flow) ? 1 : 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6311
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6312 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6313 "quic send_chain sent:%uz", n);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6314
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6315 return in;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6316 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6317
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6318
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6319 static size_t
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6320 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
6321 {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6322 size_t size;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6323 uint64_t sent, unacked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6324 ngx_quic_stream_t *qs;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6325 ngx_quic_connection_t *qc;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6326
8200
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8199
diff changeset
6327 qs = c->quic;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6328 qc = ngx_quic_get_connection(qs->parent);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6329
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6330 size = NGX_QUIC_STREAM_BUFSIZE;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6331 sent = c->sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6332 unacked = sent - qs->acked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6333
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6334 if (qc->streams.send_max_data == 0) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6335 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
6336 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6337
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6338 if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6339 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
6340 "quic send flow hit buffer size");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6341 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6342 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6343
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6344 if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6345 size = NGX_QUIC_STREAM_BUFSIZE - unacked;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6346 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6347
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6348 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
6349 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
6350 "quic send flow hit MAX_DATA");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6351 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6352 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6353
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6354 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
6355 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
6356 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6357
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6358 if (sent >= qs->send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6359 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
6360 "quic send flow hit MAX_STREAM_DATA");
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6361 return 0;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6362 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6363
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6364 if (sent + size > qs->send_max_data) {
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6365 size = qs->send_max_data - sent;
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6366 }
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6367
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6368 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6369 "quic send flow:%uz", size);
8027
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6370
bce9e9643444 QUIC: coalesce neighbouring stream send buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8026
diff changeset
6371 return size;
7691
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6372 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6373
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
6374
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6375 static void
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6376 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
6377 {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6378 ngx_connection_t *c = data;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6379
7746
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6380 ngx_connection_t *pc;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6381 ngx_quic_frame_t *frame;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6382 ngx_quic_stream_t *qs;
b364af7f9f3f Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7745
diff changeset
6383 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
6384
8200
279ad36f2f4b QUIC: renamed c->qs to c->quic.
Roman Arutyunyan <arut@nginx.com>
parents: 8199
diff changeset
6385 qs = c->quic;
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6386 pc = qs->parent;
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6387 qc = ngx_quic_get_connection(pc);
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6388
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6389 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6390 "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
6391
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
6392 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
6393 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
6394
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
6395 if (qc->closing) {
7832
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 7831
diff changeset
6396 /* 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
6397 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
6398 return;
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
6399 }
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 7746
diff changeset
6400
8066
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6401 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
6402 || (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0)
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6403 {
8077
62db595a86b5 QUIC: do not send STOP_SENDING after STREAM fin.
Roman Arutyunyan <arut@nginx.com>
parents: 8076
diff changeset
6404 if (!c->read->pending_eof && !c->read->error) {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6405 frame = ngx_quic_alloc_frame(pc);
8066
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6406 if (frame == NULL) {
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6407 return;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6408 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6409
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6410 frame->level = ssl_encryption_application;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6411 frame->type = NGX_QUIC_FT_STOP_SENDING;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6412 frame->u.stop_sending.id = qs->id;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6413 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
6414
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6415 ngx_quic_queue_frame(qc, frame);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6416 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6417 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8064
diff changeset
6418
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6419 if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6420 frame = ngx_quic_alloc_frame(pc);
8014
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6421 if (frame == NULL) {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6422 return;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6423 }
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6424
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6425 frame->level = ssl_encryption_application;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6426 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
6427
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6428 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
6429 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
6430 frame->u.max_streams.bidi = 0;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6431
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6432 } else {
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6433 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
6434 frame->u.max_streams.bidi = 1;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6435 }
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6436
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6437 ngx_quic_queue_frame(qc, frame);
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6438
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6439 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
6440 /* 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
6441 return;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8013
diff changeset
6442 }
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6443 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6444
8296
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
6445 if (c->write->error) {
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
6446 goto error;
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
6447 }
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
6448
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6449 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8164
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8163
diff changeset
6450 "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
6451
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6452 frame = ngx_quic_alloc_frame(pc);
7705
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6453 if (frame == NULL) {
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6454 return;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6455 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6456
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6457 frame->level = ssl_encryption_application;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6458 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
6459 frame->u.stream.off = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6460 frame->u.stream.len = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6461 frame->u.stream.fin = 1;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6462
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6463 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
6464 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
6465 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
6466 frame->u.stream.length = 0;
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6467
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6468 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
6469
8296
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
6470 error:
d710c457171c QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8295
diff changeset
6471
7759
1ec905f4d851 Push QUIC stream frames in send() and cleanup handler.
Roman Arutyunyan <arut@nginx.com>
parents: 7756
diff changeset
6472 (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
6473 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6474
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 7703
diff changeset
6475
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6476 static ngx_quic_frame_t *
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6477 ngx_quic_alloc_frame(ngx_connection_t *c)
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6478 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6479 ngx_queue_t *q;
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6480 ngx_quic_frame_t *frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6481 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6482
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6483 qc = ngx_quic_get_connection(c);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6484
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6485 if (!ngx_queue_empty(&qc->free_frames)) {
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6486
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6487 q = ngx_queue_head(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6488 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
6489
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6490 ngx_queue_remove(&frame->queue);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6491
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6492 #ifdef NGX_QUIC_DEBUG_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6493 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6494 "quic reuse frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6495 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6496
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6497 } else {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6498 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6499 if (frame == NULL) {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6500 return NULL;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6501 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6502
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6503 #ifdef NGX_QUIC_DEBUG_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6504 ++qc->nframes;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6505
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6506 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6507 "quic alloc frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6508 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6509 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6510
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6511 ngx_memzero(frame, sizeof(ngx_quic_frame_t));
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6512
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6513 return frame;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6514 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6515
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6516
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6517 static void
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6518 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
6519 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6520 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6521 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6522 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6523
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6524 if (f->plen == 0) {
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6525 return;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6526 }
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6527
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6528 qc = ngx_quic_get_connection(c);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6529 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6530
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6531 cg->in_flight -= f->plen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6532
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6533 timer = f->last - cg->recovery_start;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6534
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6535 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
6536 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
6537 "quic congestion ack recovery win:%uz ss:%z if:%uz",
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6538 cg->window, cg->ssthresh, cg->in_flight);
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6539
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6540 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6541 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6542
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6543 if (cg->window < cg->ssthresh) {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6544 cg->window += f->plen;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6545
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6546 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
6547 "quic congestion slow start win:%uz ss:%z if:%uz",
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6548 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6549
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6550 } else {
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6551 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
6552
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6553 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
6554 "quic congestion avoidance win:%uz ss:%z if:%uz",
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6555 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6556 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6557
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6558 /* prevent recovery_start from wrapping */
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6559
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6560 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
6561
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6562 if ((ngx_msec_int_t) timer < 0) {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6563 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
6564 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6565 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6566
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6567
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6568 static void
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6569 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
6570 {
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6571 ngx_msec_t timer;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6572 ngx_quic_congestion_t *cg;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6573 ngx_quic_connection_t *qc;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6574
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6575 if (f->plen == 0) {
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6576 return;
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6577 }
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6578
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6579 qc = ngx_quic_get_connection(c);
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6580 cg = &qc->congestion;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6581
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6582 cg->in_flight -= f->plen;
8171
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8170
diff changeset
6583 f->plen = 0;
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6584
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6585 timer = f->last - cg->recovery_start;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6586
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6587 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
6588 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
6589 "quic congestion lost recovery win:%uz ss:%z if:%uz",
8026
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6590 cg->window, cg->ssthresh, cg->in_flight);
4604e6043657 QUIC: packet based bytes_in_flight accounting.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8025
diff changeset
6591
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6592 return;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6593 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6594
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6595 cg->recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6596 cg->window /= 2;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6597
7910
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7908
diff changeset
6598 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
6599 cg->window = qc->tp.max_udp_payload_size * 2;
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6600 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6601
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6602 cg->ssthresh = cg->window;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6603
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6604 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8193
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
6605 "quic congestion lost win:%uz ss:%z if:%uz",
7841
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6606 cg->window, cg->ssthresh, cg->in_flight);
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6607 }
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6608
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6609
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 7840
diff changeset
6610 static void
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6611 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
6612 {
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6613 ngx_quic_connection_t *qc;
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6614
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6615 qc = ngx_quic_get_connection(c);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6616
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6617 if (frame->data) {
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6618 ngx_quic_free_bufs(c, frame->data);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6619 }
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6620
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
6621 ngx_queue_insert_head(&qc->free_frames, &frame->queue);
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6622
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6623 #ifdef NGX_QUIC_DEBUG_ALLOC
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6624 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
7836
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6625 "quic free frame n:%ui", qc->nframes);
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7833
diff changeset
6626 #endif
7752
c7185bc5b4d9 QUIC frames reuse.
Roman Arutyunyan <arut@nginx.com>
parents: 7751
diff changeset
6627 }
8196
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6628
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6629
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6630 uint32_t
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6631 ngx_quic_version(ngx_connection_t *c)
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6632 {
8199
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6633 uint32_t version;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6634 ngx_quic_connection_t *qc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6635
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6636 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6637
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8198
diff changeset
6638 version = qc->version;
8196
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6639
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6640 return (version & 0xff000000) == 0xff000000 ? version & 0xff : version;
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8195
diff changeset
6641 }
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6642
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6643
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6644 static ngx_chain_t *
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6645 ngx_quic_alloc_buf(ngx_connection_t *c)
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6646 {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6647 ngx_buf_t *b;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6648 ngx_chain_t *cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6649 ngx_quic_connection_t *qc;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6650
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6651 qc = ngx_quic_get_connection(c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6652
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6653 if (qc->free_bufs) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6654 cl = qc->free_bufs;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6655 qc->free_bufs = cl->next;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6656
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6657 b = cl->buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6658 b->pos = b->start;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6659 b->last = b->start;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6660
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6661 #ifdef NGX_QUIC_DEBUG_ALLOC
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6662 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6663 "quic reuse buffer n:%ui", qc->nbufs);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6664 #endif
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6665
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6666 return cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6667 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6668
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6669 cl = ngx_alloc_chain_link(c->pool);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6670 if (cl == NULL) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6671 return NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6672 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6673
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6674 b = ngx_create_temp_buf(c->pool, NGX_QUIC_BUFFER_SIZE);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6675 if (b == NULL) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6676 return NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6677 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6678
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6679 b->tag = (ngx_buf_tag_t) &ngx_quic_alloc_buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6680
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6681 cl->buf = b;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6682
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6683 #ifdef NGX_QUIC_DEBUG_ALLOC
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6684 ++qc->nbufs;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6685
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6686 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6687 "quic alloc buffer n:%ui", qc->nbufs);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6688 #endif
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6689
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6690 return cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6691 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6692
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6693
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6694 static void
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6695 ngx_quic_free_bufs(ngx_connection_t *c, ngx_chain_t *in)
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6696 {
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6697 ngx_buf_t *b, *shadow;
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6698 ngx_chain_t *cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6699 ngx_quic_connection_t *qc;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6700
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6701 qc = ngx_quic_get_connection(c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6702
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6703 while (in) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6704 #ifdef NGX_QUIC_DEBUG_ALLOC
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6705 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6706 "quic free buffer n:%ui", qc->nbufs);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6707 #endif
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6708
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6709 cl = in;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6710 in = in->next;
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6711 b = cl->buf;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6712
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6713 if (b->shadow) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6714 if (!b->last_shadow) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6715 b->recycled = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6716 ngx_free_chain(c->pool, cl);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6717 continue;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6718 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6719
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6720 do {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6721 shadow = b->shadow;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6722 b->shadow = qc->free_shadow_bufs;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6723 qc->free_shadow_bufs = b;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6724 b = shadow;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6725 } while (b->recycled);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6726
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6727 if (b->shadow) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6728 b->last_shadow = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6729 ngx_free_chain(c->pool, cl);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6730 continue;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6731 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6732
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6733 cl->buf = b;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6734 }
8241
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6735
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6736 cl->next = qc->free_bufs;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6737 qc->free_bufs = cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6738 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6739 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6740
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6741
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6742 static ngx_chain_t *
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6743 ngx_quic_copy_buf(ngx_connection_t *c, u_char *data, size_t len)
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6744 {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6745 size_t n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6746 ngx_buf_t *b;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6747 ngx_chain_t *cl, *out, **ll;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6748
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6749 out = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6750 ll = &out;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6751
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6752 while (len) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6753 cl = ngx_quic_alloc_buf(c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6754 if (cl == NULL) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6755 return NGX_CHAIN_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6756 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6757
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6758 b = cl->buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6759 n = ngx_min((size_t) (b->end - b->last), len);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6760
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6761 b->last = ngx_cpymem(b->last, data, n);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6762
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6763 data += n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6764 len -= n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6765
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6766 *ll = cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6767 ll = &cl->next;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6768 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6769
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6770 *ll = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6771
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6772 return out;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6773 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6774
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6775
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6776 static ngx_chain_t *
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6777 ngx_quic_copy_chain(ngx_connection_t *c, ngx_chain_t *in, size_t limit)
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6778 {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6779 size_t n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6780 ngx_buf_t *b;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6781 ngx_chain_t *cl, *out, **ll;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6782
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6783 out = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6784 ll = &out;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6785
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6786 while (in) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6787 if (!ngx_buf_in_memory(in->buf) || ngx_buf_size(in->buf) == 0) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6788 in = in->next;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6789 continue;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6790 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6791
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6792 cl = ngx_quic_alloc_buf(c);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6793 if (cl == NULL) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6794 return NGX_CHAIN_ERROR;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6795 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6796
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6797 *ll = cl;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6798 ll = &cl->next;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6799
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6800 b = cl->buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6801
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6802 while (in && b->last != b->end) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6803
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6804 n = ngx_min(in->buf->last - in->buf->pos, b->end - b->last);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6805
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6806 if (limit > 0 && n > limit) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6807 n = limit;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6808 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6809
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6810 b->last = ngx_cpymem(b->last, in->buf->pos, n);
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6811
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6812 in->buf->pos += n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6813 if (in->buf->pos == in->buf->last) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6814 in = in->next;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6815 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6816
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6817 if (limit > 0) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6818 if (limit == n) {
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6819 goto done;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6820 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6821
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6822 limit -= n;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6823 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6824 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6825
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6826 }
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6827
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6828 done:
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6829
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6830 *ll = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6831
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6832 return out;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8240
diff changeset
6833 }
8242
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6834
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6835
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6836 static ngx_chain_t *
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6837 ngx_quic_split_bufs(ngx_connection_t *c, ngx_chain_t *in, size_t len)
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6838 {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6839 size_t n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6840 ngx_buf_t *b;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6841 ngx_chain_t *out;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6842 ngx_quic_connection_t *qc;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6843
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6844 qc = ngx_quic_get_connection(c);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6845
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6846 while (in) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6847 n = ngx_buf_size(in->buf);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6848
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6849 if (n == len) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6850 out = in->next;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6851 in->next = NULL;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6852 return out;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6853 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6854
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6855 if (n > len) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6856 break;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6857 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6858
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6859 len -= n;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6860 in = in->next;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6861 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6862
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6863 if (in == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6864 return NULL;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6865 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6866
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6867 /* split in->buf by creating shadow bufs which reference it */
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6868
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6869 if (in->buf->shadow == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6870 if (qc->free_shadow_bufs) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6871 b = qc->free_shadow_bufs;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6872 qc->free_shadow_bufs = b->shadow;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6873
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6874 } else {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6875 b = ngx_alloc_buf(c->pool);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6876 if (b == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6877 return NGX_CHAIN_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6878 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6879 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6880
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6881 *b = *in->buf;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6882 b->shadow = in->buf;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6883 b->last_shadow = 1;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6884 in->buf = b;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6885 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6886
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6887 out = ngx_alloc_chain_link(c->pool);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6888 if (out == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6889 return NGX_CHAIN_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6890 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6891
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6892 if (qc->free_shadow_bufs) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6893 b = qc->free_shadow_bufs;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6894 qc->free_shadow_bufs = b->shadow;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6895
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6896 } else {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6897 b = ngx_alloc_buf(c->pool);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6898 if (b == NULL) {
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6899 ngx_free_chain(c->pool, out);
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6900 return NGX_CHAIN_ERROR;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6901 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6902 }
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6903
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6904 out->buf = b;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6905 out->next = in->next;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6906 in->next = NULL;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6907
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6908 *b = *in->buf;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6909 b->last_shadow = 0;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6910 b->pos = b->pos + len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6911
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6912 in->buf->shadow = b;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6913 in->buf->last = in->buf->pos + len;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6914
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6915 return out;
0af4ec6d1f92 QUIC: coalesce output packets into a single UDP datagram.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
6916 }