diff options
| author | Vladimir Homutov <vl@nginx.com> | 2021-11-29 11:49:09 +0300 |
|---|---|---|
| committer | Vladimir Homutov <vl@nginx.com> | 2021-11-29 11:49:09 +0300 |
| commit | b8aa869a6f4ee0fda4ab32d5c002fc10bd738079 (patch) | |
| tree | b1d85fc21b0aeed06588c4b40012aa1cb5908a57 /src/event/quic/ngx_event_quic.c | |
| parent | e165526e43d60b9249690faccbb380be20e88af3 (diff) | |
| download | nginx-b8aa869a6f4ee0fda4ab32d5c002fc10bd738079.tar.gz nginx-b8aa869a6f4ee0fda4ab32d5c002fc10bd738079.tar.bz2 | |
QUIC: refactored multiple QUIC packets handling.
Single UDP datagram may contain multiple QUIC datagrams. In order to
facilitate handling of such cases, 'first' flag in the ngx_quic_header_t
structure is introduced.
Diffstat (limited to 'src/event/quic/ngx_event_quic.c')
| -rw-r--r-- | src/event/quic/ngx_event_quic.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c index af6f3e69e..53e50a8b9 100644 --- a/src/event/quic/ngx_event_quic.c +++ b/src/event/quic/ngx_event_quic.c @@ -358,7 +358,7 @@ ngx_quic_process_stateless_reset(ngx_connection_t *c, ngx_quic_header_t *pkt) qc = ngx_quic_get_connection(c); /* A stateless reset uses an entire UDP datagram */ - if (pkt->raw->start != pkt->data) { + if (!pkt->first) { return NGX_DECLINED; } @@ -666,7 +666,7 @@ static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf) { size_t size; - u_char *p; + u_char *p, *start; ngx_int_t rc; ngx_uint_t good; ngx_quic_header_t pkt; @@ -676,7 +676,7 @@ ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf) size = b->last - b->pos; - p = b->pos; + p = start = b->pos; while (p < b->last) { @@ -685,6 +685,7 @@ ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf) pkt.data = p; pkt.len = b->last - p; pkt.log = c->log; + pkt.first = (p == start) ? 1 : 0; pkt.flags = p[0]; pkt.raw->pos++; @@ -979,8 +980,10 @@ ngx_quic_process_payload(ngx_connection_t *c, ngx_quic_header_t *pkt) pkt->decrypted = 1; - if (ngx_quic_update_paths(c, pkt) != NGX_OK) { - return NGX_ERROR; + if (pkt->first) { + if (ngx_quic_update_paths(c, pkt) != NGX_OK) { + return NGX_ERROR; + } } if (c->ssl == NULL) { |
