diff src/event/ngx_event_quic.c @ 8613:867c189f875d quic

QUIC: unified range format for rx and tx ACK frames. Previously, tx ACK frames held ranges in an array of ngx_quic_ack_range_t, while rx ACK frames held ranges in the serialized format. Now serialized format is used for both types of frames.
author Roman Arutyunyan <arut@nginx.com>
date Tue, 27 Oct 2020 13:24:00 +0000
parents b1676cd64dc9
children 3d79c08bb0f1
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -371,12 +371,11 @@ static SSL_QUIC_METHOD quic_method = {
 static void
 ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx)
 {
-    u_char                *p, *last, *pos, *end;
-    ssize_t                n;
-    uint64_t               gap, range;
-    ngx_uint_t             i;
-    ngx_quic_ack_range_t  *ranges;
-    u_char                 buf[NGX_MAX_ERROR_STR];
+    u_char      *p, *last, *pos, *end;
+    ssize_t      n;
+    uint64_t     gap, range;
+    ngx_uint_t   i;
+    u_char       buf[NGX_MAX_ERROR_STR];
 
     p = buf;
     last = buf + sizeof(buf);
@@ -400,28 +399,18 @@ ngx_quic_log_frame(ngx_log_t *log, ngx_q
                          f->u.ack.largest, f->u.ack.first_range,
                          f->u.ack.range_count, f->u.ack.delay);
 
-        if (tx) {
-            ranges = (ngx_quic_ack_range_t *) f->u.ack.ranges_start;
-
-            for (i = 0; i < f->u.ack.range_count; i++) {
-                p = ngx_slprintf(p, last, " %uL,%uL",
-                                 ranges[i].gap, ranges[i].range);
+        pos = f->u.ack.ranges_start;
+        end = f->u.ack.ranges_end;
+
+        for (i = 0; i < f->u.ack.range_count; i++) {
+            n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range);
+            if (n == NGX_ERROR) {
+                break;
             }
 
-        } else {
-            pos = f->u.ack.ranges_start;
-            end = f->u.ack.ranges_end;
-
-            for (i = 0; i < f->u.ack.range_count; i++) {
-                n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range);
-                if (n == NGX_ERROR) {
-                    break;
-                }
-
-                pos += n;
-
-                p = ngx_slprintf(p, last, " %uL,%uL", gap, range);
-            }
+            pos += n;
+
+            p = ngx_slprintf(p, last, " %uL,%uL", gap, range);
         }
 
         if (f->type == NGX_QUIC_FT_ACK_ECN) {
@@ -2879,8 +2868,10 @@ ngx_quic_drop_ack_ranges(ngx_connection_
 static ngx_int_t
 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
 {
+    u_char            *p;
     size_t             ranges_len;
     uint64_t           ack_delay;
+    ngx_uint_t         i;
     ngx_quic_frame_t  *frame;
 
     if (ctx->level == ssl_encryption_application) {
@@ -2892,14 +2883,24 @@ ngx_quic_send_ack(ngx_connection_t *c, n
         ack_delay = 0;
     }
 
-    ranges_len = sizeof(ngx_quic_ack_range_t) * ctx->nranges;
+    ranges_len = 0;
+
+    for (i = 0; i < ctx->nranges; i++) {
+        ranges_len += ngx_quic_create_ack_range(NULL, ctx->ranges[i].gap,
+                                                ctx->ranges[i].range);
+    }
 
     frame = ngx_quic_alloc_frame(c, ranges_len);
     if (frame == NULL) {
         return NGX_ERROR;
     }
 
-    ngx_memcpy(frame->data, ctx->ranges, ranges_len);
+    p = frame->data;
+
+    for (i = 0; i < ctx->nranges; i++) {
+        p += ngx_quic_create_ack_range(p, ctx->ranges[i].gap,
+                                       ctx->ranges[i].range);
+    }
 
     frame->level = ctx->level;
     frame->type = NGX_QUIC_FT_ACK;