diff options
| author | Roman Arutyunyan <arut@nginx.com> | 2020-03-13 19:36:33 +0300 |
|---|---|---|
| committer | Roman Arutyunyan <arut@nginx.com> | 2020-03-13 19:36:33 +0300 |
| commit | 7739b6073b11086d9a3dc4b9744418070e182c33 (patch) | |
| tree | 7a16aeff28275722458173e83e2f6dd1889cc44a /src/event | |
| parent | 365b77b58732a708168c995c7956f50d110fee33 (diff) | |
| download | nginx-7739b6073b11086d9a3dc4b9744418070e182c33.tar.gz nginx-7739b6073b11086d9a3dc4b9744418070e182c33.tar.bz2 | |
HTTP/3.
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/ngx_event.c | 36 | ||||
| -rw-r--r-- | src/event/ngx_event_quic.c | 23 | ||||
| -rw-r--r-- | src/event/ngx_event_quic.h | 1 |
3 files changed, 56 insertions, 4 deletions
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 402a7f5e2..f0ab73afe 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -268,6 +268,22 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle) ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags) { + ngx_connection_t *c; + + c = rev->data; + + if (c->qs) { + + if (!rev->active && !rev->ready) { + rev->active = 1; + + } else if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) { + rev->active = 0; + } + + return NGX_OK; + } + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { /* kqueue, epoll */ @@ -338,14 +354,26 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat) { ngx_connection_t *c; - if (lowat) { - c = wev->data; + c = wev->data; + if (lowat) { if (ngx_send_lowat(c, lowat) == NGX_ERROR) { return NGX_ERROR; } } + if (c->qs) { + + if (!wev->active && !wev->ready) { + wev->active = 1; + + } else if (wev->active && wev->ready) { + wev->active = 0; + } + + return NGX_OK; + } + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { /* kqueue, epoll */ @@ -916,6 +944,10 @@ ngx_send_lowat(ngx_connection_t *c, size_t lowat) { int sndlowat; + if (c->qs) { + return NGX_OK; + } + #if (NGX_HAVE_LOWAT_EVENT) if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c index 880dda023..248cc9087 100644 --- a/src/event/ngx_event_quic.c +++ b/src/event/ngx_event_quic.c @@ -1909,6 +1909,7 @@ ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size) b = sn->b; if (b->last - b->pos == 0) { + c->read->ready = 0; ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic recv() not ready"); return NGX_AGAIN; // ? @@ -2029,6 +2030,7 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt) u_char *end, *p; ssize_t len; ngx_buf_t *b; + ngx_log_t *log; ngx_uint_t ack_this; ngx_pool_t *pool; ngx_event_t *rev, *wev; @@ -2129,21 +2131,38 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt) return NGX_ERROR; } + sn->c = ngx_get_connection(-1, c->log); // TODO: free on connection termination + if (sn->c == NULL) { + return NGX_ERROR; + } + pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log); if (pool == NULL) { + /* XXX free connection */ return NGX_ERROR; } - sn->c = ngx_get_connection(-1, c->log); // TODO: free on connection termination - if (sn->c == NULL) { + log = ngx_palloc(pool, sizeof(ngx_log_t)); + if (log == NULL) { + /* XXX free pool and connection */ return NGX_ERROR; } + *log = *c->log; + pool->log = log; + + sn->c->log = log; sn->c->pool = pool; + sn->c->listening = c->listening; + sn->c->sockaddr = c->sockaddr; + sn->c->local_sockaddr = c->local_sockaddr; + rev = sn->c->read; wev = sn->c->write; + rev->ready = 1; + rev->log = c->log; wev->log = c->log; diff --git a/src/event/ngx_event_quic.h b/src/event/ngx_event_quic.h index f3ff3da77..6a60c8703 100644 --- a/src/event/ngx_event_quic.h +++ b/src/event/ngx_event_quic.h @@ -14,6 +14,7 @@ struct ngx_quic_stream_s { uint64_t id; ngx_uint_t unidirectional:1; ngx_connection_t *parent; + void *data; }; /* TODO: get rid somehow of ssl argument? */ |
