mirror of
https://github.com/nginx/nginx.git
synced 2025-02-25 18:55:26 -06:00
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)
This commit is contained in:
@@ -32,6 +32,8 @@ struct ngx_quic_connection_s {
|
|||||||
ngx_str_t dcid;
|
ngx_str_t dcid;
|
||||||
ngx_str_t token;
|
ngx_str_t token;
|
||||||
|
|
||||||
|
ngx_quic_tp_t tp;
|
||||||
|
|
||||||
/* current packet numbers for each namespace */
|
/* current packet numbers for each namespace */
|
||||||
ngx_uint_t initial_pn;
|
ngx_uint_t initial_pn;
|
||||||
ngx_uint_t handshake_pn;
|
ngx_uint_t handshake_pn;
|
||||||
@@ -67,7 +69,7 @@ static int ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn,
|
|||||||
|
|
||||||
|
|
||||||
static ngx_int_t ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
|
static ngx_int_t ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
|
||||||
ngx_quic_header_t *pkt);
|
ngx_quic_tp_t *tp, ngx_quic_header_t *pkt);
|
||||||
static ngx_int_t ngx_quic_init_connection(ngx_connection_t *c);
|
static ngx_int_t ngx_quic_init_connection(ngx_connection_t *c);
|
||||||
static void ngx_quic_handshake_handler(ngx_event_t *rev);
|
static void ngx_quic_handshake_handler(ngx_event_t *rev);
|
||||||
static void ngx_quic_close_connection(ngx_connection_t *c);
|
static void ngx_quic_close_connection(ngx_connection_t *c);
|
||||||
@@ -283,8 +285,8 @@ ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_msec_t timeout,
|
ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
|
||||||
ngx_connection_handler_pt handler)
|
ngx_msec_t timeout, ngx_connection_handler_pt handler)
|
||||||
{
|
{
|
||||||
ngx_buf_t *b;
|
ngx_buf_t *b;
|
||||||
ngx_quic_header_t pkt;
|
ngx_quic_header_t pkt;
|
||||||
@@ -302,7 +304,7 @@ ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_msec_t timeout,
|
|||||||
pkt.data = b->start;
|
pkt.data = b->start;
|
||||||
pkt.len = b->last - b->start;
|
pkt.len = b->last - b->start;
|
||||||
|
|
||||||
if (ngx_quic_new_connection(c, ssl, &pkt) != NGX_OK) {
|
if (ngx_quic_new_connection(c, ssl, tp, &pkt) != NGX_OK) {
|
||||||
ngx_quic_close_connection(c);
|
ngx_quic_close_connection(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -320,7 +322,7 @@ ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_msec_t timeout,
|
|||||||
|
|
||||||
|
|
||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
|
ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
|
||||||
ngx_quic_header_t *pkt)
|
ngx_quic_header_t *pkt)
|
||||||
{
|
{
|
||||||
ngx_quic_connection_t *qc;
|
ngx_quic_connection_t *qc;
|
||||||
@@ -354,6 +356,7 @@ ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
|
|||||||
|
|
||||||
c->quic = qc;
|
c->quic = qc;
|
||||||
qc->ssl = ssl;
|
qc->ssl = ssl;
|
||||||
|
qc->tp = *tp;
|
||||||
|
|
||||||
qc->dcid.len = pkt->dcid.len;
|
qc->dcid.len = pkt->dcid.len;
|
||||||
qc->dcid.data = ngx_pnalloc(c->pool, pkt->dcid.len);
|
qc->dcid.data = ngx_pnalloc(c->pool, pkt->dcid.len);
|
||||||
@@ -402,19 +405,11 @@ static ngx_int_t
|
|||||||
ngx_quic_init_connection(ngx_connection_t *c)
|
ngx_quic_init_connection(ngx_connection_t *c)
|
||||||
{
|
{
|
||||||
int n, sslerr;
|
int n, sslerr;
|
||||||
|
u_char *p;
|
||||||
|
ssize_t len;
|
||||||
ngx_ssl_conn_t *ssl_conn;
|
ngx_ssl_conn_t *ssl_conn;
|
||||||
ngx_quic_connection_t *qc;
|
ngx_quic_connection_t *qc;
|
||||||
|
|
||||||
static const uint8_t params[] =
|
|
||||||
"\x00\x29" /* parameters length: 41 bytes */
|
|
||||||
"\x00\x0e\x00\x01\x05" /* active connection id limit: 5 */
|
|
||||||
"\x00\x04\x00\x04\x80\x98\x96\x80" /* initial max data = 10000000 */
|
|
||||||
"\x00\x09\x00\x01\x03" /* initial max streams uni: 3 */
|
|
||||||
"\x00\x08\x00\x01\x10" /* initial max streams bidi: 16 */
|
|
||||||
"\x00\x05\x00\x02\x40\xff" /* initial max stream bidi local: 255 */
|
|
||||||
"\x00\x06\x00\x02\x40\xff" /* initial max stream bidi remote: 255 */
|
|
||||||
"\x00\x07\x00\x02\x40\xff"; /* initial max stream data uni: 255 */
|
|
||||||
|
|
||||||
qc = c->quic;
|
qc = c->quic;
|
||||||
|
|
||||||
if (ngx_ssl_create_connection(qc->ssl, c, NGX_SSL_BUFFER) != NGX_OK) {
|
if (ngx_ssl_create_connection(qc->ssl, c, NGX_SSL_BUFFER) != NGX_OK) {
|
||||||
@@ -429,7 +424,20 @@ ngx_quic_init_connection(ngx_connection_t *c)
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SSL_set_quic_transport_params(ssl_conn, params, sizeof(params) - 1) == 0) {
|
len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp);
|
||||||
|
/* always succeeds */
|
||||||
|
|
||||||
|
p = ngx_pnalloc(c->pool, len);
|
||||||
|
if (p == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = ngx_quic_create_transport_params(p, p + len, &qc->tp);
|
||||||
|
if (len < 0) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SSL_set_quic_transport_params(ssl_conn, p, len) == 0) {
|
||||||
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||||
"SSL_set_quic_transport_params() failed");
|
"SSL_set_quic_transport_params() failed");
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
|
|||||||
@@ -15,6 +15,29 @@
|
|||||||
//#define quic_version 0xff00001b /* draft-27 (FFN 76) */
|
//#define quic_version 0xff00001b /* draft-27 (FFN 76) */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* configurable */
|
||||||
|
ngx_msec_t max_idle_timeout;
|
||||||
|
ngx_msec_t max_ack_delay;
|
||||||
|
|
||||||
|
ngx_uint_t max_packet_size;
|
||||||
|
ngx_uint_t initial_max_data;
|
||||||
|
ngx_uint_t initial_max_stream_data_bidi_local;
|
||||||
|
ngx_uint_t initial_max_stream_data_bidi_remote;
|
||||||
|
ngx_uint_t initial_max_stream_data_uni;
|
||||||
|
ngx_uint_t initial_max_streams_bidi;
|
||||||
|
ngx_uint_t initial_max_streams_uni;
|
||||||
|
ngx_uint_t ack_delay_exponent;
|
||||||
|
ngx_uint_t disable_active_migration;
|
||||||
|
ngx_uint_t active_connection_id_limit;
|
||||||
|
|
||||||
|
/* TODO */
|
||||||
|
ngx_uint_t original_connection_id;
|
||||||
|
u_char stateless_reset_token[16];
|
||||||
|
void *preferred_address;
|
||||||
|
} ngx_quic_tp_t;
|
||||||
|
|
||||||
|
|
||||||
struct ngx_quic_stream_s {
|
struct ngx_quic_stream_s {
|
||||||
uint64_t id;
|
uint64_t id;
|
||||||
ngx_uint_t unidirectional:1;
|
ngx_uint_t unidirectional:1;
|
||||||
@@ -25,8 +48,8 @@ struct ngx_quic_stream_s {
|
|||||||
|
|
||||||
void ngx_quic_init_ssl_methods(SSL_CTX* ctx);
|
void ngx_quic_init_ssl_methods(SSL_CTX* ctx);
|
||||||
|
|
||||||
void ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_msec_t timeout,
|
void ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
|
||||||
ngx_connection_handler_pt handler);
|
ngx_msec_t timeout, ngx_connection_handler_pt handler);
|
||||||
ngx_connection_t *ngx_quic_create_uni_stream(ngx_connection_t *c);
|
ngx_connection_t *ngx_quic_create_uni_stream(ngx_connection_t *c);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ static char *ngx_quic_errors[] = {
|
|||||||
"INVALID_TOKEN",
|
"INVALID_TOKEN",
|
||||||
"",
|
"",
|
||||||
"CRYPTO_BUFFER_EXCEEDED",
|
"CRYPTO_BUFFER_EXCEEDED",
|
||||||
|
"",
|
||||||
"CRYPTO_ERROR",
|
"CRYPTO_ERROR",
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -639,11 +640,11 @@ ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end,
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->u.close.error_code > NGX_QUIC_ERR_LAST) {
|
if (f->u.close.error_code >= NGX_QUIC_ERR_LAST) {
|
||||||
ngx_log_error(NGX_LOG_ERR, pkt->log, 0,
|
ngx_log_error(NGX_LOG_ERR, pkt->log, 0,
|
||||||
"unkown error code: %ui, truncated",
|
"unkown error code: %ui, truncated",
|
||||||
f->u.close.error_code);
|
f->u.close.error_code);
|
||||||
f->u.close.error_code = NGX_QUIC_ERR_LAST;
|
f->u.close.error_code = NGX_QUIC_ERR_LAST - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_log_debug4(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
|
ngx_log_debug4(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
|
||||||
@@ -963,6 +964,105 @@ ngx_quic_create_max_streams(u_char *p, ngx_quic_max_streams_frame_t *ms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp)
|
||||||
|
{
|
||||||
|
u_char *p;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
#if (quic_version < 0xff00001b)
|
||||||
|
|
||||||
|
/* older drafts with static transport parameters encoding */
|
||||||
|
|
||||||
|
#define ngx_quic_tp_len(id, value) \
|
||||||
|
4 + ngx_quic_varint_len(value)
|
||||||
|
|
||||||
|
#define ngx_quic_tp_vint(id, value) \
|
||||||
|
do { \
|
||||||
|
p = ngx_quic_write_uint16(p, id); \
|
||||||
|
p = ngx_quic_write_uint16(p, ngx_quic_varint_len(value)); \
|
||||||
|
ngx_quic_build_int(&p, value); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* recent drafts with variable integer transport parameters encoding */
|
||||||
|
|
||||||
|
#define ngx_quic_tp_len(id, value) \
|
||||||
|
ngx_quic_varint_len(id) \
|
||||||
|
+ ngx_quic_varint_len(value) \
|
||||||
|
+ ngx_quic_varint_len(ngx_quic_varint_len(value))
|
||||||
|
|
||||||
|
#define ngx_quic_tp_vint(id, value) \
|
||||||
|
do { \
|
||||||
|
ngx_quic_build_int(&p, id); \
|
||||||
|
ngx_quic_build_int(&p, ngx_quic_varint_len(value)); \
|
||||||
|
ngx_quic_build_int(&p, value); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
p = pos;
|
||||||
|
|
||||||
|
len = ngx_quic_tp_len(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
|
||||||
|
tp->active_connection_id_limit);
|
||||||
|
|
||||||
|
len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_DATA,tp->initial_max_data);
|
||||||
|
|
||||||
|
len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
|
||||||
|
tp->initial_max_streams_uni);
|
||||||
|
|
||||||
|
len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
|
||||||
|
tp->initial_max_streams_bidi);
|
||||||
|
|
||||||
|
len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
|
||||||
|
tp->initial_max_stream_data_bidi_local);
|
||||||
|
|
||||||
|
len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
|
||||||
|
tp->initial_max_stream_data_bidi_remote);
|
||||||
|
|
||||||
|
len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI,
|
||||||
|
tp->initial_max_stream_data_uni);
|
||||||
|
|
||||||
|
if (pos == NULL) {
|
||||||
|
#if (quic_version < 0xff00001b)
|
||||||
|
len += ngx_quic_varint_len(len);
|
||||||
|
#endif
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (quic_version < 0xff00001b)
|
||||||
|
/* TLS extension length */
|
||||||
|
p = ngx_quic_write_uint16(p, len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
|
||||||
|
tp->active_connection_id_limit);
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_DATA,
|
||||||
|
tp->initial_max_data);
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
|
||||||
|
tp->initial_max_streams_uni);
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
|
||||||
|
tp->initial_max_streams_bidi);
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
|
||||||
|
tp->initial_max_stream_data_bidi_local);
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
|
||||||
|
tp->initial_max_stream_data_bidi_remote);
|
||||||
|
|
||||||
|
ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI,
|
||||||
|
tp->initial_max_stream_data_uni);
|
||||||
|
|
||||||
|
ngx_quic_hexdump0(ngx_cycle->log, "transport parameters", pos, p - pos);
|
||||||
|
|
||||||
|
return p - pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl)
|
ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -65,10 +65,28 @@
|
|||||||
#define NGX_QUIC_ERR_INVALID_TOKEN 0x0B
|
#define NGX_QUIC_ERR_INVALID_TOKEN 0x0B
|
||||||
/* 0xC is not defined */
|
/* 0xC is not defined */
|
||||||
#define NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0x0D
|
#define NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0x0D
|
||||||
|
/* 0xE is not defined */
|
||||||
#define NGX_QUIC_ERR_CRYPTO_ERROR 0x10
|
#define NGX_QUIC_ERR_CRYPTO_ERROR 0x10
|
||||||
|
|
||||||
#define NGX_QUIC_ERR_LAST NGX_QUIC_ERR_CRYPTO_ERROR
|
#define NGX_QUIC_ERR_LAST NGX_QUIC_ERR_CRYPTO_ERROR
|
||||||
|
|
||||||
|
/* Transport parameters */
|
||||||
|
#define NGX_QUIC_TP_ORIGINAL_CONNECTION_ID 0x00
|
||||||
|
#define NGX_QUIC_TP_MAX_IDLE_TIMEOUT 0x01
|
||||||
|
#define NGX_QUIC_TP_STATELESS_RESET_TOKEN 0x02
|
||||||
|
#define NGX_QUIC_TP_MAX_PACKET_SIZE 0x03
|
||||||
|
#define NGX_QUIC_TP_INITIAL_MAX_DATA 0x04
|
||||||
|
#define NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05
|
||||||
|
#define NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06
|
||||||
|
#define NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI 0x07
|
||||||
|
#define NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI 0x08
|
||||||
|
#define NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI 0x09
|
||||||
|
#define NGX_QUIC_TP_ACK_DELAY_EXPONENT 0x0a
|
||||||
|
#define NGX_QUIC_TP_MAX_ACK_DELAY 0x0b
|
||||||
|
#define NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION 0x0c
|
||||||
|
#define NGX_QUIC_TP_PREFERRED_ADDRESS 0x0d
|
||||||
|
#define NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT 0x0e
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_uint_t pn;
|
ngx_uint_t pn;
|
||||||
@@ -208,4 +226,7 @@ ssize_t ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end,
|
|||||||
ngx_quic_frame_t *frame);
|
ngx_quic_frame_t *frame);
|
||||||
ssize_t ngx_quic_create_frame(u_char *p, u_char *end, ngx_quic_frame_t *f);
|
ssize_t ngx_quic_create_frame(u_char *p, u_char *end, ngx_quic_frame_t *f);
|
||||||
|
|
||||||
|
ssize_t ngx_quic_create_transport_params(u_char *p, u_char *end,
|
||||||
|
ngx_quic_tp_t *tp);
|
||||||
|
|
||||||
#endif /* _NGX_EVENT_QUIC_WIRE_H_INCLUDED_ */
|
#endif /* _NGX_EVENT_QUIC_WIRE_H_INCLUDED_ */
|
||||||
|
|||||||
@@ -341,11 +341,14 @@ ngx_http_init_connection(ngx_connection_t *c)
|
|||||||
|
|
||||||
#if (NGX_HTTP_V3)
|
#if (NGX_HTTP_V3)
|
||||||
if (hc->quic) {
|
if (hc->quic) {
|
||||||
|
ngx_http_v3_srv_conf_t *v3cf;
|
||||||
ngx_http_ssl_srv_conf_t *sscf;
|
ngx_http_ssl_srv_conf_t *sscf;
|
||||||
|
|
||||||
|
v3cf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v3_module);
|
||||||
sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);
|
sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_ssl_module);
|
||||||
|
|
||||||
ngx_quic_run(c, &sscf->ssl, c->listening->post_accept_timeout,
|
ngx_quic_run(c, &sscf->ssl, &v3cf->quic,
|
||||||
|
c->listening->post_accept_timeout,
|
||||||
ngx_http_quic_stream_handler);
|
ngx_http_quic_stream_handler);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,11 @@
|
|||||||
#define NGX_HTTP_V3_PARAM_BLOCKED_STREAMS 0x07
|
#define NGX_HTTP_V3_PARAM_BLOCKED_STREAMS 0x07
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_quic_tp_t quic;
|
||||||
|
} ngx_http_v3_srv_conf_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_http_connection_t hc;
|
ngx_http_connection_t hc;
|
||||||
|
|
||||||
|
|||||||
@@ -11,10 +11,100 @@
|
|||||||
|
|
||||||
|
|
||||||
static ngx_command_t ngx_http_v3_commands[] = {
|
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
|
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 = {
|
static ngx_http_module_t ngx_http_v3_module_ctx = {
|
||||||
NULL, /* preconfiguration */
|
NULL, /* preconfiguration */
|
||||||
NULL, /* postconfiguration */
|
NULL, /* postconfiguration */
|
||||||
@@ -22,8 +112,8 @@ static ngx_http_module_t ngx_http_v3_module_ctx = {
|
|||||||
NULL, /* create main configuration */
|
NULL, /* create main configuration */
|
||||||
NULL, /* init main configuration */
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
NULL, /* create server configuration */
|
ngx_http_v3_create_srv_conf, /* create server configuration */
|
||||||
NULL, /* merge server configuration */
|
ngx_http_v3_merge_srv_conf, /* merge server configuration */
|
||||||
|
|
||||||
NULL, /* create location configuration */
|
NULL, /* create location configuration */
|
||||||
NULL /* merge location configuration */
|
NULL /* merge location configuration */
|
||||||
@@ -44,3 +134,91 @@ ngx_module_t ngx_http_v3_module = {
|
|||||||
NULL, /* exit master */
|
NULL, /* exit master */
|
||||||
NGX_MODULE_V1_PADDING
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user