Mercurial > hg > nginx-quic
changeset 8175:64405f970f6f quic
QUIC: avoided retransmission of stale ack frames.
Acknowledgments are regenerated using the most recent data available.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Wed, 28 Oct 2020 14:22:51 +0300 |
parents | 27e305834078 |
children | 69dc750cf66f |
files | src/event/ngx_event_quic.c |
diffstat | 1 files changed, 14 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c +++ b/src/event/ngx_event_quic.c @@ -4843,6 +4843,8 @@ ngx_quic_resend_frames(ngx_connection_t ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic resend packet pnum:%uL", start->pnum); + ngx_quic_congestion_lost(c, start); + do { f = ngx_queue_data(q, ngx_quic_frame_t, queue); @@ -4853,12 +4855,21 @@ ngx_quic_resend_frames(ngx_connection_t q = ngx_queue_next(q); ngx_queue_remove(&f->queue); - ngx_queue_insert_tail(&ctx->frames, &f->queue); + + switch (f->type) { + case NGX_QUIC_FT_ACK: + case NGX_QUIC_FT_ACK_ECN: + /* force generation of most recent acknowledgment */ + ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; + ngx_quic_free_frame(c, f); + break; + + default: + ngx_queue_insert_tail(&ctx->frames, &f->queue); + } } while (q != ngx_queue_sentinel(&ctx->sent)); - ngx_quic_congestion_lost(c, start); - if (qc->closing) { return; }