[nginx] QUIC: "handshake_timeout" configuration parameter.

Roman Arutyunyan arut at nginx.com
Fri Sep 22 15:36:25 UTC 2023


details:   https://hg.nginx.org/nginx/rev/ad3d34ddfdcc
branches:  
changeset: 9158:ad3d34ddfdcc
user:      Roman Arutyunyan <arut at nginx.com>
date:      Wed Sep 13 17:59:37 2023 +0400
description:
QUIC: "handshake_timeout" configuration parameter.

Previously QUIC did not have such parameter and handshake duration was
controlled by HTTP/3.  However that required creating and storing HTTP/3
session on first client datagram.  Apparently there's no convenient way to
store the session object until QUIC handshake is complete.  In the followup
patches session creation will be postponed to init() callback.

diffstat:

 src/event/quic/ngx_event_quic.c           |  6 ++++++
 src/event/quic/ngx_event_quic.h           |  3 ++-
 src/event/quic/ngx_event_quic_streams.c   |  4 ++++
 src/event/quic/ngx_event_quic_transport.c |  2 +-
 src/http/v3/ngx_http_v3_module.c          |  8 ++++++--
 src/http/v3/ngx_http_v3_request.c         |  8 +-------
 6 files changed, 20 insertions(+), 11 deletions(-)

diffs (128 lines):

