diff options
| author | Roman Arutyunyan <arut@nginx.com> | 2020-07-21 23:09:22 +0300 |
|---|---|---|
| committer | Roman Arutyunyan <arut@nginx.com> | 2020-07-21 23:09:22 +0300 |
| commit | b813b9ec358862a2a94868bc057420d6eca5c05d (patch) | |
| tree | 57c250cf526c85f6d1a7889f65110daa9cb7e57b /src/event | |
| parent | a305de07e934dd1ff21111d0314821a34880ab13 (diff) | |
| download | nginx-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.c | 10 | ||||
| -rw-r--r-- | src/event/ngx_event_quic.c | 24 | ||||
| -rw-r--r-- | src/event/ngx_event_quic.h | 12 |
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, |
