comparison src/event/ngx_event_quic.c @ 8271:8e54a17dabee quic

Respect QUIC max_idle_timeout.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 23 Mar 2020 21:20:20 +0300
parents c87a13514abc
children 7f0981be07c4
comparison
equal deleted inserted replaced
8270:c87a13514abc 8271:8e54a17dabee
28 28
29 29
30 typedef struct { 30 typedef struct {
31 ngx_rbtree_t tree; 31 ngx_rbtree_t tree;
32 ngx_rbtree_node_t sentinel; 32 ngx_rbtree_node_t sentinel;
33 ngx_msec_t timeout;
34 ngx_connection_handler_pt handler; 33 ngx_connection_handler_pt handler;
35 34
36 ngx_uint_t id_counter; 35 ngx_uint_t id_counter;
37 } ngx_quic_streams_t; 36 } ngx_quic_streams_t;
38 37
57 ngx_ssl_t *ssl; 56 ngx_ssl_t *ssl;
58 ngx_quic_frame_t *frames; 57 ngx_quic_frame_t *frames;
59 58
60 ngx_quic_streams_t streams; 59 ngx_quic_streams_t streams;
61 ngx_uint_t max_data; 60 ngx_uint_t max_data;
61 ngx_uint_t send_timer_set;
62 /* unsigned send_timer_set:1 */
62 63
63 #define SSL_ECRYPTION_LAST ((ssl_encryption_application) + 1) 64 #define SSL_ECRYPTION_LAST ((ssl_encryption_application) + 1)
64 uint64_t crypto_offset[SSL_ECRYPTION_LAST]; 65 uint64_t crypto_offset[SSL_ECRYPTION_LAST];
65 }; 66 };
66 67
253 != NGX_OK) 254 != NGX_OK)
254 { 255 {
255 return NGX_ERROR; 256 return NGX_ERROR;
256 } 257 }
257 258
259 if (qc->ctp.max_idle_timeout > 0
260 && qc->ctp.max_idle_timeout < qc->tp.max_idle_timeout)
261 {
262 qc->tp.max_idle_timeout = qc->ctp.max_idle_timeout;
263 }
264
258 qc->client_tp_done = 1; 265 qc->client_tp_done = 1;
259 } 266 }
260 } 267 }
261 268
262 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t)); 269 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
332 } 339 }
333 340
334 341
335 void 342 void
336 ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp, 343 ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
337 ngx_msec_t timeout, ngx_connection_handler_pt handler) 344 ngx_connection_handler_pt handler)
338 { 345 {
339 ngx_buf_t *b; 346 ngx_buf_t *b;
340 ngx_quic_header_t pkt; 347 ngx_quic_header_t pkt;
341 348
342 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run"); 349 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run");
357 return; 364 return;
358 } 365 }
359 366
360 // we don't need stream handler for initial packet processing 367 // we don't need stream handler for initial packet processing
361 c->quic->streams.handler = handler; 368 c->quic->streams.handler = handler;
362 c->quic->streams.timeout = timeout; 369
363 370 ngx_add_timer(c->read, c->quic->tp.max_idle_timeout);
364 ngx_add_timer(c->read, timeout);
365 371
366 c->read->handler = ngx_quic_input_handler; 372 c->read->handler = ngx_quic_input_handler;
367 373
368 return; 374 return;
369 } 375 }
522 528
523 529
524 static void 530 static void
525 ngx_quic_input_handler(ngx_event_t *rev) 531 ngx_quic_input_handler(ngx_event_t *rev)
526 { 532 {
527 ssize_t n; 533 ssize_t n;
528 ngx_buf_t b; 534 ngx_buf_t b;
529 ngx_connection_t *c; 535 ngx_connection_t *c;
536 ngx_quic_connection_t *qc;
530 537
531 static u_char buf[65535]; 538 static u_char buf[65535];
532 539
533 b.start = buf; 540 b.start = buf;
534 b.end = buf + sizeof(buf); 541 b.end = buf + sizeof(buf);
542 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); 549 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
543 ngx_quic_close_connection(c); 550 ngx_quic_close_connection(c);
544 return; 551 return;
545 } 552 }
546 553
547 ngx_add_timer(rev, c->quic->streams.timeout);
548
549 if (c->close) { 554 if (c->close) {
550 ngx_quic_close_connection(c); 555 ngx_quic_close_connection(c);
551 return; 556 return;
552 } 557 }
553 558
567 572
568 if (ngx_quic_input(c, &b) != NGX_OK) { 573 if (ngx_quic_input(c, &b) != NGX_OK) {
569 ngx_quic_close_connection(c); 574 ngx_quic_close_connection(c);
570 return; 575 return;
571 } 576 }
577
578 qc = c->quic;
579
580 qc->send_timer_set = 0;
581 ngx_add_timer(rev, qc->tp.max_idle_timeout);
572 } 582 }
573 583
574 584
575 static void 585 static void
576 ngx_quic_close_connection(ngx_connection_t *c) 586 ngx_quic_close_connection(ngx_connection_t *c)
1207 1217
1208 } while (1); 1218 } while (1);
1209 1219
1210 qc->frames = NULL; 1220 qc->frames = NULL;
1211 1221
1222 if (!qc->send_timer_set) {
1223 qc->send_timer_set = 1;
1224 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
1225 }
1226
1212 return NGX_OK; 1227 return NGX_OK;
1213 } 1228 }
1214 1229
1215 1230
1216 /* pack a group of frames [start; end) into memory p and send as single packet */ 1231 /* pack a group of frames [start; end) into memory p and send as single packet */