diff -r daf8f5ba23d8 -r ad3d34ddfdcc src/event/quic/ngx_event_quic.c
--- a/src/event/quic/ngx_event_quic.c	Fri Sep 01 20:31:46 2023 +0400
+++ b/src/event/quic/ngx_event_quic.c	Wed Sep 13 17:59:37 2023 +0400
@@ -211,6 +211,8 @@ ngx_quic_run(ngx_connection_t *c, ngx_qu
     qc = ngx_quic_get_connection(c);
 
     ngx_add_timer(c->read, qc->tp.max_idle_timeout);
+    ngx_add_timer(&qc->close, qc->conf->handshake_timeout);
+
     ngx_quic_connstate_dbg(c);
 
     c->read->handler = ngx_quic_input_handler;
@@ -485,6 +487,10 @@ ngx_quic_close_connection(ngx_connection
             ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
         }
 
+        if (qc->close.timer_set) {
+            ngx_del_timer(&qc->close);
+        }
+
         if (rc == NGX_DONE) {
 
             /*
diff -r daf8f5ba23d8 -r ad3d34ddfdcc src/event/quic/ngx_event_quic.h
--- a/src/event/quic/ngx_event_quic.h	Fri Sep 01 20:31:46 2023 +0400
+++ b/src/event/quic/ngx_event_quic.h	Wed Sep 13 17:59:37 2023 +0400
@@ -67,7 +67,8 @@ typedef struct {
     ngx_flag_t                     retry;
     ngx_flag_t                     gso_enabled;
     ngx_flag_t                     disable_active_migration;
-    ngx_msec_t                     timeout;
+    ngx_msec_t                     handshake_timeout;
+    ngx_msec_t                     idle_timeout;
     ngx_str_t                      host_key;
     size_t                         stream_buffer_size;
     ngx_uint_t                     max_concurrent_streams_bidi;
diff -r daf8f5ba23d8 -r ad3d34ddfdcc src/event/quic/ngx_event_quic_streams.c
--- a/src/event/quic/ngx_event_quic_streams.c	Fri Sep 01 20:31:46 2023 +0400
+++ b/src/event/quic/ngx_event_quic_streams.c	Wed Sep 13 17:59:37 2023 +0400
@@ -630,6 +630,10 @@ ngx_quic_do_init_streams(ngx_connection_
 
     qc->streams.initialized = 1;
 
+    if (!qc->closing && qc->close.timer_set) {
+        ngx_del_timer(&qc->close);
+    }
+
     return NGX_OK;
 }
 
diff -r daf8f5ba23d8 -r ad3d34ddfdcc src/event/quic/ngx_event_quic_transport.c
--- a/src/event/quic/ngx_event_quic_transport.c	Fri Sep 01 20:31:46 2023 +0400
+++ b/src/event/quic/ngx_event_quic_transport.c	Wed Sep 13 17:59:37 2023 +0400
@@ -1985,7 +1985,7 @@ ngx_quic_init_transport_params(ngx_quic_
      *     tp->preferred_address = NULL
      */
 
-    tp->max_idle_timeout = qcf->timeout;
+    tp->max_idle_timeout = qcf->idle_timeout;
 
     tp->max_udp_payload_size = NGX_QUIC_MAX_UDP_PAYLOAD_SIZE;
 
diff -r daf8f5ba23d8 -r ad3d34ddfdcc src/http/v3/ngx_http_v3_module.c
--- a/src/http/v3/ngx_http_v3_module.c	Fri Sep 01 20:31:46 2023 +0400
+++ b/src/http/v3/ngx_http_v3_module.c	Wed Sep 13 17:59:37 2023 +0400
@@ -192,7 +192,7 @@ ngx_http_v3_create_srv_conf(ngx_conf_t *
      *     h3scf->quic.host_key = { 0, NULL }
      *     h3scf->quic.stream_reject_code_uni = 0;
      *     h3scf->quic.disable_active_migration = 0;
-     *     h3scf->quic.timeout = 0;
+     *     h3scf->quic.idle_timeout = 0;
      *     h3scf->max_blocked_streams = 0;
      */
 
@@ -223,7 +223,8 @@ ngx_http_v3_merge_srv_conf(ngx_conf_t *c
     ngx_http_v3_srv_conf_t *prev = parent;
     ngx_http_v3_srv_conf_t *conf = child;
 
-    ngx_http_ssl_srv_conf_t  *sscf;
+    ngx_http_ssl_srv_conf_t   *sscf;
+    ngx_http_core_srv_conf_t  *cscf;
 
     ngx_conf_merge_value(conf->enable, prev->enable, 1);
 
@@ -281,6 +282,9 @@ ngx_http_v3_merge_srv_conf(ngx_conf_t *c
         return NGX_CONF_ERROR;
     }
 
+    cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module);
+    conf->quic.handshake_timeout = cscf->client_header_timeout;
+
     sscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_ssl_module);
     conf->quic.ssl = &sscf->ssl;
 
diff -r daf8f5ba23d8 -r ad3d34ddfdcc src/http/v3/ngx_http_v3_request.c
--- a/src/http/v3/ngx_http_v3_request.c	Fri Sep 01 20:31:46 2023 +0400
+++ b/src/http/v3/ngx_http_v3_request.c	Wed Sep 13 17:59:37 2023 +0400
@@ -58,18 +58,15 @@ static const struct {
 void
 ngx_http_v3_init_stream(ngx_connection_t *c)
 {
-    ngx_http_v3_session_t     *h3c;
     ngx_http_connection_t     *hc, *phc;
     ngx_http_v3_srv_conf_t    *h3scf;
     ngx_http_core_loc_conf_t  *clcf;
-    ngx_http_core_srv_conf_t  *cscf;
 
     hc = c->data;
 
     hc->ssl = 1;
 
     clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module);
-    cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module);
     h3scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v3_module);
 
     if (c->quic == NULL) {
@@ -78,10 +75,7 @@ ngx_http_v3_init_stream(ngx_connection_t
             return;
         }
 
-        h3c = hc->v3_session;
-        ngx_add_timer(&h3c->keepalive, cscf->client_header_timeout);
-
-        h3scf->quic.timeout = clcf->keepalive_timeout;
+        h3scf->quic.idle_timeout = clcf->keepalive_timeout;
         ngx_quic_run(c, &h3scf->quic);
         return;
     }


More information about the nginx-devel mailing list