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
+++ b/src/event/ngx_event_quic_transport.c
@@ -1269,18 +1269,25 @@ ngx_quic_create_frame(u_char *p, ngx_qui
 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_create_ack(u_char *p, ngx_quic_
     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;
 }