annotate src/event/quic/ngx_event_quic_ack.c @ 8822:ad046179eb91 quic

QUIC: handle EAGAIN properly on UDP sockets. Previously, the error was ignored leading to unnecessary retransmits. Now, unsent frames are returned into output queue, state is reset, and timer is started for the next send attempt.
author Vladimir Homutov <vl@nginx.com>
date Wed, 28 Jul 2021 17:23:18 +0300
parents 4009f120cad4
children f3331deed357
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 #define NGX_QUIC_MAX_ACK_GAP 2
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
15 /* RFC 9002, 6.1.1. Packet Threshold: kPacketThreshold */
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 #define NGX_QUIC_PKT_THR 3 /* packets */
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
17 /* RFC 9002, 6.1.2. Time Threshold: kTimeThreshold, kGranularity */
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 #define NGX_QUIC_TIME_THR 1.125
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19 #define NGX_QUIC_TIME_GRANULARITY 1 /* ms */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
21 /* RFC 9002, 7.6.1. Duration: kPersistentCongestionThreshold */
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
22 #define NGX_QUIC_PERSISTENT_CONGESTION_THR 3
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
23
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 #define ngx_quic_lost_threshold(qc) \
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 ngx_max(NGX_QUIC_TIME_THR * ngx_max((qc)->latest_rtt, (qc)->avg_rtt), \
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 NGX_QUIC_TIME_GRANULARITY)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
29 /* send time of ACK'ed packets */
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
30 typedef struct {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
31 ngx_msec_t max_pn;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
32 ngx_msec_t oldest;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
33 ngx_msec_t newest;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
34 } ngx_quic_ack_stat_t;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
35
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
36
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 static void ngx_quic_rtt_sample(ngx_connection_t *c, ngx_quic_ack_frame_t *ack,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 enum ssl_encryption_level_t level, ngx_msec_t send_time);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 static ngx_int_t ngx_quic_handle_ack_frame_range(ngx_connection_t *c,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 ngx_quic_send_ctx_t *ctx, uint64_t min, uint64_t max,
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
41 ngx_quic_ack_stat_t *st);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 static void ngx_quic_drop_ack_ranges(ngx_connection_t *c,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43 ngx_quic_send_ctx_t *ctx, uint64_t pn);
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
44 static ngx_int_t ngx_quic_detect_lost(ngx_connection_t *c,
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
45 ngx_quic_ack_stat_t *st);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
46 static ngx_msec_t ngx_quic_pcg_duration(ngx_connection_t *c);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
47 static void ngx_quic_persistent_congestion(ngx_connection_t *c);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 static void ngx_quic_congestion_lost(ngx_connection_t *c,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 ngx_quic_frame_t *frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 static void ngx_quic_lost_handler(ngx_event_t *ev);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 ngx_quic_frame_t *f)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 ssize_t n;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 u_char *pos, *end;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 uint64_t min, max, gap, range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 ngx_uint_t i;
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
61 ngx_quic_ack_stat_t send_time;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 ngx_quic_send_ctx_t *ctx;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 ngx_quic_ack_frame_t *ack;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 "quic ngx_quic_handle_ack_frame level:%d", pkt->level);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 ack = &f->u.ack;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
76 * RFC 9000, 19.3.1. ACK Ranges
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
77 *
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 * If any computed packet number is negative, an endpoint MUST
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 * generate a connection error of type FRAME_ENCODING_ERROR.
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 if (ack->first_range > ack->largest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 "quic invalid first range in ack frame");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 min = ack->largest - ack->first_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 max = ack->largest;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
92 send_time.oldest = NGX_TIMER_INFINITE;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
93 send_time.newest = NGX_TIMER_INFINITE;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
94
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 != NGX_OK)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
101 /* RFC 9000, 13.2.4. Limiting Ranges by Tracking ACK Frames */
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 if (ctx->largest_ack < max || ctx->largest_ack == NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 ctx->largest_ack = max;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 "quic updated largest received ack:%uL", max);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
108 * RFC 9002, 5.1. Generating RTT Samples
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
109 *
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 * An endpoint generates an RTT sample on receiving an
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 * ACK frame that meets the following two conditions:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 *
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 * - the largest acknowledged packet number is newly acknowledged
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 * - at least one of the newly acknowledged packets was ack-eliciting.
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
117 if (send_time.max_pn != NGX_TIMER_INFINITE) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
118 ngx_quic_rtt_sample(c, ack, pkt->level, send_time.max_pn);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 if (f->data) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 pos = f->data->buf->pos;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 end = f->data->buf->last;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 pos = NULL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 end = NULL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 for (i = 0; i < ack->range_count; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 n = ngx_quic_parse_ack_range(pkt->log, pos, end, &gap, &range);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 if (n == NGX_ERROR) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 pos += n;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 if (gap + 2 > min) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 "quic invalid range:%ui in ack frame", i);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 max = min - gap - 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 if (range > max) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 "quic invalid range:%ui in ack frame", i);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 min = max - range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 != NGX_OK)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
164 return ngx_quic_detect_lost(c, &send_time);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 static void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 ngx_quic_rtt_sample(ngx_connection_t *c, ngx_quic_ack_frame_t *ack,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 enum ssl_encryption_level_t level, ngx_msec_t send_time)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 ngx_msec_t latest_rtt, ack_delay, adjusted_rtt, rttvar_sample;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 latest_rtt = ngx_current_msec - send_time;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 qc->latest_rtt = latest_rtt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 if (qc->min_rtt == NGX_TIMER_INFINITE) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 qc->min_rtt = latest_rtt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 qc->avg_rtt = latest_rtt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 qc->rttvar = latest_rtt / 2;
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
184 qc->first_rtt = ngx_current_msec;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 ack_delay = ack->delay * (1 << qc->ctp.ack_delay_exponent) / 1000;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 if (c->ssl->handshaked) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 ack_delay = ngx_min(ack_delay, qc->ctp.max_ack_delay);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 adjusted_rtt = latest_rtt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 if (qc->min_rtt + ack_delay < latest_rtt) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 adjusted_rtt -= ack_delay;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 qc->avg_rtt = 0.875 * qc->avg_rtt + 0.125 * adjusted_rtt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 rttvar_sample = ngx_abs((ngx_msec_int_t) (qc->avg_rtt - adjusted_rtt));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 qc->rttvar = 0.75 * qc->rttvar + 0.25 * rttvar_sample;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 "quic rtt sample latest:%M min:%M avg:%M var:%M",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 latest_rtt, qc->min_rtt, qc->avg_rtt, qc->rttvar);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 static ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 ngx_quic_handle_ack_frame_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
214 uint64_t min, uint64_t max, ngx_quic_ack_stat_t *st)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 ngx_uint_t found;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 ngx_queue_t *q;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 ngx_quic_frame_t *f;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
223 st->max_pn = NGX_TIMER_INFINITE;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 found = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 q = ngx_queue_last(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 while (q != ngx_queue_sentinel(&ctx->sent)) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 q = ngx_queue_prev(q);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 if (f->pnum >= min && f->pnum <= max) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 ngx_quic_congestion_ack(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 switch (f->type) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 case NGX_QUIC_FT_ACK:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 case NGX_QUIC_FT_ACK_ECN:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 ngx_quic_drop_ack_ranges(c, ctx, f->u.ack.largest);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241
8820
4009f120cad4 QUIC: eliminated stream type from ngx_quic_stream_frame_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8797
diff changeset
242 case NGX_QUIC_FT_STREAM:
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 ngx_quic_handle_stream_ack(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 if (f->pnum == max) {
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
248 st->max_pn = f->last;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
249 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
250
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
251 /* save earliest and latest send times of frames ack'ed */
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
252 if (st->oldest == NGX_TIMER_INFINITE || f->last < st->oldest) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
253 st->oldest = f->last;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
254 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
255
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
256 if (st->newest == NGX_TIMER_INFINITE || f->last > st->newest) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
257 st->newest = f->last;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 ngx_queue_remove(&f->queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 found = 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 if (!found) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 if (max < ctx->pnum) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 /* duplicate ACK or ACK for non-ack-eliciting frame */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 "quic ACK for the packet not sent");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 qc->error_ftype = NGX_QUIC_FT_ACK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 qc->error_reason = "unknown packet number";
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 if (!qc->push.timer_set) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 ngx_post_event(&qc->push, &ngx_posted_events);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 qc->pto_count = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 ngx_quic_congestion_ack(ngx_connection_t *c, ngx_quic_frame_t *f)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 ngx_msec_t timer;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 ngx_quic_congestion_t *cg;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 if (f->plen == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 cg = &qc->congestion;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 cg->in_flight -= f->plen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 timer = f->last - cg->recovery_start;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 if ((ngx_msec_int_t) timer <= 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 "quic congestion ack recovery win:%uz ss:%z if:%uz",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 cg->window, cg->ssthresh, cg->in_flight);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 if (cg->window < cg->ssthresh) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 cg->window += f->plen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 "quic congestion slow start win:%uz ss:%z if:%uz",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 cg->window, cg->ssthresh, cg->in_flight);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 cg->window += qc->tp.max_udp_payload_size * f->plen / cg->window;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 "quic congestion avoidance win:%uz ss:%z if:%uz",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 cg->window, cg->ssthresh, cg->in_flight);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 /* prevent recovery_start from wrapping */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 timer = cg->recovery_start - ngx_current_msec + qc->tp.max_idle_timeout * 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 if ((ngx_msec_int_t) timer < 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 cg->recovery_start = ngx_current_msec - qc->tp.max_idle_timeout * 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 static void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 ngx_quic_drop_ack_ranges(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 uint64_t pn)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 uint64_t base;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 ngx_uint_t i, smallest, largest;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 ngx_quic_ack_range_t *r;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 "quic ngx_quic_drop_ack_ranges pn:%uL largest:%uL"
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 " fr:%uL nranges:%ui", pn, ctx->largest_range,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 ctx->first_range, ctx->nranges);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 base = ctx->largest_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 if (base == NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 if (ctx->pending_ack != NGX_QUIC_UNSET_PN && pn >= ctx->pending_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 ctx->pending_ack = NGX_QUIC_UNSET_PN;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 largest = base;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 smallest = largest - ctx->first_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 if (pn >= largest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371 ctx->largest_range = NGX_QUIC_UNSET_PN;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 ctx->first_range = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 ctx->nranges = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377 if (pn >= smallest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 ctx->first_range = largest - pn - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379 ctx->nranges = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383 for (i = 0; i < ctx->nranges; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 r = &ctx->ranges[i];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386 largest = smallest - r->gap - 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387 smallest = largest - r->range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 if (pn >= largest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 ctx->nranges = i;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 if (pn >= smallest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 r->range = largest - pn - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395 ctx->nranges = i + 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 static ngx_int_t
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
403 ngx_quic_detect_lost(ngx_connection_t *c, ngx_quic_ack_stat_t *st)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 {
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
405 ngx_uint_t i, nlost;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
406 ngx_msec_t now, wait, thr, oldest, newest;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407 ngx_queue_t *q;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 ngx_quic_frame_t *start;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 ngx_quic_send_ctx_t *ctx;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 now = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 thr = ngx_quic_lost_threshold(qc);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
416 /* send time of lost packets across all send contexts */
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
417 oldest = NGX_TIMER_INFINITE;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
418 newest = NGX_TIMER_INFINITE;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
419
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
420 nlost = 0;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
421
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 ctx = &qc->send_ctx[i];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 if (ctx->largest_ack == NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427 continue;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 while (!ngx_queue_empty(&ctx->sent)) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 q = ngx_queue_head(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 if (start->pnum > ctx->largest_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 wait = start->last + thr - now;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 "quic detect_lost pnum:%uL thr:%M wait:%i level:%d",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 start->pnum, thr, (ngx_int_t) wait, start->level);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 if ((ngx_msec_int_t) wait > 0
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 && ctx->largest_ack - start->pnum < NGX_QUIC_PKT_THR)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
451 if (start->last > qc->first_rtt) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
452
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
453 if (oldest == NGX_TIMER_INFINITE || start->last < oldest) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
454 oldest = start->last;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
455 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
456
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
457 if (newest == NGX_TIMER_INFINITE || start->last > newest) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
458 newest = start->last;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
459 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
460
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
461 nlost++;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
462 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
463
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 ngx_quic_resend_frames(c, ctx);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
468
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
469 /* RFC 9002, 7.6.2. Establishing Persistent Congestion */
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
470
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
471 /*
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
472 * Once acknowledged, packets are no longer tracked. Thus no send time
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
473 * information is available for such packets. This limits persistent
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
474 * congestion algorithm to packets mentioned within ACK ranges of the
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
475 * latest ACK frame.
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
476 */
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
477
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
478 if (st && nlost >= 2 && (st->newest < oldest || st->oldest > newest)) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
479
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
480 if (newest - oldest > ngx_quic_pcg_duration(c)) {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
481 ngx_quic_persistent_congestion(c);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
482 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
483 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
484
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 ngx_quic_set_lost_timer(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
491 static ngx_msec_t
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
492 ngx_quic_pcg_duration(ngx_connection_t *c)
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
493 {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
494 ngx_msec_t duration;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
495 ngx_quic_connection_t *qc;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
496
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
497 qc = ngx_quic_get_connection(c);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
498
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
499 duration = qc->avg_rtt;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
500 duration += ngx_max(4 * qc->rttvar, NGX_QUIC_TIME_GRANULARITY);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
501 duration += qc->ctp.max_ack_delay;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
502 duration *= NGX_QUIC_PERSISTENT_CONGESTION_THR;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
503
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
504 return duration;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
505 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
506
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
507
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
508 static void
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
509 ngx_quic_persistent_congestion(ngx_connection_t *c)
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
510 {
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
511 ngx_quic_congestion_t *cg;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
512 ngx_quic_connection_t *qc;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
513
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
514 qc = ngx_quic_get_connection(c);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
515 cg = &qc->congestion;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
516
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
517 cg->recovery_start = ngx_current_msec;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
518 cg->window = qc->tp.max_udp_payload_size * 2;
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
519
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
520 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
521 "quic persistent congestion win:%uz", cg->window);
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
522 }
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
523
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
524
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525 void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 ngx_queue_t *q;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 ngx_quic_frame_t *f, *start;
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
530 ngx_quic_stream_t *qs;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534 q = ngx_queue_head(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 start = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 "quic resend packet pnum:%uL", start->pnum);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 ngx_quic_congestion_lost(c, start);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542 do {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545 if (f->pnum != start->pnum) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 q = ngx_queue_next(q);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 ngx_queue_remove(&f->queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 switch (f->type) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 case NGX_QUIC_FT_ACK:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 case NGX_QUIC_FT_ACK_ECN:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 if (ctx->level == ssl_encryption_application) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557 /* force generation of most recent acknowledgment */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564 case NGX_QUIC_FT_PING:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 case NGX_QUIC_FT_PATH_RESPONSE:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 case NGX_QUIC_FT_CONNECTION_CLOSE:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570 case NGX_QUIC_FT_MAX_DATA:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 f->u.max_data.max_data = qc->streams.recv_max_data;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572 ngx_quic_queue_frame(qc, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575 case NGX_QUIC_FT_MAX_STREAMS:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576 case NGX_QUIC_FT_MAX_STREAMS2:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577 f->u.max_streams.limit = f->u.max_streams.bidi
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 ? qc->streams.client_max_streams_bidi
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579 : qc->streams.client_max_streams_uni;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 ngx_quic_queue_frame(qc, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 case NGX_QUIC_FT_MAX_STREAM_DATA:
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
584 qs = ngx_quic_find_stream(&qc->streams.tree,
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 f->u.max_stream_data.id);
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
586 if (qs == NULL) {
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590
8779
f52a2b77d406 QUIC: generic buffering for stream input.
Roman Arutyunyan <arut@nginx.com>
parents: 8763
diff changeset
591 f->u.max_stream_data.limit = qs->recv_max_data;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 ngx_quic_queue_frame(qc, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594
8820
4009f120cad4 QUIC: eliminated stream type from ngx_quic_stream_frame_t.
Roman Arutyunyan <arut@nginx.com>
parents: 8797
diff changeset
595 case NGX_QUIC_FT_STREAM:
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
596 qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597
8761
225e9f1dfe7c QUIC: renamed stream variables from sn to qs.
Roman Arutyunyan <arut@nginx.com>
parents: 8760
diff changeset
598 if (qs && qs->connection->write->error) {
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
599 /* RESET_STREAM was sent */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604 /* fall through */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
605
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
606 default:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607 ngx_queue_insert_tail(&ctx->frames, &f->queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610 } while (q != ngx_queue_sentinel(&ctx->sent));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 if (qc->closing) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 ngx_post_event(&qc->push, &ngx_posted_events);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620 static void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621 ngx_quic_congestion_lost(ngx_connection_t *c, ngx_quic_frame_t *f)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 ngx_msec_t timer;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 ngx_quic_congestion_t *cg;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
626
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 if (f->plen == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 cg = &qc->congestion;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
633
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
634 cg->in_flight -= f->plen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
635 f->plen = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
636
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
637 timer = f->last - cg->recovery_start;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
638
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
639 if ((ngx_msec_int_t) timer <= 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
640 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641 "quic congestion lost recovery win:%uz ss:%z if:%uz",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
642 cg->window, cg->ssthresh, cg->in_flight);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
643
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
644 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
647 cg->recovery_start = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
648 cg->window /= 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
649
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
650 if (cg->window < qc->tp.max_udp_payload_size * 2) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
651 cg->window = qc->tp.max_udp_payload_size * 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
652 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
654 cg->ssthresh = cg->window;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
655
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
656 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657 "quic congestion lost win:%uz ss:%z if:%uz",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658 cg->window, cg->ssthresh, cg->in_flight);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
659 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
661
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
662 void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
663 ngx_quic_set_lost_timer(ngx_connection_t *c)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
664 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
665 ngx_uint_t i;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
666 ngx_msec_t now;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
667 ngx_queue_t *q;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
668 ngx_msec_int_t lost, pto, w;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
669 ngx_quic_frame_t *f;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
670 ngx_quic_send_ctx_t *ctx;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
671 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
672
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
673 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
674 now = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
675
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
676 lost = -1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
677 pto = -1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
678
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
679 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
680 ctx = &qc->send_ctx[i];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
681
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
682 if (ngx_queue_empty(&ctx->sent)) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
683 continue;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
686 if (ctx->largest_ack != NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
687 q = ngx_queue_head(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
688 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 w = (ngx_msec_int_t) (f->last + ngx_quic_lost_threshold(qc) - now);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
691 if (f->pnum <= ctx->largest_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692 if (w < 0 || ctx->largest_ack - f->pnum >= NGX_QUIC_PKT_THR) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693 w = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
694 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
695
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696 if (lost == -1 || w < lost) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697 lost = w;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
698 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
701
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
702 q = ngx_queue_last(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704 w = (ngx_msec_int_t) (f->last + ngx_quic_pto(c, ctx) - now);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 if (w < 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707 w = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
708 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
709
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
710 if (pto == -1 || w < pto) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711 pto = w;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
712 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
713 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
714
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
715 if (qc->pto.timer_set) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
716 ngx_del_timer(&qc->pto);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
717 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
718
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
719 if (lost != -1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
720 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
721 "quic lost timer lost:%M", lost);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
722
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
723 qc->pto.handler = ngx_quic_lost_handler;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
724 ngx_add_timer(&qc->pto, lost);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
725 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
726 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
727
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
728 if (pto != -1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
729 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
730 "quic lost timer pto:%M", pto);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
731
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
732 qc->pto.handler = ngx_quic_pto_handler;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
733 ngx_add_timer(&qc->pto, pto);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
734 return;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
736
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
737 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic lost timer unset");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
738 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
739
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
740
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
741 ngx_msec_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
742 ngx_quic_pto(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
743 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
744 ngx_msec_t duration;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
745 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
746
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
747 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
748
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8792
diff changeset
749 /* RFC 9002, Appendix A.8. Setting the Loss Detection Timer */
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
750 duration = qc->avg_rtt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
752 duration += ngx_max(4 * qc->rttvar, NGX_QUIC_TIME_GRANULARITY);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
753 duration <<= qc->pto_count;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
754
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
755 if (qc->congestion.in_flight == 0) { /* no in-flight packets */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
756 return duration;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
757 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759 if (ctx->level == ssl_encryption_application && c->ssl->handshaked) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
760 duration += qc->ctp.max_ack_delay << qc->pto_count;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
761 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
762
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
763 return duration;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
764 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
765
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
766
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
767 static
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
768 void ngx_quic_lost_handler(ngx_event_t *ev)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
769 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
770 ngx_connection_t *c;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
771
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
772 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic lost timer");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
773
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
774 c = ev->data;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
775
8792
004172345bdc QUIC: persistent congestion calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8779
diff changeset
776 if (ngx_quic_detect_lost(c, NULL) != NGX_OK) {
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777 ngx_quic_close_connection(c, NGX_ERROR);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
780 ngx_quic_connstate_dbg(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
781 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785 ngx_quic_pto_handler(ngx_event_t *ev)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 ngx_uint_t i;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 ngx_msec_t now;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789 ngx_queue_t *q, *next;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790 ngx_connection_t *c;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 ngx_quic_frame_t *f;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792 ngx_quic_send_ctx_t *ctx;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
793 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic pto timer");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797 c = ev->data;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
798 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799 now = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8761
diff changeset
803 ctx = &qc->send_ctx[i];
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
804
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805 if (ngx_queue_empty(&ctx->sent)) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
806 continue;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
807 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809 q = ngx_queue_head(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
810 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
812 if (f->pnum <= ctx->largest_ack
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
813 && ctx->largest_ack != NGX_QUIC_UNSET_PN)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
814 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
815 continue;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
816 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
817
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
818 if ((ngx_msec_int_t) (f->last + ngx_quic_pto(c, ctx) - now) > 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
819 continue;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
820 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
821
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
822 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
823 "quic pto %s pto_count:%ui",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
824 ngx_quic_level_name(ctx->level), qc->pto_count);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
825
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
826 for (q = ngx_queue_head(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
827 q != ngx_queue_sentinel(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
828 /* void */)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830 next = ngx_queue_next(q);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
832
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
833 if (f->type == NGX_QUIC_FT_PING) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
834 ngx_queue_remove(q);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
835 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
836 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838 q = next;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
839 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
840
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
841 for (q = ngx_queue_head(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
842 q != ngx_queue_sentinel(&ctx->sent);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843 /* void */)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
844 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
845 next = ngx_queue_next(q);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
846 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
847
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
848 if (f->type == NGX_QUIC_FT_PING) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
849 ngx_quic_congestion_lost(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
850 ngx_queue_remove(q);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
851 ngx_quic_free_frame(c, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
852 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
853
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
854 q = next;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
855 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
856
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
857 /* enforce 2 udp datagrams */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
858
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
859 f = ngx_quic_alloc_frame(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
860 if (f == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
861 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
862 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
863
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
864 f->level = ctx->level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
865 f->type = NGX_QUIC_FT_PING;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
866 f->flush = 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
867
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
868 ngx_quic_queue_frame(qc, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870 f = ngx_quic_alloc_frame(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
871 if (f == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
872 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
873 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
874
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875 f->level = ctx->level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
876 f->type = NGX_QUIC_FT_PING;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
877
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
878 ngx_quic_queue_frame(qc, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
880
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
881 qc->pto_count++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
882
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
883 ngx_quic_connstate_dbg(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
884 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
885
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
886
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
887 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
888 ngx_quic_ack_packet(ngx_connection_t *c, ngx_quic_header_t *pkt)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
889 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
890 uint64_t base, largest, smallest, gs, ge, gap, range, pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
891 uint64_t prev_pending;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
892 ngx_uint_t i, nr;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
893 ngx_quic_send_ctx_t *ctx;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
894 ngx_quic_ack_range_t *r;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
895 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
896
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
897 c->log->action = "preparing ack";
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
899 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
900
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
901 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
902
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
903 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
904 "quic ngx_quic_ack_packet pn:%uL largest %L fr:%uL"
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 " nranges:%ui", pkt->pn, (int64_t) ctx->largest_range,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
906 ctx->first_range, ctx->nranges);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908 prev_pending = ctx->pending_ack;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910 if (pkt->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912 ngx_post_event(&qc->push, &ngx_posted_events);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
913
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
914 if (ctx->send_ack == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915 ctx->ack_delay_start = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
918 ctx->send_ack++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 if (ctx->pending_ack == NGX_QUIC_UNSET_PN
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921 || ctx->pending_ack < pkt->pn)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
923 ctx->pending_ack = pkt->pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
924 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
925 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
926
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
927 base = ctx->largest_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
928 pn = pkt->pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
930 if (base == NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
931 ctx->largest_range = pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
932 ctx->largest_received = pkt->received;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
933 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936 if (base == pn) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
939
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940 largest = base;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941 smallest = largest - ctx->first_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943 if (pn > base) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945 if (pn - base == 1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
946 ctx->first_range++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 ctx->largest_range = pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
948 ctx->largest_received = pkt->received;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
949
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
950 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
951
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
952 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
953 /* new gap in front of current largest */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955 /* no place for new range, send current range as is */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
957
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
958 if (prev_pending != NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
959 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
962 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
964 if (prev_pending == ctx->pending_ack || !pkt->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
965 ctx->pending_ack = NGX_QUIC_UNSET_PN;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
966 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
967 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
969 gap = pn - base - 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970 range = ctx->first_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
972 ctx->first_range = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
973 ctx->largest_range = pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
974 ctx->largest_received = pkt->received;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976 /* packet is out of order, force send */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
977 if (pkt->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
978 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
979 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
980
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
981 i = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
982
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
983 goto insert;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
984 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
986
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987 /* pn < base, perform lookup in existing ranges */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
988
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
989 /* packet is out of order */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
990 if (pkt->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
991 ctx->send_ack = NGX_QUIC_MAX_ACK_GAP;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
993
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
994 if (pn >= smallest && pn <= largest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
995 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
996 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
997
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998 #if (NGX_SUPPRESS_WARN)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
999 r = NULL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1000 #endif
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1001
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 for (i = 0; i < ctx->nranges; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003 r = &ctx->ranges[i];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1005 ge = smallest - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1006 gs = ge - r->gap;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1007
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1008 if (pn >= gs && pn <= ge) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1009
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1010 if (gs == ge) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1011 /* gap size is exactly one packet, now filled */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1012
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1013 /* data moves to previous range, current is removed */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1014
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015 if (i == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1016 ctx->first_range += r->range + 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1017
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1018 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1019 ctx->ranges[i - 1].range += r->range + 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1020 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1021
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1022 nr = ctx->nranges - i - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1023 if (nr) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1024 ngx_memmove(&ctx->ranges[i], &ctx->ranges[i + 1],
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1025 sizeof(ngx_quic_ack_range_t) * nr);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1026 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1027
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1028 ctx->nranges--;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1029
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1030 } else if (pn == gs) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1031 /* current gap shrinks from tail (current range grows) */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1032 r->gap--;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1033 r->range++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1034
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1035 } else if (pn == ge) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1036 /* current gap shrinks from head (previous range grows) */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1037 r->gap--;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1038
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1039 if (i == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1040 ctx->first_range++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1041
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1042 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1043 ctx->ranges[i - 1].range++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1044 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1045
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1046 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1047 /* current gap is split into two parts */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1048
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1049 gap = ge - pn - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1050 range = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1051
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1052 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1053 if (prev_pending != NGX_QUIC_UNSET_PN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1054 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1056 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1057 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1058
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1059 if (prev_pending == ctx->pending_ack || !pkt->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1060 ctx->pending_ack = NGX_QUIC_UNSET_PN;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1061 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1062 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1063
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1064 r->gap = pn - gs - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1065 goto insert;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1066 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1067
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1068 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1069 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1070
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1071 largest = smallest - r->gap - 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1072 smallest = largest - r->range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1073
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1074 if (pn >= smallest && pn <= largest) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1075 /* this packet number is already known */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1076 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1077 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1078
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1079 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1081 if (pn == smallest - 1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1082 /* extend first or last range */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084 if (i == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085 ctx->first_range++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1088 r->range++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1090
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1091 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1092 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1093
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094 /* nothing found, add new range at the tail */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1095
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1096 if (ctx->nranges == NGX_QUIC_MAX_RANGES) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1097 /* packet is too old to keep it */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1098
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1099 if (pkt->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1100 return ngx_quic_send_ack_range(c, ctx, pn, pn);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1101 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1102
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1103 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1104 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1105
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1106 gap = smallest - 2 - pn;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1107 range = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1108
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1109 insert:
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1110
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1111 if (ctx->nranges < NGX_QUIC_MAX_RANGES) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112 ctx->nranges++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115 ngx_memmove(&ctx->ranges[i + 1], &ctx->ranges[i],
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1116 sizeof(ngx_quic_ack_range_t) * (ctx->nranges - i - 1));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118 ctx->ranges[i].gap = gap;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1119 ctx->ranges[i].range = range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1120
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1121 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1122 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1123
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1124
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1126 ngx_quic_generate_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1128 ngx_msec_t delay;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1131 if (!ctx->send_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1133 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1134
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1135 if (ctx->level == ssl_encryption_application) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1136
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1137 delay = ngx_current_msec - ctx->ack_delay_start;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1138 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1139
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1140 if (ctx->send_ack < NGX_QUIC_MAX_ACK_GAP
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141 && delay < qc->tp.max_ack_delay)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1142 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1143 if (!qc->push.timer_set && !qc->closing) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144 ngx_add_timer(&qc->push,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1145 qc->tp.max_ack_delay - delay);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1149 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1151
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1152 if (ngx_quic_send_ack(c, ctx) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1153 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1154 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1155
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1156 ctx->send_ack = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1157
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1158 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1159 }