comparison src/http/v3/ngx_http_v3_module.c @ 8353:036164360fa9 quic

HTTP/3: directives with limited values converted to post handler. The purpose is to show a precise line number with an invalid value.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 22 Apr 2020 15:59:19 +0300
parents d73516830236
children 7ea34e13937f
comparison
equal deleted inserted replaced
8352:d73516830236 8353:036164360fa9
8 #include <ngx_config.h> 8 #include <ngx_config.h>
9 #include <ngx_core.h> 9 #include <ngx_core.h>
10 #include <ngx_http.h> 10 #include <ngx_http.h>
11 11
12 12
13 static char *ngx_http_v3_max_ack_delay(ngx_conf_t *cf, void *post, void *data);
14 static char *ngx_http_v3_max_packet_size(ngx_conf_t *cf, void *post,
15 void *data);
16
17
18 static ngx_conf_post_t ngx_http_v3_max_ack_delay_post =
19 { ngx_http_v3_max_ack_delay };
20 static ngx_conf_post_t ngx_http_v3_max_packet_size_post =
21 { ngx_http_v3_max_packet_size };
22 static ngx_conf_num_bounds_t ngx_http_v3_ack_delay_exponent_bounds =
23 { ngx_conf_check_num_bounds, 0, 20 };
24 static ngx_conf_num_bounds_t ngx_http_v3_active_connection_id_limit_bounds =
25 { ngx_conf_check_num_bounds, 2, -1 };
26
27
13 static ngx_command_t ngx_http_v3_commands[] = { 28 static ngx_command_t ngx_http_v3_commands[] = {
14 29
15 { ngx_string("quic_max_idle_timeout"), 30 { ngx_string("quic_max_idle_timeout"),
16 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 31 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
17 ngx_conf_set_msec_slot, 32 ngx_conf_set_msec_slot,
22 { ngx_string("quic_max_ack_delay"), 37 { ngx_string("quic_max_ack_delay"),
23 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 38 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
24 ngx_conf_set_msec_slot, 39 ngx_conf_set_msec_slot,
25 NGX_HTTP_SRV_CONF_OFFSET, 40 NGX_HTTP_SRV_CONF_OFFSET,
26 offsetof(ngx_http_v3_srv_conf_t, quic.max_ack_delay), 41 offsetof(ngx_http_v3_srv_conf_t, quic.max_ack_delay),
27 NULL }, 42 &ngx_http_v3_max_ack_delay_post },
28 43
29 { ngx_string("quic_max_packet_size"), 44 { ngx_string("quic_max_packet_size"),
30 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 45 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
31 ngx_conf_set_size_slot, 46 ngx_conf_set_size_slot,
32 NGX_HTTP_SRV_CONF_OFFSET, 47 NGX_HTTP_SRV_CONF_OFFSET,
33 offsetof(ngx_http_v3_srv_conf_t, quic.max_packet_size), 48 offsetof(ngx_http_v3_srv_conf_t, quic.max_packet_size),
34 NULL }, 49 &ngx_http_v3_max_packet_size_post },
35 50
36 { ngx_string("quic_initial_max_data"), 51 { ngx_string("quic_initial_max_data"),
37 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 52 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
38 ngx_conf_set_size_slot, 53 ngx_conf_set_size_slot,
39 NGX_HTTP_SRV_CONF_OFFSET, 54 NGX_HTTP_SRV_CONF_OFFSET,
78 { ngx_string("quic_ack_delay_exponent"), 93 { ngx_string("quic_ack_delay_exponent"),
79 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 94 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
80 ngx_conf_set_num_slot, 95 ngx_conf_set_num_slot,
81 NGX_HTTP_SRV_CONF_OFFSET, 96 NGX_HTTP_SRV_CONF_OFFSET,
82 offsetof(ngx_http_v3_srv_conf_t, quic.ack_delay_exponent), 97 offsetof(ngx_http_v3_srv_conf_t, quic.ack_delay_exponent),
83 NULL }, 98 &ngx_http_v3_ack_delay_exponent_bounds },
84 99
85 { ngx_string("quic_active_migration"), 100 { ngx_string("quic_active_migration"),
86 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 101 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
87 ngx_conf_set_num_slot, 102 ngx_conf_set_num_slot,
88 NGX_HTTP_SRV_CONF_OFFSET, 103 NGX_HTTP_SRV_CONF_OFFSET,
92 { ngx_string("quic_active_connection_id_limit"), 107 { ngx_string("quic_active_connection_id_limit"),
93 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 108 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
94 ngx_conf_set_num_slot, 109 ngx_conf_set_num_slot,
95 NGX_HTTP_SRV_CONF_OFFSET, 110 NGX_HTTP_SRV_CONF_OFFSET,
96 offsetof(ngx_http_v3_srv_conf_t, quic.active_connection_id_limit), 111 offsetof(ngx_http_v3_srv_conf_t, quic.active_connection_id_limit),
97 NULL }, 112 &ngx_http_v3_active_connection_id_limit_bounds },
98 113
99 ngx_null_command 114 ngx_null_command
100 }; 115 };
101 116
102 117
257 272
258 ngx_conf_merge_msec_value(conf->quic.max_ack_delay, 273 ngx_conf_merge_msec_value(conf->quic.max_ack_delay,
259 prev->quic.max_ack_delay, 274 prev->quic.max_ack_delay,
260 NGX_QUIC_DEFAULT_MAX_ACK_DELAY); 275 NGX_QUIC_DEFAULT_MAX_ACK_DELAY);
261 276
262 if (conf->quic.max_ack_delay > 16384) {
263 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
264 "\"quic_max_ack_delay\" greater than"
265 " 16384 is invalid");
266 return NGX_CONF_ERROR;
267 }
268
269 ngx_conf_merge_size_value(conf->quic.max_packet_size, 277 ngx_conf_merge_size_value(conf->quic.max_packet_size,
270 prev->quic.max_packet_size, 278 prev->quic.max_packet_size,
271 NGX_QUIC_DEFAULT_MAX_PACKET_SIZE); 279 NGX_QUIC_DEFAULT_MAX_PACKET_SIZE);
272 280
273 if (conf->quic.max_packet_size < 1200
274 || conf->quic.max_packet_size > 65527)
275 {
276 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
277 "\"quic_max_packet_size\" less than"
278 " 1200 or greater than 65527 is invalid");
279 return NGX_CONF_ERROR;
280 }
281
282 ngx_conf_merge_size_value(conf->quic.initial_max_data, 281 ngx_conf_merge_size_value(conf->quic.initial_max_data,
283 prev->quic.initial_max_data, 282 prev->quic.initial_max_data,
284 16 * NGX_QUIC_STREAM_BUFSIZE); 283 16 * NGX_QUIC_STREAM_BUFSIZE);
285 284
286 ngx_conf_merge_size_value(conf->quic.initial_max_stream_data_bidi_local, 285 ngx_conf_merge_size_value(conf->quic.initial_max_stream_data_bidi_local,
303 302
304 ngx_conf_merge_uint_value(conf->quic.ack_delay_exponent, 303 ngx_conf_merge_uint_value(conf->quic.ack_delay_exponent,
305 prev->quic.ack_delay_exponent, 304 prev->quic.ack_delay_exponent,
306 NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT); 305 NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT);
307 306
308 if (conf->quic.ack_delay_exponent > 20) {
309 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
310 "\"quic_ack_delay_exponent\" greater than"
311 " 20 is invalid");
312 return NGX_CONF_ERROR;
313 }
314
315 ngx_conf_merge_uint_value(conf->quic.disable_active_migration, 307 ngx_conf_merge_uint_value(conf->quic.disable_active_migration,
316 prev->quic.disable_active_migration, 1); 308 prev->quic.disable_active_migration, 1);
317 309
318 ngx_conf_merge_uint_value(conf->quic.active_connection_id_limit, 310 ngx_conf_merge_uint_value(conf->quic.active_connection_id_limit,
319 prev->quic.active_connection_id_limit, 2); 311 prev->quic.active_connection_id_limit, 2);
320 312
321 if (conf->quic.active_connection_id_limit < 2) { 313 return NGX_CONF_OK;
314 }
315
316
317 static char *
318 ngx_http_v3_max_ack_delay(ngx_conf_t *cf, void *post, void *data)
319 {
320 ngx_msec_t *sp = data;
321
322 if (*sp > 16384) {
322 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 323 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
323 "\"quic_active_connection_id_limit\" less than" 324 "\"quic_max_ack_delay\" must be less than 16384");
324 " 2 is invalid"); 325
325 return NGX_CONF_ERROR; 326 return NGX_CONF_ERROR;
326 } 327 }
327 328
328 return NGX_CONF_OK; 329 return NGX_CONF_OK;
329 } 330 }
330 331
332
333 static char *
334 ngx_http_v3_max_packet_size(ngx_conf_t *cf, void *post, void *data)
335 {
336 size_t *sp = data;
337
338 if (*sp < NGX_QUIC_MIN_INITIAL_SIZE
339 || *sp > NGX_QUIC_DEFAULT_MAX_PACKET_SIZE)
340 {
341 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
342 "\"quic_max_packet_size\" must be between %d and %d",
343 NGX_QUIC_MIN_INITIAL_SIZE,
344 NGX_QUIC_DEFAULT_MAX_PACKET_SIZE);
345
346 return NGX_CONF_ERROR;
347 }
348
349 return NGX_CONF_OK;
350 }