comparison src/event/ngx_event_quic.c @ 8172: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
comparison
equal deleted inserted replaced
8171:b1676cd64dc9 8172:867c189f875d
369 #if (NGX_DEBUG) 369 #if (NGX_DEBUG)
370 370
371 static void 371 static void
372 ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx) 372 ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx)
373 { 373 {
374 u_char *p, *last, *pos, *end; 374 u_char *p, *last, *pos, *end;
375 ssize_t n; 375 ssize_t n;
376 uint64_t gap, range; 376 uint64_t gap, range;
377 ngx_uint_t i; 377 ngx_uint_t i;
378 ngx_quic_ack_range_t *ranges; 378 u_char buf[NGX_MAX_ERROR_STR];
379 u_char buf[NGX_MAX_ERROR_STR];
380 379
381 p = buf; 380 p = buf;
382 last = buf + sizeof(buf); 381 last = buf + sizeof(buf);
383 382
384 switch (f->type) { 383 switch (f->type) {
398 p = ngx_slprintf(p, last, 397 p = ngx_slprintf(p, last,
399 "ACK largest:%uL fr:%uL nranges:%ui delay:%uL", 398 "ACK largest:%uL fr:%uL nranges:%ui delay:%uL",
400 f->u.ack.largest, f->u.ack.first_range, 399 f->u.ack.largest, f->u.ack.first_range,
401 f->u.ack.range_count, f->u.ack.delay); 400 f->u.ack.range_count, f->u.ack.delay);
402 401
403 if (tx) { 402 pos = f->u.ack.ranges_start;
404 ranges = (ngx_quic_ack_range_t *) f->u.ack.ranges_start; 403 end = f->u.ack.ranges_end;
405 404
406 for (i = 0; i < f->u.ack.range_count; i++) { 405 for (i = 0; i < f->u.ack.range_count; i++) {
407 p = ngx_slprintf(p, last, " %uL,%uL", 406 n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range);
408 ranges[i].gap, ranges[i].range); 407 if (n == NGX_ERROR) {
408 break;
409 } 409 }
410 410
411 } else { 411 pos += n;
412 pos = f->u.ack.ranges_start; 412
413 end = f->u.ack.ranges_end; 413 p = ngx_slprintf(p, last, " %uL,%uL", gap, range);
414
415 for (i = 0; i < f->u.ack.range_count; i++) {
416 n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range);
417 if (n == NGX_ERROR) {
418 break;
419 }
420
421 pos += n;
422
423 p = ngx_slprintf(p, last, " %uL,%uL", gap, range);
424 }
425 } 414 }
426 415
427 if (f->type == NGX_QUIC_FT_ACK_ECN) { 416 if (f->type == NGX_QUIC_FT_ACK_ECN) {
428 p = ngx_slprintf(p, last, " ECN counters ect0:%uL ect1:%uL ce:%uL", 417 p = ngx_slprintf(p, last, " ECN counters ect0:%uL ect1:%uL ce:%uL",
429 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce); 418 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce);
2877 2866
2878 2867
2879 static ngx_int_t 2868 static ngx_int_t
2880 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) 2869 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
2881 { 2870 {
2871 u_char *p;
2882 size_t ranges_len; 2872 size_t ranges_len;
2883 uint64_t ack_delay; 2873 uint64_t ack_delay;
2874 ngx_uint_t i;
2884 ngx_quic_frame_t *frame; 2875 ngx_quic_frame_t *frame;
2885 2876
2886 if (ctx->level == ssl_encryption_application) { 2877 if (ctx->level == ssl_encryption_application) {
2887 ack_delay = ngx_current_msec - ctx->largest_received; 2878 ack_delay = ngx_current_msec - ctx->largest_received;
2888 ack_delay *= 1000; 2879 ack_delay *= 1000;
2890 2881
2891 } else { 2882 } else {
2892 ack_delay = 0; 2883 ack_delay = 0;
2893 } 2884 }
2894 2885
2895 ranges_len = sizeof(ngx_quic_ack_range_t) * ctx->nranges; 2886 ranges_len = 0;
2887
2888 for (i = 0; i < ctx->nranges; i++) {
2889 ranges_len += ngx_quic_create_ack_range(NULL, ctx->ranges[i].gap,
2890 ctx->ranges[i].range);
2891 }
2896 2892
2897 frame = ngx_quic_alloc_frame(c, ranges_len); 2893 frame = ngx_quic_alloc_frame(c, ranges_len);
2898 if (frame == NULL) { 2894 if (frame == NULL) {
2899 return NGX_ERROR; 2895 return NGX_ERROR;
2900 } 2896 }
2901 2897
2902 ngx_memcpy(frame->data, ctx->ranges, ranges_len); 2898 p = frame->data;
2899
2900 for (i = 0; i < ctx->nranges; i++) {
2901 p += ngx_quic_create_ack_range(p, ctx->ranges[i].gap,
2902 ctx->ranges[i].range);
2903 }
2903 2904
2904 frame->level = ctx->level; 2905 frame->level = ctx->level;
2905 frame->type = NGX_QUIC_FT_ACK; 2906 frame->type = NGX_QUIC_FT_ACK;
2906 frame->u.ack.largest = ctx->largest_range; 2907 frame->u.ack.largest = ctx->largest_range;
2907 frame->u.ack.delay = ack_delay; 2908 frame->u.ack.delay = ack_delay;