]> git.kaiwu.me - nginx.git/commitdiff
QUIC: the "quic_gso" directive.
authorVladimir Homutov <vl@nginx.com>
Tue, 20 Jul 2021 09:37:12 +0000 (12:37 +0300)
committerVladimir Homutov <vl@nginx.com>
Tue, 20 Jul 2021 09:37:12 +0000 (12:37 +0300)
The directive enables usage of UDP segmentation offloading by quic.
By default, gso is disabled since it is not always operational when
detected (depends on interface configuration).

src/event/quic/ngx_event_quic.h
src/event/quic/ngx_event_quic_output.c
src/http/modules/ngx_http_quic_module.c
src/stream/ngx_stream_quic_module.c

index fe0f7fef302cec2e3f7b9d9760a9462bbfc01a2f..d3429cbe457b1aabacaec368d0e0e15d527598da 100644 (file)
@@ -59,6 +59,7 @@ typedef struct {
     ngx_ssl_t                 *ssl;
     ngx_quic_tp_t              tp;
     ngx_flag_t                 retry;
+    ngx_flag_t                 gso_enabled;
     ngx_flag_t                 require_alpn;
     ngx_str_t                  host_key;
     u_char                     av_token_key[NGX_QUIC_AV_KEY_LEN];
index ce3805c8fec9eaa7a2e8947a71bdf8e54e32ea70..dc4cf59be28dbbffbfcc828496ad8e9bc60b8a1f 100644 (file)
@@ -212,13 +212,17 @@ ngx_quic_allow_segmentation(ngx_connection_t *c, ngx_quic_socket_t *qsock)
     ngx_quic_send_ctx_t    *ctx;
     ngx_quic_connection_t  *qc;
 
+    qc = ngx_quic_get_connection(c);
+
+    if (!qc->conf->gso_enabled) {
+        return 0;
+    }
+
     if (qsock->path->state != NGX_QUIC_PATH_VALIDATED) {
         /* don't even try to be faster on non-validated paths */
         return 0;
     }
 
-    qc = ngx_quic_get_connection(c);
-
     ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial);
     if (!ngx_queue_empty(&ctx->frames)) {
         return 0;
index d933dd1f9a8b02aabc46a015ac3604d73e2573a7..ab84583f22058ceaae379773c45da4906c716545 100644 (file)
@@ -126,6 +126,13 @@ static ngx_command_t  ngx_http_quic_commands[] = {
       offsetof(ngx_quic_conf_t, retry),
       NULL },
 
+    { ngx_string("quic_gso"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_quic_conf_t, gso_enabled),
+      NULL },
+
     { ngx_string("quic_host_key"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
       ngx_http_quic_host_key,
@@ -290,6 +297,7 @@ ngx_http_quic_create_srv_conf(ngx_conf_t *cf)
     conf->tp.active_connection_id_limit = NGX_CONF_UNSET_UINT;
 
     conf->retry = NGX_CONF_UNSET;
+    conf->gso_enabled = NGX_CONF_UNSET;
     conf->require_alpn = 1;
 
     return conf;
@@ -348,6 +356,7 @@ ngx_http_quic_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
                               prev->tp.active_connection_id_limit, 2);
 
     ngx_conf_merge_value(conf->retry, prev->retry, 0);
+    ngx_conf_merge_value(conf->gso_enabled, prev->gso_enabled, 0);
 
     ngx_conf_merge_str_value(conf->host_key, prev->host_key, "");
 
index 01caa95555bff41fef04973742333fe954c086e3..2cd811ad469ea1a03427289546609e88b9509c47 100644 (file)
@@ -128,6 +128,13 @@ static ngx_command_t  ngx_stream_quic_commands[] = {
       offsetof(ngx_quic_conf_t, retry),
       NULL },
 
+    { ngx_string("quic_gso"),
+      NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_STREAM_SRV_CONF_OFFSET,
+      offsetof(ngx_quic_conf_t, gso_enabled),
+      NULL },
+
     { ngx_string("quic_host_key"),
       NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
       ngx_stream_quic_host_key,
@@ -251,6 +258,7 @@ ngx_stream_quic_create_srv_conf(ngx_conf_t *cf)
     conf->tp.active_connection_id_limit = NGX_CONF_UNSET_UINT;
 
     conf->retry = NGX_CONF_UNSET;
+    conf->gso_enabled = NGX_CONF_UNSET;
 
     return conf;
 }
@@ -308,6 +316,7 @@ ngx_stream_quic_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
                               prev->tp.active_connection_id_limit, 2);
 
     ngx_conf_merge_value(conf->retry, prev->retry, 0);
+    ngx_conf_merge_value(conf->gso_enabled, prev->gso_enabled, 0);
 
     ngx_conf_merge_str_value(conf->host_key, prev->host_key, "");