aboutsummaryrefslogtreecommitdiff
path: root/src/http/v3/ngx_http_v3_module.c
diff options
context:
space:
mode:
authorVladimir Homutov <vl@nginx.com>2020-03-20 13:47:44 +0300
committerVladimir Homutov <vl@nginx.com>2020-03-20 13:47:44 +0300
commit30de0ca52dc7d460a184781e82288b0e2723ebce (patch)
treec236f1c88a7c5149483cf1cff86208709a4cd949 /src/http/v3/ngx_http_v3_module.c
parent5f9b188c21627737000238280140c371c9f33272 (diff)
downloadnginx-30de0ca52dc7d460a184781e82288b0e2723ebce.tar.gz
nginx-30de0ca52dc7d460a184781e82288b0e2723ebce.zip
Configurable transport parameters.
- integer parameters can be configured using the following directives: quic_max_idle_timeout quic_max_ack_delay quic_max_packet_size quic_initial_max_data quic_initial_max_stream_data_bidi_local quic_initial_max_stream_data_bidi_remote quic_initial_max_stream_data_uni quic_initial_max_streams_bidi quic_initial_max_streams_uni quic_ack_delay_exponent quic_active_migration quic_active_connection_id_limit - only following parameters are actually sent: active_connection_id_limit initial_max_streams_uni initial_max_streams_bidi initial_max_stream_data_bidi_local initial_max_stream_data_bidi_remote initial_max_stream_data_uni (other parameters are to be added into ngx_quic_create_transport_params() function as needed, should be easy now) - draft 24 and draft 27 are now supported (at compile-time using quic_version macro)
Diffstat (limited to 'src/http/v3/ngx_http_v3_module.c')
-rw-r--r--src/http/v3/ngx_http_v3_module.c182
1 files changed, 180 insertions, 2 deletions
diff --git a/src/http/v3/ngx_http_v3_module.c b/src/http/v3/ngx_http_v3_module.c
index af310bd44..6d3f34d41 100644
--- a/src/http/v3/ngx_http_v3_module.c
+++ b/src/http/v3/ngx_http_v3_module.c
@@ -11,10 +11,100 @@
static ngx_command_t ngx_http_v3_commands[] = {
+
+ { ngx_string("quic_max_idle_timeout"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_msec_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.max_idle_timeout),
+ NULL },
+
+ { ngx_string("quic_max_ack_delay"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_msec_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.max_ack_delay),
+ NULL },
+
+ { ngx_string("quic_max_packet_size"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.max_packet_size),
+ NULL },
+
+ { ngx_string("quic_initial_max_data"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.initial_max_data),
+ NULL },
+
+ { ngx_string("quic_initial_max_stream_data_bidi_local"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.initial_max_stream_data_bidi_local),
+ NULL },
+
+ { ngx_string("quic_initial_max_stream_data_bidi_remote"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.initial_max_stream_data_bidi_remote),
+ NULL },
+
+ { ngx_string("quic_initial_max_stream_data_uni"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.initial_max_stream_data_uni),
+ NULL },
+
+ { ngx_string("quic_initial_max_streams_bidi"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.initial_max_streams_bidi),
+ NULL },
+
+ { ngx_string("quic_initial_max_streams_uni"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.initial_max_streams_uni),
+ NULL },
+
+ { ngx_string("quic_ack_delay_exponent"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.ack_delay_exponent),
+ NULL },
+
+ { ngx_string("quic_active_migration"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.disable_active_migration),
+ NULL },
+
+ { ngx_string("quic_active_connection_id_limit"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_num_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, quic.active_connection_id_limit),
+ NULL },
+
ngx_null_command
};
+static void *ngx_http_v3_create_srv_conf(ngx_conf_t *cf);
+static char *ngx_http_v3_merge_srv_conf(ngx_conf_t *cf,
+ void *parent, void *child);
+
+
static ngx_http_module_t ngx_http_v3_module_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */
@@ -22,8 +112,8 @@ static ngx_http_module_t ngx_http_v3_module_ctx = {
NULL, /* create main configuration */
NULL, /* init main configuration */
- NULL, /* create server configuration */
- NULL, /* merge server configuration */
+ ngx_http_v3_create_srv_conf, /* create server configuration */
+ ngx_http_v3_merge_srv_conf, /* merge server configuration */
NULL, /* create location configuration */
NULL /* merge location configuration */
@@ -44,3 +134,91 @@ ngx_module_t ngx_http_v3_module = {
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
+
+
+static void *
+ngx_http_v3_create_srv_conf(ngx_conf_t *cf)
+{
+ ngx_http_v3_srv_conf_t *v3cf;
+
+ v3cf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v3_srv_conf_t));
+ if (v3cf == NULL) {
+ return NULL;
+ }
+
+ /*
+ * set by ngx_pcalloc():
+ * v3cf->quic.original_connection_id = 0;
+ * v3cf->quic.stateless_reset_token = { 0 }
+ * conf->quic.preferred_address = NULL
+ */
+
+ v3cf->quic.max_idle_timeout = NGX_CONF_UNSET_MSEC;
+ v3cf->quic.max_ack_delay = NGX_CONF_UNSET_MSEC;
+
+ v3cf->quic.max_packet_size = NGX_CONF_UNSET_UINT;
+ v3cf->quic.initial_max_data = NGX_CONF_UNSET_UINT;
+ v3cf->quic.initial_max_stream_data_bidi_local = NGX_CONF_UNSET_UINT;
+ v3cf->quic.initial_max_stream_data_bidi_remote = NGX_CONF_UNSET_UINT;
+ v3cf->quic.initial_max_stream_data_uni = NGX_CONF_UNSET_UINT;
+ v3cf->quic.initial_max_streams_bidi = NGX_CONF_UNSET_UINT;
+ v3cf->quic.initial_max_streams_uni = NGX_CONF_UNSET_UINT;
+ v3cf->quic.ack_delay_exponent = NGX_CONF_UNSET_UINT;
+ v3cf->quic.disable_active_migration = NGX_CONF_UNSET_UINT;
+ v3cf->quic.active_connection_id_limit = NGX_CONF_UNSET_UINT;
+
+ return v3cf;
+}
+
+
+static char *
+ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
+{
+ ngx_http_v3_srv_conf_t *prev = parent;
+ ngx_http_v3_srv_conf_t *conf = child;
+
+ ngx_conf_merge_msec_value(conf->quic.max_idle_timeout,
+ prev->quic.max_idle_timeout, 10000);
+
+ // > 2 ^ 14 is invalid
+ ngx_conf_merge_msec_value(conf->quic.max_ack_delay,
+ prev->quic.max_ack_delay, 25);
+
+ // < 1200 is invalid
+ ngx_conf_merge_uint_value(conf->quic.max_packet_size,
+ prev->quic.max_packet_size, 65527);
+
+ ngx_conf_merge_uint_value(conf->quic.initial_max_data,
+ prev->quic.initial_max_data, 10000000);
+
+ ngx_conf_merge_uint_value(conf->quic.initial_max_stream_data_bidi_local,
+ prev->quic.initial_max_stream_data_bidi_local,
+ 255);
+
+ ngx_conf_merge_uint_value(conf->quic.initial_max_stream_data_bidi_remote,
+ prev->quic.initial_max_stream_data_bidi_remote,
+ 255);
+
+ ngx_conf_merge_uint_value(conf->quic.initial_max_stream_data_uni,
+ prev->quic.initial_max_stream_data_uni, 255);
+
+ ngx_conf_merge_uint_value(conf->quic.initial_max_streams_bidi,
+ prev->quic.initial_max_streams_bidi, 16);
+
+ ngx_conf_merge_uint_value(conf->quic.initial_max_streams_uni,
+ prev->quic.initial_max_streams_uni, 16);
+
+ // > 20 is invalid
+ ngx_conf_merge_uint_value(conf->quic.ack_delay_exponent,
+ prev->quic.ack_delay_exponent, 3);
+
+ ngx_conf_merge_uint_value(conf->quic.disable_active_migration,
+ prev->quic.disable_active_migration, 1);
+
+ // < 2 is invalid
+ ngx_conf_merge_uint_value(conf->quic.active_connection_id_limit,
+ prev->quic.active_connection_id_limit, 2);
+
+ return NGX_CONF_OK;
+}
+