Mercurial > hg > nginx-quic
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; |