summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2020-07-21 23:09:22 +0300
committerRoman Arutyunyan <arut@nginx.com>2020-07-21 23:09:22 +0300
commitb813b9ec358862a2a94868bc057420d6eca5c05d (patch)
tree57c250cf526c85f6d1a7889f65110daa9cb7e57b /src/event
parenta305de07e934dd1ff21111d0314821a34880ab13 (diff)
downloadnginx-b813b9ec358862a2a94868bc057420d6eca5c05d.tar.gz
nginx-b813b9ec358862a2a94868bc057420d6eca5c05d.tar.bz2
QUIC: added "quic" listen parameter.
The parameter allows processing HTTP/0.9-2 over QUIC. Also, introduced ngx_http_quic_module and moved QUIC settings there
Diffstat (limited to 'src/event')
-rw-r--r--src/event/ngx_event.c10
-rw-r--r--src/event/ngx_event_quic.c24
-rw-r--r--src/event/ngx_event_quic.h12
3 files changed, 32 insertions, 14 deletions
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index f0ab73afe..de32630fd 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -268,6 +268,8 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
ngx_int_t
ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
{
+#if (NGX_QUIC)
+
ngx_connection_t *c;
c = rev->data;
@@ -284,6 +286,8 @@ ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
return NGX_OK;
}
+#endif
+
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
/* kqueue, epoll */
@@ -362,6 +366,8 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat)
}
}
+#if (NGX_QUIC)
+
if (c->qs) {
if (!wev->active && !wev->ready) {
@@ -374,6 +380,8 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat)
return NGX_OK;
}
+#endif
+
if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
/* kqueue, epoll */
@@ -944,9 +952,11 @@ ngx_send_lowat(ngx_connection_t *c, size_t lowat)
{
int sndlowat;
+#if (NGX_QUIC)
if (c->qs) {
return NGX_OK;
}
+#endif
#if (NGX_HAVE_LOWAT_EVENT)
diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c
index 669637674..d72052c82 100644
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -93,6 +93,8 @@ struct ngx_quic_connection_s {
ngx_quic_secrets_t next_key;
ngx_quic_frames_stream_t crypto[NGX_QUIC_ENCRYPTION_LAST];
+ ngx_quic_conf_t *conf;
+
ngx_ssl_t *ssl;
ngx_event_t push;
@@ -160,7 +162,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,
- ngx_quic_tp_t *tp, ngx_quic_header_t *pkt,
+ ngx_quic_conf_t *conf, ngx_quic_header_t *pkt,
ngx_connection_handler_pt handler);
static ngx_int_t ngx_quic_new_dcid(ngx_connection_t *c, ngx_str_t *odcid);
static ngx_int_t ngx_quic_retry(ngx_connection_t *c);
@@ -585,7 +587,7 @@ ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
void
-ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
+ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_conf_t *conf,
ngx_connection_handler_pt handler)
{
ngx_buf_t *b;
@@ -604,7 +606,7 @@ ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
pkt.data = b->start;
pkt.len = b->last - b->start;
- if (ngx_quic_new_connection(c, ssl, tp, &pkt, handler) != NGX_OK) {
+ if (ngx_quic_new_connection(c, ssl, conf, &pkt, handler) != NGX_OK) {
ngx_quic_close_connection(c, NGX_ERROR);
return;
}
@@ -619,8 +621,9 @@ ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
static ngx_int_t
-ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
- ngx_quic_header_t *pkt, ngx_connection_handler_pt handler)
+ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
+ ngx_quic_conf_t *conf, ngx_quic_header_t *pkt,
+ ngx_connection_handler_pt handler)
{
ngx_int_t rc;
ngx_uint_t i;
@@ -703,7 +706,8 @@ ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
c->quic = qc;
qc->ssl = ssl;
- qc->tp = *tp;
+ qc->conf = conf;
+ qc->tp = conf->tp;
qc->streams.handler = handler;
ctp = &qc->ctp;
@@ -767,7 +771,7 @@ ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
/* NGX_OK */
qc->validated = 1;
- } else if (tp->retry) {
+ } else if (conf->retry) {
return ngx_quic_retry(c);
}
@@ -949,7 +953,7 @@ ngx_quic_new_token(ngx_connection_t *c, ngx_str_t *token)
return NGX_ERROR;
}
- key = c->quic->tp.token_key;
+ key = c->quic->conf->token_key;
iv = token->data;
if (RAND_bytes(iv, iv_len) <= 0
@@ -1023,7 +1027,7 @@ ngx_quic_validate_token(ngx_connection_t *c, ngx_quic_header_t *pkt)
/* NEW_TOKEN in a previous connection */
cipher = EVP_aes_256_cbc();
- key = c->quic->tp.token_key;
+ key = c->quic->conf->token_key;
iv = pkt->token.data;
iv_len = EVP_CIPHER_iv_length(cipher);
@@ -2237,7 +2241,7 @@ ngx_quic_send_new_token(ngx_connection_t *c)
ngx_str_t token;
ngx_quic_frame_t *frame;
- if (!c->quic->tp.retry) {
+ if (!c->quic->conf->retry) {
return NGX_OK;
}
diff --git a/src/event/ngx_event_quic.h b/src/event/ngx_event_quic.h
index 99c460407..882858ed0 100644
--- a/src/event/ngx_event_quic.h
+++ b/src/event/ngx_event_quic.h
@@ -78,9 +78,6 @@ typedef struct {
ngx_str_t initial_scid;
ngx_str_t retry_scid;
- ngx_flag_t retry;
- u_char token_key[32]; /* AES 256 */
-
/* TODO */
u_char stateless_reset_token[16];
void *preferred_address;
@@ -88,6 +85,13 @@ typedef struct {
typedef struct {
+ ngx_quic_tp_t tp;
+ ngx_flag_t retry;
+ u_char token_key[32]; /* AES 256 */
+} ngx_quic_conf_t;
+
+
+typedef struct {
uint64_t sent;
uint64_t received;
ngx_queue_t frames; /* reorder queue */
@@ -107,7 +111,7 @@ struct ngx_quic_stream_s {
};
-void ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
+void ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_conf_t *conf,
ngx_connection_handler_pt handler);
ngx_connection_t *ngx_quic_create_uni_stream(ngx_connection_t *c);
void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err,