summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
authorVladimir Homutov <vl@nginx.com>2021-12-06 15:19:54 +0300
committerVladimir Homutov <vl@nginx.com>2021-12-06 15:19:54 +0300
commit0791b508807eac65681c9c33d27acece67a9a421 (patch)
tree291c7bae689b2ec757c09a6764790de122cbd66a /src/event
parent835854520a07adf6e3bedfad486a92cecdcd33ac (diff)
downloadnginx-0791b508807eac65681c9c33d27acece67a9a421.tar.gz
nginx-0791b508807eac65681c9c33d27acece67a9a421.tar.bz2
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.
Diffstat (limited to 'src/event')
-rw-r--r--src/event/quic/ngx_event_quic.c5
-rw-r--r--src/event/quic/ngx_event_quic.h36
-rw-r--r--src/event/quic/ngx_event_quic_streams.c10
-rw-r--r--src/event/quic/ngx_event_quic_transport.c44
-rw-r--r--src/event/quic/ngx_event_quic_transport.h27
5 files changed, 87 insertions, 35 deletions
diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c
index 03d703b2c..cb71a16b1 100644
--- a/src/event/quic/ngx_event_quic.c
+++ b/src/event/quic/ngx_event_quic.c
@@ -294,7 +294,10 @@ ngx_quic_new_connection(ngx_connection_t *c, ngx_quic_conf_t *conf,
qc->path_validation.cancelable = 1;
qc->conf = conf;
- qc->tp = conf->tp;
+
+ if (ngx_quic_init_transport_params(&qc->tp, conf) != NGX_OK) {
+ return NULL;
+ }
ctp = &qc->ctp;
diff --git a/src/event/quic/ngx_event_quic.h b/src/event/quic/ngx_event_quic.h
index 1007c491d..8ae7bf643 100644
--- a/src/event/quic/ngx_event_quic.h
+++ b/src/event/quic/ngx_event_quic.h
@@ -27,43 +27,23 @@
#define NGX_QUIC_STREAM_SERVER_INITIATED 0x01
#define NGX_QUIC_STREAM_UNIDIRECTIONAL 0x02
-#define NGX_QUIC_STREAM_BUFSIZE 65536
-
-
-typedef struct {
- /* configurable */
- ngx_msec_t max_idle_timeout;
- ngx_msec_t max_ack_delay;
-
- size_t max_udp_payload_size;
- size_t initial_max_data;
- size_t initial_max_stream_data_bidi_local;
- size_t initial_max_stream_data_bidi_remote;
- size_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 active_connection_id_limit;
- ngx_flag_t disable_active_migration;
- ngx_str_t original_dcid;
- ngx_str_t initial_scid;
- ngx_str_t retry_scid;
- u_char sr_token[NGX_QUIC_SR_TOKEN_LEN];
-
- /* TODO */
- void *preferred_address;
-} ngx_quic_tp_t;
-
typedef struct {
ngx_ssl_t *ssl;
- ngx_quic_tp_t tp;
+
ngx_flag_t retry;
ngx_flag_t gso_enabled;
+ ngx_flag_t disable_active_migration;
+ ngx_msec_t timeout;
ngx_str_t host_key;
+ size_t mtu;
+ size_t stream_buffer_size;
+ ngx_uint_t max_concurrent_streams_bidi;
+ ngx_uint_t max_concurrent_streams_uni;
ngx_int_t stream_close_code;
ngx_int_t stream_reject_code_uni;
ngx_int_t stream_reject_code_bidi;
+
u_char av_token_key[NGX_QUIC_AV_KEY_LEN];
u_char sr_token_key[NGX_QUIC_SR_KEY_LEN];
} ngx_quic_conf_t;
diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c
index ced35370b..60e693bbd 100644
--- a/src/event/quic/ngx_event_quic_streams.c
+++ b/src/event/quic/ngx_event_quic_streams.c
@@ -851,7 +851,7 @@ ngx_quic_max_stream_flow(ngx_connection_t *c)
qs = c->quic;
qc = ngx_quic_get_connection(qs->parent);
- size = NGX_QUIC_STREAM_BUFSIZE;
+ size = qc->conf->stream_buffer_size;
sent = c->sent;
unacked = sent - qs->acked;
@@ -859,15 +859,13 @@ ngx_quic_max_stream_flow(ngx_connection_t *c)
qc->streams.send_max_data = qc->ctp.initial_max_data;
}
- if (unacked >= NGX_QUIC_STREAM_BUFSIZE) {
+ if (unacked >= size) {
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
"quic send flow hit buffer size");
return 0;
}
- if (unacked + size > NGX_QUIC_STREAM_BUFSIZE) {
- size = NGX_QUIC_STREAM_BUFSIZE - unacked;
- }
+ size -= unacked;
if (qc->streams.sent >= qc->streams.send_max_data) {
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
@@ -1493,7 +1491,7 @@ ngx_quic_handle_stream_ack(ngx_connection_t *c, ngx_quic_frame_t *f)
sent = qs->connection->sent;
unacked = sent - qs->acked;
- if (unacked >= NGX_QUIC_STREAM_BUFSIZE && wev->active) {
+ if (unacked >= qc->conf->stream_buffer_size && wev->active) {
wev->ready = 1;
ngx_post_event(wev, &ngx_posted_events);
}
diff --git a/src/event/quic/ngx_event_quic_transport.c b/src/event/quic/ngx_event_quic_transport.c
index c39d1094c..0ff42de2d 100644
--- a/src/event/quic/ngx_event_quic_transport.c
+++ b/src/event/quic/ngx_event_quic_transport.c
@@ -1937,6 +1937,50 @@ ngx_quic_create_retire_connection_id(u_char *p,
}
+ngx_int_t
+ngx_quic_init_transport_params(ngx_quic_tp_t *tp, ngx_quic_conf_t *qcf)
+{
+ ngx_uint_t nstreams;
+
+ ngx_memzero(tp, sizeof(ngx_quic_tp_t));
+
+ /*
+ * set by ngx_memzero():
+ *
+ * tp->disable_active_migration = 0;
+ * tp->original_dcid = { 0, NULL };
+ * tp->initial_scid = { 0, NULL };
+ * tp->retry_scid = { 0, NULL };
+ * tp->sr_token = { 0 }
+ * tp->sr_enabled = 0
+ * tp->preferred_address = NULL
+ */
+
+ tp->max_idle_timeout = qcf->timeout;
+
+ tp->max_udp_payload_size = qcf->mtu;
+
+ nstreams = qcf->max_concurrent_streams_bidi
+ + qcf->max_concurrent_streams_uni;
+
+ tp->initial_max_data = nstreams * qcf->stream_buffer_size;
+ tp->initial_max_stream_data_bidi_local = qcf->stream_buffer_size;
+ tp->initial_max_stream_data_bidi_remote = qcf->stream_buffer_size;
+ tp->initial_max_stream_data_uni = qcf->stream_buffer_size;
+
+ tp->initial_max_streams_bidi = qcf->max_concurrent_streams_bidi;
+ tp->initial_max_streams_uni = qcf->max_concurrent_streams_uni;
+
+ tp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY;
+ tp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT;
+
+ tp->active_connection_id_limit = 2;
+ tp->disable_active_migration = qcf->disable_active_migration;
+
+ return NGX_OK;
+}
+
+
ssize_t
ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp,
size_t *clen)
diff --git a/src/event/quic/ngx_event_quic_transport.h b/src/event/quic/ngx_event_quic_transport.h
index 2cd372cba..64ebfa979 100644
--- a/src/event/quic/ngx_event_quic_transport.h
+++ b/src/event/quic/ngx_event_quic_transport.h
@@ -338,6 +338,31 @@ typedef struct {
} ngx_quic_header_t;
+typedef struct {
+ ngx_msec_t max_idle_timeout;
+ ngx_msec_t max_ack_delay;
+
+ size_t max_udp_payload_size;
+ size_t initial_max_data;
+ size_t initial_max_stream_data_bidi_local;
+ size_t initial_max_stream_data_bidi_remote;
+ size_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 active_connection_id_limit;
+ ngx_flag_t disable_active_migration;
+
+ ngx_str_t original_dcid;
+ ngx_str_t initial_scid;
+ ngx_str_t retry_scid;
+ u_char sr_token[NGX_QUIC_SR_TOKEN_LEN];
+
+ /* TODO */
+ void *preferred_address;
+} ngx_quic_tp_t;
+
+
ngx_int_t ngx_quic_parse_packet(ngx_quic_header_t *pkt);
size_t ngx_quic_create_version_negotiation(ngx_quic_header_t *pkt, u_char *out);
@@ -358,6 +383,8 @@ ssize_t ngx_quic_parse_ack_range(ngx_log_t *log, u_char *start,
u_char *end, uint64_t *gap, uint64_t *range);
size_t ngx_quic_create_ack_range(u_char *p, uint64_t gap, uint64_t range);
+ngx_int_t ngx_quic_init_transport_params(ngx_quic_tp_t *tp,
+ ngx_quic_conf_t *qcf);
ngx_int_t ngx_quic_parse_transport_params(u_char *p, u_char *end,
ngx_quic_tp_t *tp, ngx_log_t *log);
ssize_t ngx_quic_create_transport_params(u_char *p, u_char *end,