comparison src/event/ngx_event_quic_transport.h @ 8308:e10b4c61420f quic

Implemented retransmission and retransmit queue. All frames collected to packet are moved into a per-namespace send queue. QUIC connection has a timer which fires on the closest max_ack_delay time. The frame is deleted from the queue when a corresponding packet is acknowledged. The NGX_QUIC_MAX_RETRANSMISSION is a timeout that defines maximum length of retransmission of a frame.
author Vladimir Homutov <vl@nginx.com>
date Wed, 01 Apr 2020 17:06:26 +0300
parents dc7ac778aafe
children fdda518d10ba
comparison
equal deleted inserted replaced
8307:dc7ac778aafe 8308:e10b4c61420f
95 #define NGX_QUIC_TP_PREFERRED_ADDRESS 0x0D 95 #define NGX_QUIC_TP_PREFERRED_ADDRESS 0x0D
96 #define NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT 0x0E 96 #define NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT 0x0E
97 97
98 98
99 typedef struct { 99 typedef struct {
100 ngx_uint_t pn;
101 uint64_t largest; 100 uint64_t largest;
102 uint64_t delay; 101 uint64_t delay;
103 uint64_t range_count; 102 uint64_t range_count;
104 uint64_t first_range; 103 uint64_t first_range;
105 uint64_t ranges[20]; 104 uint64_t ranges[20];
202 typedef struct ngx_quic_frame_s ngx_quic_frame_t; 201 typedef struct ngx_quic_frame_s ngx_quic_frame_t;
203 202
204 struct ngx_quic_frame_s { 203 struct ngx_quic_frame_s {
205 ngx_uint_t type; 204 ngx_uint_t type;
206 enum ssl_encryption_level_t level; 205 enum ssl_encryption_level_t level;
207 ngx_quic_frame_t *next; 206 ngx_queue_t queue;
207 uint64_t pnum;
208 ngx_msec_t first;
209 ngx_msec_t last;
210 ngx_uint_t need_ack;
211 /* unsigned need_ack:1; */
212
208 u_char *data; 213 u_char *data;
209 union { 214 union {
210 ngx_quic_ack_frame_t ack; 215 ngx_quic_ack_frame_t ack;
211 ngx_quic_crypto_frame_t crypto; 216 ngx_quic_crypto_frame_t crypto;
212 ngx_quic_new_conn_id_frame_t ncid; 217 ngx_quic_new_conn_id_frame_t ncid;
248 ngx_str_t dcid; 253 ngx_str_t dcid;
249 ngx_str_t scid; 254 ngx_str_t scid;
250 uint64_t pn; 255 uint64_t pn;
251 u_char *plaintext; 256 u_char *plaintext;
252 ngx_str_t payload; /* decrypted data */ 257 ngx_str_t payload; /* decrypted data */
258
259 ngx_uint_t need_ack;
260 /* unsigned need_ack:1; */
253 } ngx_quic_header_t; 261 } ngx_quic_header_t;
254 262
255 263
256 u_char *ngx_quic_error_text(uint64_t error_code); 264 u_char *ngx_quic_error_text(uint64_t error_code);
257 265
267 ngx_int_t ngx_quic_parse_initial_header(ngx_quic_header_t *pkt); 275 ngx_int_t ngx_quic_parse_initial_header(ngx_quic_header_t *pkt);
268 ngx_int_t ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt); 276 ngx_int_t ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt);
269 277
270 ssize_t ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end, 278 ssize_t ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end,
271 ngx_quic_frame_t *frame); 279 ngx_quic_frame_t *frame);
272 ssize_t ngx_quic_create_frame(u_char *p, u_char *end, ngx_quic_frame_t *f); 280 ssize_t ngx_quic_create_frame(u_char *p, ngx_quic_frame_t *f);
273 281
274 ngx_int_t ngx_quic_parse_transport_params(u_char *p, u_char *end, 282 ngx_int_t ngx_quic_parse_transport_params(u_char *p, u_char *end,
275 ngx_quic_tp_t *tp, ngx_log_t *log); 283 ngx_quic_tp_t *tp, ngx_log_t *log);
276 ssize_t ngx_quic_create_transport_params(u_char *p, u_char *end, 284 ssize_t ngx_quic_create_transport_params(u_char *p, u_char *end,
277 ngx_quic_tp_t *tp); 285 ngx_quic_tp_t *tp);