Mercurial > hg > nginx
diff src/event/ngx_event_quic_transport.c @ 8596:38c7dd720774 quic
QUIC: added ACK frame range support.
The history of acknowledged packet is kept in send context as ranges.
Up to NGX_QUIC_MAX_RANGES ranges is stored.
As a result, instead of separate ack frames, single frame with ranges
is sent.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Tue, 20 Oct 2020 18:53:00 +0300 |
parents | ee06a813756c |
children | b3d9e57d0f62 |
line wrap: on
line diff
--- a/src/event/ngx_event_quic_transport.c Wed Oct 21 12:46:23 2020 +0100 +++ b/src/event/ngx_event_quic_transport.c Tue Oct 20 18:53:00 2020 +0300 @@ -1269,18 +1269,25 @@ static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack) { - size_t len; - u_char *start; + size_t len; + u_char *start; + ngx_uint_t i; + ngx_quic_ack_range_t *ranges; - /* minimal ACK packet */ + ranges = (ngx_quic_ack_range_t *) ack->ranges_start; if (p == NULL) { len = ngx_quic_varint_len(NGX_QUIC_FT_ACK); len += ngx_quic_varint_len(ack->largest); len += ngx_quic_varint_len(ack->delay); - len += ngx_quic_varint_len(0); + len += ngx_quic_varint_len(ack->range_count); len += ngx_quic_varint_len(ack->first_range); + for (i = 0; i < ack->range_count; i++) { + len += ngx_quic_varint_len(ranges[i].gap); + len += ngx_quic_varint_len(ranges[i].range); + } + return len; } @@ -1289,9 +1296,14 @@ ngx_quic_build_int(&p, NGX_QUIC_FT_ACK); ngx_quic_build_int(&p, ack->largest); ngx_quic_build_int(&p, ack->delay); - ngx_quic_build_int(&p, 0); + ngx_quic_build_int(&p, ack->range_count); ngx_quic_build_int(&p, ack->first_range); + for (i = 0; i < ack->range_count; i++) { + ngx_quic_build_int(&p, ranges[i].gap); + ngx_quic_build_int(&p, ranges[i].range); + } + return p - start; }