Mercurial > hg > nginx
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 */ |