comparison src/http/v3/ngx_http_v3_module.c @ 8924:d6ef13c5fd8e quic

QUIC: simplified configuration. Directives that set transport parameters are removed from the configuration. Corresponding values are derived from the quic configuration or initialized to default. Whenever possible, quic configuration parameters are taken from higher-level protocol settings, i.e. HTTP/3.
author Vladimir Homutov <vl@nginx.com>
date Mon, 06 Dec 2021 15:19:54 +0300
parents 651cc905b7c2
children 7106a918a277
comparison
equal deleted inserted replaced
8923:651cc905b7c2 8924:d6ef13c5fd8e
14 ngx_http_variable_value_t *v, uintptr_t data); 14 ngx_http_variable_value_t *v, uintptr_t data);
15 static ngx_int_t ngx_http_v3_add_variables(ngx_conf_t *cf); 15 static ngx_int_t ngx_http_v3_add_variables(ngx_conf_t *cf);
16 static void *ngx_http_v3_create_srv_conf(ngx_conf_t *cf); 16 static void *ngx_http_v3_create_srv_conf(ngx_conf_t *cf);
17 static char *ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent, 17 static char *ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent,
18 void *child); 18 void *child);
19 static char *ngx_http_quic_max_ack_delay(ngx_conf_t *cf, void *post, 19 static char *ngx_http_quic_mtu(ngx_conf_t *cf, void *post,
20 void *data);
21 static char *ngx_http_quic_max_udp_payload_size(ngx_conf_t *cf, void *post,
22 void *data); 20 void *data);
23 static char *ngx_http_quic_host_key(ngx_conf_t *cf, ngx_command_t *cmd, 21 static char *ngx_http_quic_host_key(ngx_conf_t *cf, ngx_command_t *cmd,
24 void *conf); 22 void *conf);
25 static void *ngx_http_v3_create_loc_conf(ngx_conf_t *cf); 23 static void *ngx_http_v3_create_loc_conf(ngx_conf_t *cf);
26 static char *ngx_http_v3_merge_loc_conf(ngx_conf_t *cf, void *parent, 24 static char *ngx_http_v3_merge_loc_conf(ngx_conf_t *cf, void *parent,
27 void *child); 25 void *child);
28 static char *ngx_http_v3_push(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); 26 static char *ngx_http_v3_push(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
29 27
30 28
31 static ngx_conf_post_t ngx_http_quic_max_ack_delay_post = 29 static ngx_conf_post_t ngx_http_quic_mtu_post =
32 { ngx_http_quic_max_ack_delay }; 30 { ngx_http_quic_mtu };
33 static ngx_conf_post_t ngx_http_quic_max_udp_payload_size_post =
34 { ngx_http_quic_max_udp_payload_size };
35 static ngx_conf_num_bounds_t ngx_http_quic_ack_delay_exponent_bounds =
36 { ngx_conf_check_num_bounds, 0, 20 };
37 static ngx_conf_num_bounds_t ngx_http_quic_active_connection_id_limit_bounds =
38 { ngx_conf_check_num_bounds, 2, -1 };
39 31
40 32
41 static ngx_command_t ngx_http_v3_commands[] = { 33 static ngx_command_t ngx_http_v3_commands[] = {
42
43 { ngx_string("http3_max_table_capacity"),
44 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
45 ngx_conf_set_size_slot,
46 NGX_HTTP_SRV_CONF_OFFSET,
47 offsetof(ngx_http_v3_srv_conf_t, max_table_capacity),
48 NULL },
49
50 { ngx_string("http3_max_blocked_streams"),
51 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
52 ngx_conf_set_num_slot,
53 NGX_HTTP_SRV_CONF_OFFSET,
54 offsetof(ngx_http_v3_srv_conf_t, max_blocked_streams),
55 NULL },
56 34
57 { ngx_string("http3_max_concurrent_pushes"), 35 { ngx_string("http3_max_concurrent_pushes"),
58 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 36 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
59 ngx_conf_set_num_slot, 37 ngx_conf_set_num_slot,
60 NGX_HTTP_SRV_CONF_OFFSET, 38 NGX_HTTP_SRV_CONF_OFFSET,
61 offsetof(ngx_http_v3_srv_conf_t, max_concurrent_pushes), 39 offsetof(ngx_http_v3_srv_conf_t, max_concurrent_pushes),
62 NULL }, 40 NULL },
63 41
64 { ngx_string("http3_max_uni_streams"), 42 { ngx_string("http3_max_concurrent_streams"),
65 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 43 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
66 ngx_conf_set_num_slot, 44 ngx_conf_set_num_slot,
67 NGX_HTTP_SRV_CONF_OFFSET, 45 NGX_HTTP_SRV_CONF_OFFSET,
68 offsetof(ngx_http_v3_srv_conf_t, max_uni_streams), 46 offsetof(ngx_http_v3_srv_conf_t, max_concurrent_streams),
69 NULL }, 47 NULL },
70 48
71 #if (NGX_HTTP_V3_HQ) 49 #if (NGX_HTTP_V3_HQ)
72 { ngx_string("http3_hq"), 50 { ngx_string("http3_hq"),
73 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, 51 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
89 ngx_conf_set_flag_slot, 67 ngx_conf_set_flag_slot,
90 NGX_HTTP_LOC_CONF_OFFSET, 68 NGX_HTTP_LOC_CONF_OFFSET,
91 offsetof(ngx_http_v3_loc_conf_t, push_preload), 69 offsetof(ngx_http_v3_loc_conf_t, push_preload),
92 NULL }, 70 NULL },
93 71
94 { ngx_string("quic_max_idle_timeout"), 72 { ngx_string("http3_stream_buffer_size"),
95 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
96 ngx_conf_set_msec_slot,
97 NGX_HTTP_SRV_CONF_OFFSET,
98 offsetof(ngx_http_v3_srv_conf_t, quic.tp.max_idle_timeout),
99 NULL },
100
101 { ngx_string("quic_max_ack_delay"),
102 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
103 ngx_conf_set_msec_slot,
104 NGX_HTTP_SRV_CONF_OFFSET,
105 offsetof(ngx_http_v3_srv_conf_t, quic.tp.max_ack_delay),
106 &ngx_http_quic_max_ack_delay_post },
107
108 { ngx_string("quic_max_udp_payload_size"),
109 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 73 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
110 ngx_conf_set_size_slot, 74 ngx_conf_set_size_slot,
111 NGX_HTTP_SRV_CONF_OFFSET, 75 NGX_HTTP_SRV_CONF_OFFSET,
112 offsetof(ngx_http_v3_srv_conf_t, quic.tp.max_udp_payload_size), 76 offsetof(ngx_http_v3_srv_conf_t, quic.stream_buffer_size),
113 &ngx_http_quic_max_udp_payload_size_post }, 77 NULL },
114
115 { ngx_string("quic_initial_max_data"),
116 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
117 ngx_conf_set_size_slot,
118 NGX_HTTP_SRV_CONF_OFFSET,
119 offsetof(ngx_http_v3_srv_conf_t, quic.tp.initial_max_data),
120 NULL },
121
122 { ngx_string("quic_initial_max_stream_data_bidi_local"),
123 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
124 ngx_conf_set_size_slot,
125 NGX_HTTP_SRV_CONF_OFFSET,
126 offsetof(ngx_http_v3_srv_conf_t,
127 quic.tp.initial_max_stream_data_bidi_local),
128 NULL },
129
130 { ngx_string("quic_initial_max_stream_data_bidi_remote"),
131 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
132 ngx_conf_set_size_slot,
133 NGX_HTTP_SRV_CONF_OFFSET,
134 offsetof(ngx_http_v3_srv_conf_t,
135 quic.tp.initial_max_stream_data_bidi_remote),
136 NULL },
137
138 { ngx_string("quic_initial_max_stream_data_uni"),
139 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
140 ngx_conf_set_size_slot,
141 NGX_HTTP_SRV_CONF_OFFSET,
142 offsetof(ngx_http_v3_srv_conf_t, quic.tp.initial_max_stream_data_uni),
143 NULL },
144
145 { ngx_string("quic_initial_max_streams_bidi"),
146 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
147 ngx_conf_set_num_slot,
148 NGX_HTTP_SRV_CONF_OFFSET,
149 offsetof(ngx_http_v3_srv_conf_t, quic.tp.initial_max_streams_bidi),
150 NULL },
151
152 { ngx_string("quic_initial_max_streams_uni"),
153 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
154 ngx_conf_set_num_slot,
155 NGX_HTTP_SRV_CONF_OFFSET,
156 offsetof(ngx_http_v3_srv_conf_t, quic.tp.initial_max_streams_uni),
157 NULL },
158
159 { ngx_string("quic_ack_delay_exponent"),
160 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
161 ngx_conf_set_num_slot,
162 NGX_HTTP_SRV_CONF_OFFSET,
163 offsetof(ngx_http_v3_srv_conf_t, quic.tp.ack_delay_exponent),
164 &ngx_http_quic_ack_delay_exponent_bounds },
165
166 { ngx_string("quic_disable_active_migration"),
167 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
168 ngx_conf_set_flag_slot,
169 NGX_HTTP_SRV_CONF_OFFSET,
170 offsetof(ngx_http_v3_srv_conf_t, quic.tp.disable_active_migration),
171 NULL },
172
173 { ngx_string("quic_active_connection_id_limit"),
174 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
175 ngx_conf_set_num_slot,
176 NGX_HTTP_SRV_CONF_OFFSET,
177 offsetof(ngx_http_v3_srv_conf_t, quic.tp.active_connection_id_limit),
178 &ngx_http_quic_active_connection_id_limit_bounds },
179 78
180 { ngx_string("quic_retry"), 79 { ngx_string("quic_retry"),
181 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, 80 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
182 ngx_conf_set_flag_slot, 81 ngx_conf_set_flag_slot,
183 NGX_HTTP_SRV_CONF_OFFSET, 82 NGX_HTTP_SRV_CONF_OFFSET,
188 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, 87 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
189 ngx_conf_set_flag_slot, 88 ngx_conf_set_flag_slot,
190 NGX_HTTP_SRV_CONF_OFFSET, 89 NGX_HTTP_SRV_CONF_OFFSET,
191 offsetof(ngx_http_v3_srv_conf_t, quic.gso_enabled), 90 offsetof(ngx_http_v3_srv_conf_t, quic.gso_enabled),
192 NULL }, 91 NULL },
92
93 { ngx_string("quic_mtu"),
94 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
95 ngx_conf_set_size_slot,
96 NGX_HTTP_SRV_CONF_OFFSET,
97 offsetof(ngx_http_v3_srv_conf_t, quic.mtu),
98 &ngx_http_quic_mtu_post },
193 99
194 { ngx_string("quic_host_key"), 100 { ngx_string("quic_host_key"),
195 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 101 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
196 ngx_http_quic_host_key, 102 ngx_http_quic_host_key,
197 NGX_HTTP_SRV_CONF_OFFSET, 103 NGX_HTTP_SRV_CONF_OFFSET,
311 } 217 }
312 218
313 /* 219 /*
314 * set by ngx_pcalloc(): 220 * set by ngx_pcalloc():
315 * 221 *
316 * h3scf->quic.tp.original_dcid = { 0, NULL };
317 * h3scf->quic.tp.initial_scid = { 0, NULL };
318 * h3scf->quic.tp.retry_scid = { 0, NULL };
319 * h3scf->quic.tp.sr_token = { 0 }
320 * h3scf->quic.tp.sr_enabled = 0
321 * h3scf->quic.tp.preferred_address = NULL
322 * h3scf->quic.host_key = { 0, NULL } 222 * h3scf->quic.host_key = { 0, NULL }
323 * h3scf->quic.stream_reject_code_uni = 0; 223 * h3scf->quic.stream_reject_code_uni = 0;
224 * h3scf->quic.disable_active_migration = 0;
225 * h3scf->quic.timeout = 0;
226 * h3scf->max_blocked_streams = 0;
324 */ 227 */
325 228 h3scf->max_table_capacity = NGX_HTTP_V3_MAX_TABLE_CAPACITY;
326 h3scf->max_table_capacity = NGX_CONF_UNSET_SIZE;
327 h3scf->max_blocked_streams = NGX_CONF_UNSET_UINT;
328 h3scf->max_concurrent_pushes = NGX_CONF_UNSET_UINT; 229 h3scf->max_concurrent_pushes = NGX_CONF_UNSET_UINT;
329 h3scf->max_uni_streams = NGX_CONF_UNSET_UINT; 230 h3scf->max_concurrent_streams = NGX_CONF_UNSET_UINT;
330 #if (NGX_HTTP_V3_HQ) 231 #if (NGX_HTTP_V3_HQ)
331 h3scf->hq = NGX_CONF_UNSET; 232 h3scf->hq = NGX_CONF_UNSET;
332 #endif 233 #endif
333 234
334 h3scf->quic.tp.max_idle_timeout = NGX_CONF_UNSET_MSEC; 235 h3scf->quic.mtu = NGX_CONF_UNSET_SIZE;
335 h3scf->quic.tp.max_ack_delay = NGX_CONF_UNSET_MSEC; 236 h3scf->quic.stream_buffer_size = NGX_CONF_UNSET_SIZE;
336 h3scf->quic.tp.max_udp_payload_size = NGX_CONF_UNSET_SIZE; 237 h3scf->quic.max_concurrent_streams_bidi = NGX_CONF_UNSET_UINT;
337 h3scf->quic.tp.initial_max_data = NGX_CONF_UNSET_SIZE; 238 h3scf->quic.max_concurrent_streams_uni = NGX_HTTP_V3_MAX_UNI_STREAMS;
338 h3scf->quic.tp.initial_max_stream_data_bidi_local = NGX_CONF_UNSET_SIZE;
339 h3scf->quic.tp.initial_max_stream_data_bidi_remote = NGX_CONF_UNSET_SIZE;
340 h3scf->quic.tp.initial_max_stream_data_uni = NGX_CONF_UNSET_SIZE;
341 h3scf->quic.tp.initial_max_streams_bidi = NGX_CONF_UNSET_UINT;
342 h3scf->quic.tp.initial_max_streams_uni = NGX_CONF_UNSET_UINT;
343 h3scf->quic.tp.ack_delay_exponent = NGX_CONF_UNSET_UINT;
344 h3scf->quic.tp.disable_active_migration = NGX_CONF_UNSET;
345 h3scf->quic.tp.active_connection_id_limit = NGX_CONF_UNSET_UINT;
346
347 h3scf->quic.retry = NGX_CONF_UNSET; 239 h3scf->quic.retry = NGX_CONF_UNSET;
348 h3scf->quic.gso_enabled = NGX_CONF_UNSET; 240 h3scf->quic.gso_enabled = NGX_CONF_UNSET;
349 h3scf->quic.stream_close_code = NGX_HTTP_V3_ERR_NO_ERROR; 241 h3scf->quic.stream_close_code = NGX_HTTP_V3_ERR_NO_ERROR;
350 h3scf->quic.stream_reject_code_bidi = NGX_HTTP_V3_ERR_REQUEST_REJECTED; 242 h3scf->quic.stream_reject_code_bidi = NGX_HTTP_V3_ERR_REQUEST_REJECTED;
351 243
359 ngx_http_v3_srv_conf_t *prev = parent; 251 ngx_http_v3_srv_conf_t *prev = parent;
360 ngx_http_v3_srv_conf_t *conf = child; 252 ngx_http_v3_srv_conf_t *conf = child;
361 253
362 ngx_http_ssl_srv_conf_t *sscf; 254 ngx_http_ssl_srv_conf_t *sscf;
363 255
364 ngx_conf_merge_size_value(conf->max_table_capacity,
365 prev->max_table_capacity, 16384);
366
367 ngx_conf_merge_uint_value(conf->max_blocked_streams,
368 prev->max_blocked_streams, 16);
369
370 ngx_conf_merge_uint_value(conf->max_concurrent_pushes, 256 ngx_conf_merge_uint_value(conf->max_concurrent_pushes,
371 prev->max_concurrent_pushes, 10); 257 prev->max_concurrent_pushes, 10);
372 258
373 ngx_conf_merge_uint_value(conf->max_uni_streams, 259 ngx_conf_merge_uint_value(conf->max_concurrent_streams,
374 prev->max_uni_streams, 3); 260 prev->max_concurrent_streams, 128);
261
262 conf->max_blocked_streams = conf->max_concurrent_streams;
375 263
376 #if (NGX_HTTP_V3_HQ) 264 #if (NGX_HTTP_V3_HQ)
377 ngx_conf_merge_value(conf->hq, prev->hq, 0); 265 ngx_conf_merge_value(conf->hq, prev->hq, 0);
378 #endif 266 #endif
379 267
380 ngx_conf_merge_msec_value(conf->quic.tp.max_idle_timeout, 268
381 prev->quic.tp.max_idle_timeout, 60000); 269 ngx_conf_merge_size_value(conf->quic.mtu, prev->quic.mtu,
382
383 ngx_conf_merge_msec_value(conf->quic.tp.max_ack_delay,
384 prev->quic.tp.max_ack_delay,
385 NGX_QUIC_DEFAULT_MAX_ACK_DELAY);
386
387 ngx_conf_merge_size_value(conf->quic.tp.max_udp_payload_size,
388 prev->quic.tp.max_udp_payload_size,
389 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE); 270 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
390 271
391 ngx_conf_merge_size_value(conf->quic.tp.initial_max_data, 272 ngx_conf_merge_size_value(conf->quic.stream_buffer_size,
392 prev->quic.tp.initial_max_data, 273 prev->quic.stream_buffer_size,
393 16 * NGX_QUIC_STREAM_BUFSIZE); 274 65536);
394 275
395 ngx_conf_merge_size_value(conf->quic.tp.initial_max_stream_data_bidi_local, 276 conf->quic.max_concurrent_streams_bidi = conf->max_concurrent_streams;
396 prev->quic.tp.initial_max_stream_data_bidi_local,
397 NGX_QUIC_STREAM_BUFSIZE);
398
399 ngx_conf_merge_size_value(conf->quic.tp.initial_max_stream_data_bidi_remote,
400 prev->quic.tp.initial_max_stream_data_bidi_remote,
401 NGX_QUIC_STREAM_BUFSIZE);
402
403 ngx_conf_merge_size_value(conf->quic.tp.initial_max_stream_data_uni,
404 prev->quic.tp.initial_max_stream_data_uni,
405 NGX_QUIC_STREAM_BUFSIZE);
406
407 ngx_conf_merge_uint_value(conf->quic.tp.initial_max_streams_bidi,
408 prev->quic.tp.initial_max_streams_bidi, 16);
409
410 ngx_conf_merge_uint_value(conf->quic.tp.initial_max_streams_uni,
411 prev->quic.tp.initial_max_streams_uni, 3);
412
413 ngx_conf_merge_uint_value(conf->quic.tp.ack_delay_exponent,
414 prev->quic.tp.ack_delay_exponent,
415 NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT);
416
417 ngx_conf_merge_value(conf->quic.tp.disable_active_migration,
418 prev->quic.tp.disable_active_migration, 0);
419
420 ngx_conf_merge_uint_value(conf->quic.tp.active_connection_id_limit,
421 prev->quic.tp.active_connection_id_limit, 2);
422 277
423 ngx_conf_merge_value(conf->quic.retry, prev->quic.retry, 0); 278 ngx_conf_merge_value(conf->quic.retry, prev->quic.retry, 0);
424 ngx_conf_merge_value(conf->quic.gso_enabled, prev->quic.gso_enabled, 0); 279 ngx_conf_merge_value(conf->quic.gso_enabled, prev->quic.gso_enabled, 0);
425 280
426 ngx_conf_merge_str_value(conf->quic.host_key, prev->quic.host_key, ""); 281 ngx_conf_merge_str_value(conf->quic.host_key, prev->quic.host_key, "");
463 return NGX_CONF_OK; 318 return NGX_CONF_OK;
464 } 319 }
465 320
466 321
467 static char * 322 static char *
468 ngx_http_quic_max_ack_delay(ngx_conf_t *cf, void *post, void *data) 323 ngx_http_quic_mtu(ngx_conf_t *cf, void *post, void *data)
469 {
470 ngx_msec_t *sp = data;
471
472 if (*sp >= 16384) {
473 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
474 "\"quic_max_ack_delay\" must be less than 16384");
475
476 return NGX_CONF_ERROR;
477 }
478
479 return NGX_CONF_OK;
480 }
481
482
483 static char *
484 ngx_http_quic_max_udp_payload_size(ngx_conf_t *cf, void *post, void *data)
485 { 324 {
486 size_t *sp = data; 325 size_t *sp = data;
487 326
488 if (*sp < NGX_QUIC_MIN_INITIAL_SIZE 327 if (*sp < NGX_QUIC_MIN_INITIAL_SIZE
489 || *sp > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) 328 || *sp > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE)
490 { 329 {
491 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 330 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
492 "\"quic_max_udp_payload_size\" must be between " 331 "\"quic_mtu\" must be between %d and %d",
493 "%d and %d",
494 NGX_QUIC_MIN_INITIAL_SIZE, 332 NGX_QUIC_MIN_INITIAL_SIZE,
495 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE); 333 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
496 334
497 return NGX_CONF_ERROR; 335 return NGX_CONF_ERROR;
498 } 336 }