/src/h2o/deps/quicly/include/quicly/loss.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2017 Fastly, Kazuho Oku |
3 | | * |
4 | | * Permission is hereby granted, free of charge, to any person obtaining a copy |
5 | | * of this software and associated documentation files (the "Software"), to |
6 | | * deal in the Software without restriction, including without limitation the |
7 | | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
8 | | * sell copies of the Software, and to permit persons to whom the Software is |
9 | | * furnished to do so, subject to the following conditions: |
10 | | * |
11 | | * The above copyright notice and this permission notice shall be included in |
12 | | * all copies or substantial portions of the Software. |
13 | | * |
14 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
15 | | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
16 | | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
17 | | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
18 | | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
19 | | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
20 | | * IN THE SOFTWARE. |
21 | | */ |
22 | | #ifndef quicly_loss_h |
23 | | #define quicly_loss_h |
24 | | |
25 | | #ifdef __cplusplus |
26 | | extern "C" { |
27 | | #endif |
28 | | |
29 | | #include <assert.h> |
30 | | #include <stddef.h> |
31 | | #include <stdint.h> |
32 | | #include "quicly/constants.h" |
33 | | #include "quicly/sentmap.h" |
34 | | |
35 | | typedef struct quicly_loss_conf_t { |
36 | | /** |
37 | | * Maximum reordering in time space before time based loss detection considers a packet lost. In percentile (1/1024) of an RTT. |
38 | | */ |
39 | | unsigned time_reordering_percentile; |
40 | | /** |
41 | | * Minimum time in the future a PTO alarm may be set for. Typically set to alarm granularity. |
42 | | */ |
43 | | uint32_t min_pto; |
44 | | /** |
45 | | * The default RTT used before an RTT sample is taken. |
46 | | */ |
47 | | uint32_t default_initial_rtt; |
48 | | /** |
49 | | * Number of speculative PTOs at the end of a window. This must not be set to more than 3. |
50 | | */ |
51 | | uint8_t num_speculative_ptos; |
52 | | } quicly_loss_conf_t; |
53 | | |
54 | | #define QUICLY_LOSS_DEFAULT_TIME_REORDERING_PERCENTILE (1024 / 8) |
55 | | |
56 | | #define QUICLY_LOSS_SPEC_CONF \ |
57 | | { \ |
58 | | QUICLY_LOSS_DEFAULT_TIME_REORDERING_PERCENTILE, /* time_reordering_percentile */ \ |
59 | | QUICLY_DEFAULT_MIN_PTO, /* min_pto */ \ |
60 | | QUICLY_DEFAULT_INITIAL_RTT, /* initial_rtt */ \ |
61 | | 0 /* number of speculative PTOs */ \ |
62 | | } |
63 | | |
64 | | #define QUICLY_LOSS_PERFORMANT_CONF \ |
65 | | { \ |
66 | | QUICLY_LOSS_DEFAULT_TIME_REORDERING_PERCENTILE, /* time_reordering_percentile */ \ |
67 | | QUICLY_DEFAULT_MIN_PTO, /* min_pto */ \ |
68 | | QUICLY_DEFAULT_INITIAL_RTT, /* initial_rtt */ \ |
69 | | 2 /* number of speculative PTOs */ \ |
70 | | } |
71 | | |
72 | | /** |
73 | | * Holds RTT variables. We use this structure differently from the specification: |
74 | | * * if the first sample has been obtained should be checked by doing: `latest != 0` |
75 | | * * smoothed and variance are available even before the first RTT sample is obtained |
76 | | */ |
77 | | typedef struct quicly_rtt_t { |
78 | | /** |
79 | | * Minimum RTT value, measured over the entire connection. |
80 | | */ |
81 | | uint32_t minimum; |
82 | | /** |
83 | | * Current smoothed RTT value. |
84 | | */ |
85 | | uint32_t smoothed; |
86 | | /** |
87 | | * Current estimate of RTT variance. |
88 | | */ |
89 | | uint32_t variance; |
90 | | /** |
91 | | * Value of the latest RTT sample. |
92 | | */ |
93 | | uint32_t latest; |
94 | | } quicly_rtt_t; |
95 | | |
96 | | static void quicly_rtt_init(quicly_rtt_t *rtt, const quicly_loss_conf_t *conf, uint32_t initial_rtt); |
97 | | static void quicly_rtt_update(quicly_rtt_t *rtt, uint32_t latest_rtt, uint32_t ack_delay); |
98 | | static uint32_t quicly_rtt_get_pto(quicly_rtt_t *rtt, uint32_t max_ack_delay, uint32_t min_pto); |
99 | | |
100 | | typedef struct quicly_loss_thresholds_t { |
101 | | /** |
102 | | * boolean |
103 | | */ |
104 | | uint8_t use_packet_based; |
105 | | /** |
106 | | * time threshold percentile, relative to RTT (i.e., 1024 is one RTT) |
107 | | */ |
108 | | uint16_t time_based_percentile; |
109 | | } quicly_loss_thresholds_t; |
110 | | |
111 | | typedef struct quicly_loss_t { |
112 | | /** |
113 | | * configuration |
114 | | */ |
115 | | const quicly_loss_conf_t *conf; |
116 | | /** |
117 | | * pointer to transport parameter containing the remote peer's max_ack_delay |
118 | | */ |
119 | | const uint16_t *max_ack_delay; |
120 | | /** |
121 | | * pointer to transport parameter containing the remote peer's ack exponent |
122 | | */ |
123 | | const uint8_t *ack_delay_exponent; |
124 | | /** |
125 | | * Controls loss thresholds. |
126 | | */ |
127 | | quicly_loss_thresholds_t thresholds; |
128 | | /** |
129 | | * The number of consecutive PTOs (PTOs that have fired without receiving an ack). |
130 | | */ |
131 | | int8_t pto_count; |
132 | | /** |
133 | | * The time the most recent packet was sent. |
134 | | */ |
135 | | int64_t time_of_last_packet_sent; |
136 | | /** |
137 | | * The largest packet number acknowledged in an ack frame, added by one (so that zero can mean "below any PN"). |
138 | | */ |
139 | | uint64_t largest_acked_packet_plus1[QUICLY_NUM_EPOCHS]; |
140 | | /** |
141 | | * Total number of application data bytes sent when the last tail occurred, not including retransmissions. |
142 | | */ |
143 | | uint64_t total_bytes_sent; |
144 | | /** |
145 | | * The time at which the next packet will be considered lost based on exceeding the reordering window in time. |
146 | | */ |
147 | | int64_t loss_time; |
148 | | /** |
149 | | * The time at when lostdetect_on_alarm should be called. |
150 | | */ |
151 | | int64_t alarm_at; |
152 | | /** |
153 | | * rtt |
154 | | */ |
155 | | quicly_rtt_t rtt; |
156 | | /** |
157 | | * sentmap |
158 | | */ |
159 | | quicly_sentmap_t sentmap; |
160 | | } quicly_loss_t; |
161 | | |
162 | | typedef void (*quicly_loss_on_detect_cb)(quicly_loss_t *loss, const quicly_sent_packet_t *lost_packet, int is_time_threshold); |
163 | | |
164 | | typedef enum quicly_loss_ack_received_kind_t { |
165 | | QUICLY_LOSS_ACK_RECEIVED_KIND_NON_ACK_ELICITING = 0, |
166 | | QUICLY_LOSS_ACK_RECEIVED_KIND_ACK_ELICITING, |
167 | | QUICLY_LOSS_ACK_RECEIVED_KIND_ACK_ELICITING_LATE_ACK, |
168 | | } quicly_loss_ack_received_kind_t; |
169 | | |
170 | | static void quicly_loss_init(quicly_loss_t *r, const quicly_loss_conf_t *conf, uint32_t initial_rtt, const uint16_t *max_ack_delay, |
171 | | const uint8_t *ack_delay_exponent); |
172 | | static void quicly_loss_dispose(quicly_loss_t *r); |
173 | | static void quicly_loss_update_alarm(quicly_loss_t *r, int64_t now, int64_t last_retransmittable_sent_at, int has_outstanding, |
174 | | int can_send_stream_data, int handshake_is_in_progress, uint64_t total_bytes_sent, |
175 | | int is_after_send); |
176 | | /** |
177 | | * called when an ACK is received |
178 | | */ |
179 | | static void quicly_loss_on_ack_received(quicly_loss_t *r, uint64_t largest_newly_acked, size_t epoch, int64_t now, int64_t sent_at, |
180 | | uint64_t ack_delay_encoded, quicly_loss_ack_received_kind_t kind); |
181 | | /* This function updates the loss detection timer and indicates to the caller how many packets should be sent. |
182 | | * After calling this function, app should: |
183 | | * * send min_packets_to_send number of packets immediately. min_packets_to_send should never be 0. |
184 | | * * if restrict_sending is true, limit sending to min_packets_to_send, otherwise as limited by congestion/flow control |
185 | | * and then call quicly_loss_update_alarm and update the alarm |
186 | | */ |
187 | | static quicly_error_t quicly_loss_on_alarm(quicly_loss_t *r, int64_t now, uint32_t max_ack_delay, int is_1rtt_only, |
188 | | size_t *min_packets_to_send, int *restrict_sending, |
189 | | quicly_loss_on_detect_cb on_loss_detected); |
190 | | /** |
191 | | * |
192 | | */ |
193 | | quicly_error_t quicly_loss_detect_loss(quicly_loss_t *r, int64_t now, uint32_t max_ack_delay, int is_1rtt_only, |
194 | | quicly_loss_on_detect_cb on_loss_detected); |
195 | | /** |
196 | | * initializes the sentmap iterator, evicting the entries considered too old. |
197 | | */ |
198 | | quicly_error_t quicly_loss_init_sentmap_iter(quicly_loss_t *loss, quicly_sentmap_iter_t *iter, int64_t now, uint32_t max_ack_delay, |
199 | | int is_closing); |
200 | | /** |
201 | | * Returns the timeout for sentmap entries. This timeout is also used as the duration of CLOSING / DRAINING state, and therefore be |
202 | | * longer than 3PTO. At the moment, the value is 4PTO. |
203 | | */ |
204 | | static int64_t quicly_loss_get_sentmap_expiration_time(quicly_loss_t *loss, uint32_t max_ack_delay); |
205 | | |
206 | | /* inline definitions */ |
207 | | |
208 | | inline void quicly_rtt_init(quicly_rtt_t *rtt, const quicly_loss_conf_t *conf, uint32_t initial_rtt) |
209 | 0 | { |
210 | 0 | rtt->minimum = UINT32_MAX; |
211 | 0 | rtt->latest = 0; |
212 | 0 | rtt->smoothed = initial_rtt; |
213 | 0 | rtt->variance = initial_rtt / 2; |
214 | 0 | } Unexecuted instantiation: driver.cc:quicly_rtt_init(quicly_rtt_t*, quicly_loss_conf_t const*, unsigned int) Unexecuted instantiation: driver_common.cc:quicly_rtt_init(quicly_rtt_t*, quicly_loss_conf_t const*, unsigned int) Unexecuted instantiation: socket.c:quicly_rtt_init Unexecuted instantiation: config.c:quicly_rtt_init Unexecuted instantiation: configurator.c:quicly_rtt_init Unexecuted instantiation: context.c:quicly_rtt_init Unexecuted instantiation: headers.c:quicly_rtt_init Unexecuted instantiation: request.c:quicly_rtt_init Unexecuted instantiation: util.c:quicly_rtt_init Unexecuted instantiation: access_log.c:quicly_rtt_init Unexecuted instantiation: file.c:quicly_rtt_init Unexecuted instantiation: mimemap.c:quicly_rtt_init Unexecuted instantiation: proxy.c:quicly_rtt_init Unexecuted instantiation: http1.c:quicly_rtt_init Unexecuted instantiation: connection.c:quicly_rtt_init Unexecuted instantiation: scheduler.c:quicly_rtt_init Unexecuted instantiation: stream.c:quicly_rtt_init Unexecuted instantiation: http2_debug_state.c:quicly_rtt_init Unexecuted instantiation: common.c:quicly_rtt_init Unexecuted instantiation: server.c:quicly_rtt_init Unexecuted instantiation: cc-reno.c:quicly_rtt_init Unexecuted instantiation: defaults.c:quicly_rtt_init Unexecuted instantiation: quicly.c:quicly_rtt_init Unexecuted instantiation: streambuf.c:quicly_rtt_init Unexecuted instantiation: http3client.c:quicly_rtt_init Unexecuted instantiation: httpclient.c:quicly_rtt_init Unexecuted instantiation: absprio.c:quicly_rtt_init Unexecuted instantiation: logconf.c:quicly_rtt_init Unexecuted instantiation: compress.c:quicly_rtt_init Unexecuted instantiation: gzip.c:quicly_rtt_init Unexecuted instantiation: headers_util.c:quicly_rtt_init Unexecuted instantiation: frame.c:quicly_rtt_init Unexecuted instantiation: qpack.c:quicly_rtt_init Unexecuted instantiation: cc-cubic.c:quicly_rtt_init Unexecuted instantiation: cc-pico.c:quicly_rtt_init Unexecuted instantiation: loss.c:quicly_rtt_init Unexecuted instantiation: http1client.c:quicly_rtt_init Unexecuted instantiation: http2client.c:quicly_rtt_init Unexecuted instantiation: driver_url.cc:quicly_rtt_init(quicly_rtt_t*, quicly_loss_conf_t const*, unsigned int) Unexecuted instantiation: driver_h3.cc:quicly_rtt_init(quicly_rtt_t*, quicly_loss_conf_t const*, unsigned int) Unexecuted instantiation: quicly_mock.c:quicly_rtt_init Unexecuted instantiation: errordoc.c:quicly_rtt_init Unexecuted instantiation: expires.c:quicly_rtt_init Unexecuted instantiation: fastcgi.c:quicly_rtt_init Unexecuted instantiation: h2olog.c:quicly_rtt_init Unexecuted instantiation: connect.c:quicly_rtt_init Unexecuted instantiation: redirect.c:quicly_rtt_init Unexecuted instantiation: reproxy.c:quicly_rtt_init Unexecuted instantiation: throttle_resp.c:quicly_rtt_init Unexecuted instantiation: self_trace.c:quicly_rtt_init Unexecuted instantiation: server_timing.c:quicly_rtt_init Unexecuted instantiation: status.c:quicly_rtt_init Unexecuted instantiation: events.c:quicly_rtt_init Unexecuted instantiation: memory.c:quicly_rtt_init Unexecuted instantiation: requests.c:quicly_rtt_init Unexecuted instantiation: ssl.c:quicly_rtt_init Unexecuted instantiation: durations.c:quicly_rtt_init Unexecuted instantiation: brotli.c:quicly_rtt_init |
215 | | |
216 | | inline void quicly_rtt_update(quicly_rtt_t *rtt, uint32_t latest_rtt, uint32_t ack_delay) |
217 | 0 | { |
218 | 0 | int is_first_sample = rtt->latest == 0; |
219 | |
|
220 | 0 | assert(latest_rtt != UINT32_MAX); |
221 | 0 | rtt->latest = latest_rtt != 0 ? latest_rtt : 1; /* Force minimum RTT sample to 1ms */ |
222 | | |
223 | | /* update min_rtt */ |
224 | 0 | if (rtt->latest < rtt->minimum) |
225 | 0 | rtt->minimum = rtt->latest; |
226 | | |
227 | | /* use ack_delay if it's a plausible value */ |
228 | 0 | if (rtt->latest > rtt->minimum + ack_delay) |
229 | 0 | rtt->latest -= ack_delay; |
230 | | |
231 | | /* update smoothed_rtt and rttvar */ |
232 | 0 | if (is_first_sample) { |
233 | 0 | rtt->smoothed = rtt->latest; |
234 | 0 | rtt->variance = rtt->latest / 2; |
235 | 0 | } else { |
236 | 0 | uint32_t absdiff = rtt->smoothed >= rtt->latest ? rtt->smoothed - rtt->latest : rtt->latest - rtt->smoothed; |
237 | 0 | rtt->variance = (rtt->variance * 3 + absdiff) / 4; |
238 | 0 | rtt->smoothed = (rtt->smoothed * 7 + rtt->latest) / 8; |
239 | 0 | } |
240 | 0 | assert(rtt->smoothed != 0); |
241 | 0 | } Unexecuted instantiation: driver.cc:quicly_rtt_update(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: driver_common.cc:quicly_rtt_update(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: socket.c:quicly_rtt_update Unexecuted instantiation: config.c:quicly_rtt_update Unexecuted instantiation: configurator.c:quicly_rtt_update Unexecuted instantiation: context.c:quicly_rtt_update Unexecuted instantiation: headers.c:quicly_rtt_update Unexecuted instantiation: request.c:quicly_rtt_update Unexecuted instantiation: util.c:quicly_rtt_update Unexecuted instantiation: access_log.c:quicly_rtt_update Unexecuted instantiation: file.c:quicly_rtt_update Unexecuted instantiation: mimemap.c:quicly_rtt_update Unexecuted instantiation: proxy.c:quicly_rtt_update Unexecuted instantiation: http1.c:quicly_rtt_update Unexecuted instantiation: connection.c:quicly_rtt_update Unexecuted instantiation: scheduler.c:quicly_rtt_update Unexecuted instantiation: stream.c:quicly_rtt_update Unexecuted instantiation: http2_debug_state.c:quicly_rtt_update Unexecuted instantiation: common.c:quicly_rtt_update Unexecuted instantiation: server.c:quicly_rtt_update Unexecuted instantiation: cc-reno.c:quicly_rtt_update Unexecuted instantiation: defaults.c:quicly_rtt_update Unexecuted instantiation: quicly.c:quicly_rtt_update Unexecuted instantiation: streambuf.c:quicly_rtt_update Unexecuted instantiation: http3client.c:quicly_rtt_update Unexecuted instantiation: httpclient.c:quicly_rtt_update Unexecuted instantiation: absprio.c:quicly_rtt_update Unexecuted instantiation: logconf.c:quicly_rtt_update Unexecuted instantiation: compress.c:quicly_rtt_update Unexecuted instantiation: gzip.c:quicly_rtt_update Unexecuted instantiation: headers_util.c:quicly_rtt_update Unexecuted instantiation: frame.c:quicly_rtt_update Unexecuted instantiation: qpack.c:quicly_rtt_update Unexecuted instantiation: cc-cubic.c:quicly_rtt_update Unexecuted instantiation: cc-pico.c:quicly_rtt_update Unexecuted instantiation: loss.c:quicly_rtt_update Unexecuted instantiation: http1client.c:quicly_rtt_update Unexecuted instantiation: http2client.c:quicly_rtt_update Unexecuted instantiation: driver_url.cc:quicly_rtt_update(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: driver_h3.cc:quicly_rtt_update(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: quicly_mock.c:quicly_rtt_update Unexecuted instantiation: errordoc.c:quicly_rtt_update Unexecuted instantiation: expires.c:quicly_rtt_update Unexecuted instantiation: fastcgi.c:quicly_rtt_update Unexecuted instantiation: h2olog.c:quicly_rtt_update Unexecuted instantiation: connect.c:quicly_rtt_update Unexecuted instantiation: redirect.c:quicly_rtt_update Unexecuted instantiation: reproxy.c:quicly_rtt_update Unexecuted instantiation: throttle_resp.c:quicly_rtt_update Unexecuted instantiation: self_trace.c:quicly_rtt_update Unexecuted instantiation: server_timing.c:quicly_rtt_update Unexecuted instantiation: status.c:quicly_rtt_update Unexecuted instantiation: events.c:quicly_rtt_update Unexecuted instantiation: memory.c:quicly_rtt_update Unexecuted instantiation: requests.c:quicly_rtt_update Unexecuted instantiation: ssl.c:quicly_rtt_update Unexecuted instantiation: durations.c:quicly_rtt_update Unexecuted instantiation: brotli.c:quicly_rtt_update |
242 | | |
243 | | inline uint32_t quicly_rtt_get_pto(quicly_rtt_t *rtt, uint32_t max_ack_delay, uint32_t min_pto) |
244 | 0 | { |
245 | 0 | return rtt->smoothed + (rtt->variance != 0 ? rtt->variance * 4 : min_pto) + max_ack_delay; |
246 | 0 | } Unexecuted instantiation: driver.cc:quicly_rtt_get_pto(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: driver_common.cc:quicly_rtt_get_pto(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: socket.c:quicly_rtt_get_pto Unexecuted instantiation: config.c:quicly_rtt_get_pto Unexecuted instantiation: configurator.c:quicly_rtt_get_pto Unexecuted instantiation: context.c:quicly_rtt_get_pto Unexecuted instantiation: headers.c:quicly_rtt_get_pto Unexecuted instantiation: request.c:quicly_rtt_get_pto Unexecuted instantiation: util.c:quicly_rtt_get_pto Unexecuted instantiation: access_log.c:quicly_rtt_get_pto Unexecuted instantiation: file.c:quicly_rtt_get_pto Unexecuted instantiation: mimemap.c:quicly_rtt_get_pto Unexecuted instantiation: proxy.c:quicly_rtt_get_pto Unexecuted instantiation: http1.c:quicly_rtt_get_pto Unexecuted instantiation: connection.c:quicly_rtt_get_pto Unexecuted instantiation: scheduler.c:quicly_rtt_get_pto Unexecuted instantiation: stream.c:quicly_rtt_get_pto Unexecuted instantiation: http2_debug_state.c:quicly_rtt_get_pto Unexecuted instantiation: common.c:quicly_rtt_get_pto Unexecuted instantiation: server.c:quicly_rtt_get_pto Unexecuted instantiation: cc-reno.c:quicly_rtt_get_pto Unexecuted instantiation: defaults.c:quicly_rtt_get_pto Unexecuted instantiation: quicly.c:quicly_rtt_get_pto Unexecuted instantiation: streambuf.c:quicly_rtt_get_pto Unexecuted instantiation: http3client.c:quicly_rtt_get_pto Unexecuted instantiation: httpclient.c:quicly_rtt_get_pto Unexecuted instantiation: absprio.c:quicly_rtt_get_pto Unexecuted instantiation: logconf.c:quicly_rtt_get_pto Unexecuted instantiation: compress.c:quicly_rtt_get_pto Unexecuted instantiation: gzip.c:quicly_rtt_get_pto Unexecuted instantiation: headers_util.c:quicly_rtt_get_pto Unexecuted instantiation: frame.c:quicly_rtt_get_pto Unexecuted instantiation: qpack.c:quicly_rtt_get_pto Unexecuted instantiation: cc-cubic.c:quicly_rtt_get_pto Unexecuted instantiation: cc-pico.c:quicly_rtt_get_pto Unexecuted instantiation: loss.c:quicly_rtt_get_pto Unexecuted instantiation: http1client.c:quicly_rtt_get_pto Unexecuted instantiation: http2client.c:quicly_rtt_get_pto Unexecuted instantiation: driver_url.cc:quicly_rtt_get_pto(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: driver_h3.cc:quicly_rtt_get_pto(quicly_rtt_t*, unsigned int, unsigned int) Unexecuted instantiation: quicly_mock.c:quicly_rtt_get_pto Unexecuted instantiation: errordoc.c:quicly_rtt_get_pto Unexecuted instantiation: expires.c:quicly_rtt_get_pto Unexecuted instantiation: fastcgi.c:quicly_rtt_get_pto Unexecuted instantiation: h2olog.c:quicly_rtt_get_pto Unexecuted instantiation: connect.c:quicly_rtt_get_pto Unexecuted instantiation: redirect.c:quicly_rtt_get_pto Unexecuted instantiation: reproxy.c:quicly_rtt_get_pto Unexecuted instantiation: throttle_resp.c:quicly_rtt_get_pto Unexecuted instantiation: self_trace.c:quicly_rtt_get_pto Unexecuted instantiation: server_timing.c:quicly_rtt_get_pto Unexecuted instantiation: status.c:quicly_rtt_get_pto Unexecuted instantiation: events.c:quicly_rtt_get_pto Unexecuted instantiation: memory.c:quicly_rtt_get_pto Unexecuted instantiation: requests.c:quicly_rtt_get_pto Unexecuted instantiation: ssl.c:quicly_rtt_get_pto Unexecuted instantiation: durations.c:quicly_rtt_get_pto Unexecuted instantiation: brotli.c:quicly_rtt_get_pto |
247 | | |
248 | | inline void quicly_loss_init(quicly_loss_t *r, const quicly_loss_conf_t *conf, uint32_t initial_rtt, const uint16_t *max_ack_delay, |
249 | | const uint8_t *ack_delay_exponent) |
250 | 0 | { |
251 | 0 | *r = (quicly_loss_t){.conf = conf, |
252 | 0 | .max_ack_delay = max_ack_delay, |
253 | 0 | .ack_delay_exponent = ack_delay_exponent, |
254 | 0 | .thresholds = {.use_packet_based = 1, .time_based_percentile = 1024 / 8 /* start from 1/8 RTT */}, |
255 | 0 | .pto_count = 0, |
256 | 0 | .time_of_last_packet_sent = 0, |
257 | 0 | .largest_acked_packet_plus1 = {0}, |
258 | 0 | .total_bytes_sent = 0, |
259 | 0 | .loss_time = INT64_MAX, |
260 | 0 | .alarm_at = INT64_MAX}; |
261 | 0 | quicly_rtt_init(&r->rtt, conf, initial_rtt); |
262 | 0 | quicly_sentmap_init(&r->sentmap); |
263 | 0 | } Unexecuted instantiation: driver.cc:quicly_loss_init(quicly_loss_t*, quicly_loss_conf_t const*, unsigned int, unsigned short const*, unsigned char const*) Unexecuted instantiation: driver_common.cc:quicly_loss_init(quicly_loss_t*, quicly_loss_conf_t const*, unsigned int, unsigned short const*, unsigned char const*) Unexecuted instantiation: socket.c:quicly_loss_init Unexecuted instantiation: config.c:quicly_loss_init Unexecuted instantiation: configurator.c:quicly_loss_init Unexecuted instantiation: context.c:quicly_loss_init Unexecuted instantiation: headers.c:quicly_loss_init Unexecuted instantiation: request.c:quicly_loss_init Unexecuted instantiation: util.c:quicly_loss_init Unexecuted instantiation: access_log.c:quicly_loss_init Unexecuted instantiation: file.c:quicly_loss_init Unexecuted instantiation: mimemap.c:quicly_loss_init Unexecuted instantiation: proxy.c:quicly_loss_init Unexecuted instantiation: http1.c:quicly_loss_init Unexecuted instantiation: connection.c:quicly_loss_init Unexecuted instantiation: scheduler.c:quicly_loss_init Unexecuted instantiation: stream.c:quicly_loss_init Unexecuted instantiation: http2_debug_state.c:quicly_loss_init Unexecuted instantiation: common.c:quicly_loss_init Unexecuted instantiation: server.c:quicly_loss_init Unexecuted instantiation: cc-reno.c:quicly_loss_init Unexecuted instantiation: defaults.c:quicly_loss_init Unexecuted instantiation: quicly.c:quicly_loss_init Unexecuted instantiation: streambuf.c:quicly_loss_init Unexecuted instantiation: http3client.c:quicly_loss_init Unexecuted instantiation: httpclient.c:quicly_loss_init Unexecuted instantiation: absprio.c:quicly_loss_init Unexecuted instantiation: logconf.c:quicly_loss_init Unexecuted instantiation: compress.c:quicly_loss_init Unexecuted instantiation: gzip.c:quicly_loss_init Unexecuted instantiation: headers_util.c:quicly_loss_init Unexecuted instantiation: frame.c:quicly_loss_init Unexecuted instantiation: qpack.c:quicly_loss_init Unexecuted instantiation: cc-cubic.c:quicly_loss_init Unexecuted instantiation: cc-pico.c:quicly_loss_init Unexecuted instantiation: loss.c:quicly_loss_init Unexecuted instantiation: http1client.c:quicly_loss_init Unexecuted instantiation: http2client.c:quicly_loss_init Unexecuted instantiation: driver_url.cc:quicly_loss_init(quicly_loss_t*, quicly_loss_conf_t const*, unsigned int, unsigned short const*, unsigned char const*) Unexecuted instantiation: driver_h3.cc:quicly_loss_init(quicly_loss_t*, quicly_loss_conf_t const*, unsigned int, unsigned short const*, unsigned char const*) Unexecuted instantiation: quicly_mock.c:quicly_loss_init Unexecuted instantiation: errordoc.c:quicly_loss_init Unexecuted instantiation: expires.c:quicly_loss_init Unexecuted instantiation: fastcgi.c:quicly_loss_init Unexecuted instantiation: h2olog.c:quicly_loss_init Unexecuted instantiation: connect.c:quicly_loss_init Unexecuted instantiation: redirect.c:quicly_loss_init Unexecuted instantiation: reproxy.c:quicly_loss_init Unexecuted instantiation: throttle_resp.c:quicly_loss_init Unexecuted instantiation: self_trace.c:quicly_loss_init Unexecuted instantiation: server_timing.c:quicly_loss_init Unexecuted instantiation: status.c:quicly_loss_init Unexecuted instantiation: events.c:quicly_loss_init Unexecuted instantiation: memory.c:quicly_loss_init Unexecuted instantiation: requests.c:quicly_loss_init Unexecuted instantiation: ssl.c:quicly_loss_init Unexecuted instantiation: durations.c:quicly_loss_init Unexecuted instantiation: brotli.c:quicly_loss_init |
264 | | |
265 | | inline void quicly_loss_dispose(quicly_loss_t *r) |
266 | 0 | { |
267 | 0 | quicly_sentmap_dispose(&r->sentmap); |
268 | 0 | } Unexecuted instantiation: driver.cc:quicly_loss_dispose(quicly_loss_t*) Unexecuted instantiation: driver_common.cc:quicly_loss_dispose(quicly_loss_t*) Unexecuted instantiation: socket.c:quicly_loss_dispose Unexecuted instantiation: config.c:quicly_loss_dispose Unexecuted instantiation: configurator.c:quicly_loss_dispose Unexecuted instantiation: context.c:quicly_loss_dispose Unexecuted instantiation: headers.c:quicly_loss_dispose Unexecuted instantiation: request.c:quicly_loss_dispose Unexecuted instantiation: util.c:quicly_loss_dispose Unexecuted instantiation: access_log.c:quicly_loss_dispose Unexecuted instantiation: file.c:quicly_loss_dispose Unexecuted instantiation: mimemap.c:quicly_loss_dispose Unexecuted instantiation: proxy.c:quicly_loss_dispose Unexecuted instantiation: http1.c:quicly_loss_dispose Unexecuted instantiation: connection.c:quicly_loss_dispose Unexecuted instantiation: scheduler.c:quicly_loss_dispose Unexecuted instantiation: stream.c:quicly_loss_dispose Unexecuted instantiation: http2_debug_state.c:quicly_loss_dispose Unexecuted instantiation: common.c:quicly_loss_dispose Unexecuted instantiation: server.c:quicly_loss_dispose Unexecuted instantiation: cc-reno.c:quicly_loss_dispose Unexecuted instantiation: defaults.c:quicly_loss_dispose Unexecuted instantiation: quicly.c:quicly_loss_dispose Unexecuted instantiation: streambuf.c:quicly_loss_dispose Unexecuted instantiation: http3client.c:quicly_loss_dispose Unexecuted instantiation: httpclient.c:quicly_loss_dispose Unexecuted instantiation: absprio.c:quicly_loss_dispose Unexecuted instantiation: logconf.c:quicly_loss_dispose Unexecuted instantiation: compress.c:quicly_loss_dispose Unexecuted instantiation: gzip.c:quicly_loss_dispose Unexecuted instantiation: headers_util.c:quicly_loss_dispose Unexecuted instantiation: frame.c:quicly_loss_dispose Unexecuted instantiation: qpack.c:quicly_loss_dispose Unexecuted instantiation: cc-cubic.c:quicly_loss_dispose Unexecuted instantiation: cc-pico.c:quicly_loss_dispose Unexecuted instantiation: loss.c:quicly_loss_dispose Unexecuted instantiation: http1client.c:quicly_loss_dispose Unexecuted instantiation: http2client.c:quicly_loss_dispose Unexecuted instantiation: driver_url.cc:quicly_loss_dispose(quicly_loss_t*) Unexecuted instantiation: driver_h3.cc:quicly_loss_dispose(quicly_loss_t*) Unexecuted instantiation: quicly_mock.c:quicly_loss_dispose Unexecuted instantiation: errordoc.c:quicly_loss_dispose Unexecuted instantiation: expires.c:quicly_loss_dispose Unexecuted instantiation: fastcgi.c:quicly_loss_dispose Unexecuted instantiation: h2olog.c:quicly_loss_dispose Unexecuted instantiation: connect.c:quicly_loss_dispose Unexecuted instantiation: redirect.c:quicly_loss_dispose Unexecuted instantiation: reproxy.c:quicly_loss_dispose Unexecuted instantiation: throttle_resp.c:quicly_loss_dispose Unexecuted instantiation: self_trace.c:quicly_loss_dispose Unexecuted instantiation: server_timing.c:quicly_loss_dispose Unexecuted instantiation: status.c:quicly_loss_dispose Unexecuted instantiation: events.c:quicly_loss_dispose Unexecuted instantiation: memory.c:quicly_loss_dispose Unexecuted instantiation: requests.c:quicly_loss_dispose Unexecuted instantiation: ssl.c:quicly_loss_dispose Unexecuted instantiation: durations.c:quicly_loss_dispose Unexecuted instantiation: brotli.c:quicly_loss_dispose |
269 | | |
270 | | inline void quicly_loss_update_alarm(quicly_loss_t *r, int64_t now, int64_t last_retransmittable_sent_at, int has_outstanding, |
271 | | int can_send_stream_data, int handshake_is_in_progress, uint64_t total_bytes_sent, |
272 | | int is_after_send) |
273 | 0 | { |
274 | 0 | if (!has_outstanding) { |
275 | | /* Do not set alarm if there's no data outstanding */ |
276 | 0 | r->alarm_at = INT64_MAX; |
277 | 0 | r->loss_time = INT64_MAX; |
278 | 0 | return; |
279 | 0 | } |
280 | 0 | assert(last_retransmittable_sent_at != INT64_MAX); |
281 | | |
282 | 0 | #define SET_ALARM(t) \ |
283 | 0 | do { \ |
284 | 0 | int64_t _t = (t); \ |
285 | 0 | if (is_after_send) { \ |
286 | 0 | assert(now < _t); \ |
287 | 0 | } else if (_t < now) { \ |
288 | 0 | _t = now; \ |
289 | 0 | } \ |
290 | 0 | r->alarm_at = _t; \ |
291 | 0 | } while (0) |
292 | | |
293 | | /* time-threshold loss detection */ |
294 | 0 | if (r->loss_time != INT64_MAX) { |
295 | 0 | SET_ALARM(r->loss_time); |
296 | 0 | return; |
297 | 0 | } |
298 | | |
299 | | /* PTO alarm */ |
300 | 0 | int64_t alarm_duration; |
301 | 0 | assert(r->pto_count < 63); |
302 | | /* Probes are sent with a modified backoff to minimize latency of recovery. For instance, with num_speculative_ptos set to |
303 | | * 2, the backoff pattern is as follows: |
304 | | * * when there's a tail: 0.25, 0.5, 1, 2, 4, 8, ... |
305 | | * * when mid-transfer: 1, 1, 1, 2, 4, 8, ... |
306 | | * The first 2 probes in this case (and num_speculative_ptos, more generally), or the probes sent when pto_count < 0, are |
307 | | * the speculative ones, which add potentially redundant retransmissions at a tail to reduce the cost of potential tail |
308 | | * losses. |
309 | | * |
310 | | * FIXME: use of `can_send_stream_data` and `bytes_sent` is not entirely correct, it does not take things like MAX_ frames |
311 | | * and pending.flows into consideration. |
312 | | */ |
313 | 0 | if (r->conf->num_speculative_ptos > 0 && r->pto_count <= 0 && !handshake_is_in_progress && !can_send_stream_data && |
314 | 0 | r->total_bytes_sent < total_bytes_sent) { |
315 | | /* New tail, defined as (i) sender is not in PTO recovery, (ii) there is no stream data to send, and |
316 | | * (iii) new application data was sent since the last tail. Move the pto_count back to kick off speculative probing. */ |
317 | 0 | if (r->pto_count == 0) |
318 | | /* kick off speculative probing if not already in progress */ |
319 | 0 | r->pto_count = -r->conf->num_speculative_ptos; |
320 | 0 | r->total_bytes_sent = total_bytes_sent; |
321 | 0 | } |
322 | 0 | if (r->pto_count < 0) { |
323 | | /* Speculative probes sent under an RTT do not need to account for ack delay, since there is no expectation |
324 | | * of an ack being received before the probe is sent. */ |
325 | 0 | alarm_duration = quicly_rtt_get_pto(&r->rtt, 0, r->conf->min_pto); |
326 | 0 | alarm_duration >>= -r->pto_count; |
327 | 0 | if (alarm_duration < r->conf->min_pto) |
328 | 0 | alarm_duration = r->conf->min_pto; |
329 | 0 | } else { |
330 | | /* Ordinary PTO. The bitshift below is fine; it would take more than a millenium to overflow either alarm_duration or |
331 | | * pto_count, even when the timer granularity is nanosecond */ |
332 | 0 | alarm_duration = quicly_rtt_get_pto(&r->rtt, handshake_is_in_progress ? 0 : *r->max_ack_delay, r->conf->min_pto); |
333 | 0 | alarm_duration <<= r->pto_count; |
334 | 0 | } |
335 | 0 | SET_ALARM(last_retransmittable_sent_at + alarm_duration); |
336 | |
|
337 | 0 | #undef SET_ALARM |
338 | 0 | } Unexecuted instantiation: driver.cc:quicly_loss_update_alarm(quicly_loss_t*, long, long, int, int, int, unsigned long, int) Unexecuted instantiation: driver_common.cc:quicly_loss_update_alarm(quicly_loss_t*, long, long, int, int, int, unsigned long, int) Unexecuted instantiation: socket.c:quicly_loss_update_alarm Unexecuted instantiation: config.c:quicly_loss_update_alarm Unexecuted instantiation: configurator.c:quicly_loss_update_alarm Unexecuted instantiation: context.c:quicly_loss_update_alarm Unexecuted instantiation: headers.c:quicly_loss_update_alarm Unexecuted instantiation: request.c:quicly_loss_update_alarm Unexecuted instantiation: util.c:quicly_loss_update_alarm Unexecuted instantiation: access_log.c:quicly_loss_update_alarm Unexecuted instantiation: file.c:quicly_loss_update_alarm Unexecuted instantiation: mimemap.c:quicly_loss_update_alarm Unexecuted instantiation: proxy.c:quicly_loss_update_alarm Unexecuted instantiation: http1.c:quicly_loss_update_alarm Unexecuted instantiation: connection.c:quicly_loss_update_alarm Unexecuted instantiation: scheduler.c:quicly_loss_update_alarm Unexecuted instantiation: stream.c:quicly_loss_update_alarm Unexecuted instantiation: http2_debug_state.c:quicly_loss_update_alarm Unexecuted instantiation: common.c:quicly_loss_update_alarm Unexecuted instantiation: server.c:quicly_loss_update_alarm Unexecuted instantiation: cc-reno.c:quicly_loss_update_alarm Unexecuted instantiation: defaults.c:quicly_loss_update_alarm Unexecuted instantiation: quicly.c:quicly_loss_update_alarm Unexecuted instantiation: streambuf.c:quicly_loss_update_alarm Unexecuted instantiation: http3client.c:quicly_loss_update_alarm Unexecuted instantiation: httpclient.c:quicly_loss_update_alarm Unexecuted instantiation: absprio.c:quicly_loss_update_alarm Unexecuted instantiation: logconf.c:quicly_loss_update_alarm Unexecuted instantiation: compress.c:quicly_loss_update_alarm Unexecuted instantiation: gzip.c:quicly_loss_update_alarm Unexecuted instantiation: headers_util.c:quicly_loss_update_alarm Unexecuted instantiation: frame.c:quicly_loss_update_alarm Unexecuted instantiation: qpack.c:quicly_loss_update_alarm Unexecuted instantiation: cc-cubic.c:quicly_loss_update_alarm Unexecuted instantiation: cc-pico.c:quicly_loss_update_alarm Unexecuted instantiation: loss.c:quicly_loss_update_alarm Unexecuted instantiation: http1client.c:quicly_loss_update_alarm Unexecuted instantiation: http2client.c:quicly_loss_update_alarm Unexecuted instantiation: driver_url.cc:quicly_loss_update_alarm(quicly_loss_t*, long, long, int, int, int, unsigned long, int) Unexecuted instantiation: driver_h3.cc:quicly_loss_update_alarm(quicly_loss_t*, long, long, int, int, int, unsigned long, int) Unexecuted instantiation: quicly_mock.c:quicly_loss_update_alarm Unexecuted instantiation: errordoc.c:quicly_loss_update_alarm Unexecuted instantiation: expires.c:quicly_loss_update_alarm Unexecuted instantiation: fastcgi.c:quicly_loss_update_alarm Unexecuted instantiation: h2olog.c:quicly_loss_update_alarm Unexecuted instantiation: connect.c:quicly_loss_update_alarm Unexecuted instantiation: redirect.c:quicly_loss_update_alarm Unexecuted instantiation: reproxy.c:quicly_loss_update_alarm Unexecuted instantiation: throttle_resp.c:quicly_loss_update_alarm Unexecuted instantiation: self_trace.c:quicly_loss_update_alarm Unexecuted instantiation: server_timing.c:quicly_loss_update_alarm Unexecuted instantiation: status.c:quicly_loss_update_alarm Unexecuted instantiation: events.c:quicly_loss_update_alarm Unexecuted instantiation: memory.c:quicly_loss_update_alarm Unexecuted instantiation: requests.c:quicly_loss_update_alarm Unexecuted instantiation: ssl.c:quicly_loss_update_alarm Unexecuted instantiation: durations.c:quicly_loss_update_alarm Unexecuted instantiation: brotli.c:quicly_loss_update_alarm |
339 | | |
340 | | inline void quicly_loss_on_ack_received(quicly_loss_t *r, uint64_t largest_newly_acked, size_t epoch, int64_t now, int64_t sent_at, |
341 | | uint64_t ack_delay_encoded, quicly_loss_ack_received_kind_t kind) |
342 | 0 | { |
343 | | /* Reset PTO count if anything is newly acked, and if sender is not speculatively probing at a tail */ |
344 | 0 | if (largest_newly_acked != UINT64_MAX && r->pto_count > 0) |
345 | 0 | r->pto_count = 0; |
346 | | |
347 | | /* If largest newly acked is not larger than before, skip RTT sample */ |
348 | 0 | if (largest_newly_acked == UINT64_MAX || r->largest_acked_packet_plus1[epoch] > largest_newly_acked) |
349 | 0 | return; |
350 | 0 | r->largest_acked_packet_plus1[epoch] = largest_newly_acked + 1; |
351 | | |
352 | | /* If ack does not acknowledge any ack-eliciting packet, skip RTT sample */ |
353 | 0 | if (kind == QUICLY_LOSS_ACK_RECEIVED_KIND_NON_ACK_ELICITING) |
354 | 0 | return; |
355 | | |
356 | | /* Decode ack delay */ |
357 | 0 | uint64_t ack_delay_microsecs = ack_delay_encoded << *r->ack_delay_exponent; |
358 | 0 | uint32_t ack_delay_millisecs = (uint32_t)((ack_delay_microsecs * 2 + 1000) / 2000); |
359 | | /* use min(ack_delay, max_ack_delay) as the ack delay */ |
360 | 0 | if (ack_delay_millisecs > *r->max_ack_delay) |
361 | 0 | ack_delay_millisecs = *r->max_ack_delay; |
362 | 0 | quicly_rtt_update(&r->rtt, (uint32_t)(now - sent_at), ack_delay_millisecs); |
363 | | |
364 | | /* Adjust loss detection thresholds when receiving a late ack. The strategy is, for each ACK carrying a late ack, first disable |
365 | | * packet-based detection, then double the time-based threshold until it reaches 1 RTT. */ |
366 | 0 | if (kind == QUICLY_LOSS_ACK_RECEIVED_KIND_ACK_ELICITING_LATE_ACK) { |
367 | 0 | if (r->thresholds.use_packet_based) { |
368 | 0 | r->thresholds.use_packet_based = 0; |
369 | 0 | } else { |
370 | 0 | if ((r->thresholds.time_based_percentile *= 2) > 1024) |
371 | 0 | r->thresholds.time_based_percentile = 1024; |
372 | 0 | } |
373 | 0 | } |
374 | 0 | } Unexecuted instantiation: driver.cc:quicly_loss_on_ack_received(quicly_loss_t*, unsigned long, unsigned long, long, long, unsigned long, quicly_loss_ack_received_kind_t) Unexecuted instantiation: driver_common.cc:quicly_loss_on_ack_received(quicly_loss_t*, unsigned long, unsigned long, long, long, unsigned long, quicly_loss_ack_received_kind_t) Unexecuted instantiation: socket.c:quicly_loss_on_ack_received Unexecuted instantiation: config.c:quicly_loss_on_ack_received Unexecuted instantiation: configurator.c:quicly_loss_on_ack_received Unexecuted instantiation: context.c:quicly_loss_on_ack_received Unexecuted instantiation: headers.c:quicly_loss_on_ack_received Unexecuted instantiation: request.c:quicly_loss_on_ack_received Unexecuted instantiation: util.c:quicly_loss_on_ack_received Unexecuted instantiation: access_log.c:quicly_loss_on_ack_received Unexecuted instantiation: file.c:quicly_loss_on_ack_received Unexecuted instantiation: mimemap.c:quicly_loss_on_ack_received Unexecuted instantiation: proxy.c:quicly_loss_on_ack_received Unexecuted instantiation: http1.c:quicly_loss_on_ack_received Unexecuted instantiation: connection.c:quicly_loss_on_ack_received Unexecuted instantiation: scheduler.c:quicly_loss_on_ack_received Unexecuted instantiation: stream.c:quicly_loss_on_ack_received Unexecuted instantiation: http2_debug_state.c:quicly_loss_on_ack_received Unexecuted instantiation: common.c:quicly_loss_on_ack_received Unexecuted instantiation: server.c:quicly_loss_on_ack_received Unexecuted instantiation: cc-reno.c:quicly_loss_on_ack_received Unexecuted instantiation: defaults.c:quicly_loss_on_ack_received Unexecuted instantiation: quicly.c:quicly_loss_on_ack_received Unexecuted instantiation: streambuf.c:quicly_loss_on_ack_received Unexecuted instantiation: http3client.c:quicly_loss_on_ack_received Unexecuted instantiation: httpclient.c:quicly_loss_on_ack_received Unexecuted instantiation: absprio.c:quicly_loss_on_ack_received Unexecuted instantiation: logconf.c:quicly_loss_on_ack_received Unexecuted instantiation: compress.c:quicly_loss_on_ack_received Unexecuted instantiation: gzip.c:quicly_loss_on_ack_received Unexecuted instantiation: headers_util.c:quicly_loss_on_ack_received Unexecuted instantiation: frame.c:quicly_loss_on_ack_received Unexecuted instantiation: qpack.c:quicly_loss_on_ack_received Unexecuted instantiation: cc-cubic.c:quicly_loss_on_ack_received Unexecuted instantiation: cc-pico.c:quicly_loss_on_ack_received Unexecuted instantiation: loss.c:quicly_loss_on_ack_received Unexecuted instantiation: http1client.c:quicly_loss_on_ack_received Unexecuted instantiation: http2client.c:quicly_loss_on_ack_received Unexecuted instantiation: driver_url.cc:quicly_loss_on_ack_received(quicly_loss_t*, unsigned long, unsigned long, long, long, unsigned long, quicly_loss_ack_received_kind_t) Unexecuted instantiation: driver_h3.cc:quicly_loss_on_ack_received(quicly_loss_t*, unsigned long, unsigned long, long, long, unsigned long, quicly_loss_ack_received_kind_t) Unexecuted instantiation: quicly_mock.c:quicly_loss_on_ack_received Unexecuted instantiation: errordoc.c:quicly_loss_on_ack_received Unexecuted instantiation: expires.c:quicly_loss_on_ack_received Unexecuted instantiation: fastcgi.c:quicly_loss_on_ack_received Unexecuted instantiation: h2olog.c:quicly_loss_on_ack_received Unexecuted instantiation: connect.c:quicly_loss_on_ack_received Unexecuted instantiation: redirect.c:quicly_loss_on_ack_received Unexecuted instantiation: reproxy.c:quicly_loss_on_ack_received Unexecuted instantiation: throttle_resp.c:quicly_loss_on_ack_received Unexecuted instantiation: self_trace.c:quicly_loss_on_ack_received Unexecuted instantiation: server_timing.c:quicly_loss_on_ack_received Unexecuted instantiation: status.c:quicly_loss_on_ack_received Unexecuted instantiation: events.c:quicly_loss_on_ack_received Unexecuted instantiation: memory.c:quicly_loss_on_ack_received Unexecuted instantiation: requests.c:quicly_loss_on_ack_received Unexecuted instantiation: ssl.c:quicly_loss_on_ack_received Unexecuted instantiation: durations.c:quicly_loss_on_ack_received Unexecuted instantiation: brotli.c:quicly_loss_on_ack_received |
375 | | |
376 | | inline quicly_error_t quicly_loss_on_alarm(quicly_loss_t *r, int64_t now, uint32_t max_ack_delay, int is_1rtt_only, |
377 | | size_t *min_packets_to_send, int *restrict_sending, |
378 | | quicly_loss_on_detect_cb on_loss_detected) |
379 | 0 | { |
380 | 0 | r->alarm_at = INT64_MAX; |
381 | 0 | *min_packets_to_send = 1; |
382 | 0 | if (r->loss_time != INT64_MAX) { |
383 | | /* Time threshold loss detection. Send at least 1 packet, but no restrictions on sending otherwise. */ |
384 | 0 | *restrict_sending = 0; |
385 | 0 | return quicly_loss_detect_loss(r, now, max_ack_delay, is_1rtt_only, on_loss_detected); |
386 | 0 | } |
387 | | /* PTO. Send at least and at most 1 packet during speculative probing and 2 packets otherwise. */ |
388 | 0 | ++r->pto_count; |
389 | 0 | *restrict_sending = 1; |
390 | 0 | if (r->pto_count > 0) |
391 | 0 | *min_packets_to_send = 2; |
392 | |
|
393 | 0 | return 0; |
394 | 0 | } Unexecuted instantiation: driver.cc:quicly_loss_on_alarm(quicly_loss_t*, long, unsigned int, int, unsigned long*, int*, void (*)(quicly_loss_t*, st_quicly_sent_packet_t const*, int)) Unexecuted instantiation: driver_common.cc:quicly_loss_on_alarm(quicly_loss_t*, long, unsigned int, int, unsigned long*, int*, void (*)(quicly_loss_t*, st_quicly_sent_packet_t const*, int)) Unexecuted instantiation: socket.c:quicly_loss_on_alarm Unexecuted instantiation: config.c:quicly_loss_on_alarm Unexecuted instantiation: configurator.c:quicly_loss_on_alarm Unexecuted instantiation: context.c:quicly_loss_on_alarm Unexecuted instantiation: headers.c:quicly_loss_on_alarm Unexecuted instantiation: request.c:quicly_loss_on_alarm Unexecuted instantiation: util.c:quicly_loss_on_alarm Unexecuted instantiation: access_log.c:quicly_loss_on_alarm Unexecuted instantiation: file.c:quicly_loss_on_alarm Unexecuted instantiation: mimemap.c:quicly_loss_on_alarm Unexecuted instantiation: proxy.c:quicly_loss_on_alarm Unexecuted instantiation: http1.c:quicly_loss_on_alarm Unexecuted instantiation: connection.c:quicly_loss_on_alarm Unexecuted instantiation: scheduler.c:quicly_loss_on_alarm Unexecuted instantiation: stream.c:quicly_loss_on_alarm Unexecuted instantiation: http2_debug_state.c:quicly_loss_on_alarm Unexecuted instantiation: common.c:quicly_loss_on_alarm Unexecuted instantiation: server.c:quicly_loss_on_alarm Unexecuted instantiation: cc-reno.c:quicly_loss_on_alarm Unexecuted instantiation: defaults.c:quicly_loss_on_alarm Unexecuted instantiation: quicly.c:quicly_loss_on_alarm Unexecuted instantiation: streambuf.c:quicly_loss_on_alarm Unexecuted instantiation: http3client.c:quicly_loss_on_alarm Unexecuted instantiation: httpclient.c:quicly_loss_on_alarm Unexecuted instantiation: absprio.c:quicly_loss_on_alarm Unexecuted instantiation: logconf.c:quicly_loss_on_alarm Unexecuted instantiation: compress.c:quicly_loss_on_alarm Unexecuted instantiation: gzip.c:quicly_loss_on_alarm Unexecuted instantiation: headers_util.c:quicly_loss_on_alarm Unexecuted instantiation: frame.c:quicly_loss_on_alarm Unexecuted instantiation: qpack.c:quicly_loss_on_alarm Unexecuted instantiation: cc-cubic.c:quicly_loss_on_alarm Unexecuted instantiation: cc-pico.c:quicly_loss_on_alarm Unexecuted instantiation: loss.c:quicly_loss_on_alarm Unexecuted instantiation: http1client.c:quicly_loss_on_alarm Unexecuted instantiation: http2client.c:quicly_loss_on_alarm Unexecuted instantiation: driver_url.cc:quicly_loss_on_alarm(quicly_loss_t*, long, unsigned int, int, unsigned long*, int*, void (*)(quicly_loss_t*, st_quicly_sent_packet_t const*, int)) Unexecuted instantiation: driver_h3.cc:quicly_loss_on_alarm(quicly_loss_t*, long, unsigned int, int, unsigned long*, int*, void (*)(quicly_loss_t*, st_quicly_sent_packet_t const*, int)) Unexecuted instantiation: quicly_mock.c:quicly_loss_on_alarm Unexecuted instantiation: errordoc.c:quicly_loss_on_alarm Unexecuted instantiation: expires.c:quicly_loss_on_alarm Unexecuted instantiation: fastcgi.c:quicly_loss_on_alarm Unexecuted instantiation: h2olog.c:quicly_loss_on_alarm Unexecuted instantiation: connect.c:quicly_loss_on_alarm Unexecuted instantiation: redirect.c:quicly_loss_on_alarm Unexecuted instantiation: reproxy.c:quicly_loss_on_alarm Unexecuted instantiation: throttle_resp.c:quicly_loss_on_alarm Unexecuted instantiation: self_trace.c:quicly_loss_on_alarm Unexecuted instantiation: server_timing.c:quicly_loss_on_alarm Unexecuted instantiation: status.c:quicly_loss_on_alarm Unexecuted instantiation: events.c:quicly_loss_on_alarm Unexecuted instantiation: memory.c:quicly_loss_on_alarm Unexecuted instantiation: requests.c:quicly_loss_on_alarm Unexecuted instantiation: ssl.c:quicly_loss_on_alarm Unexecuted instantiation: durations.c:quicly_loss_on_alarm Unexecuted instantiation: brotli.c:quicly_loss_on_alarm |
395 | | |
396 | | inline int64_t quicly_loss_get_sentmap_expiration_time(quicly_loss_t *loss, uint32_t max_ack_delay) |
397 | 0 | { |
398 | 0 | return quicly_rtt_get_pto(&loss->rtt, max_ack_delay, loss->conf->min_pto) * 4; |
399 | 0 | } Unexecuted instantiation: driver.cc:quicly_loss_get_sentmap_expiration_time(quicly_loss_t*, unsigned int) Unexecuted instantiation: driver_common.cc:quicly_loss_get_sentmap_expiration_time(quicly_loss_t*, unsigned int) Unexecuted instantiation: socket.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: config.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: configurator.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: context.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: headers.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: request.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: util.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: access_log.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: file.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: mimemap.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: proxy.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: http1.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: connection.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: scheduler.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: stream.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: http2_debug_state.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: common.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: server.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: cc-reno.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: defaults.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: quicly.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: streambuf.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: http3client.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: httpclient.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: absprio.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: logconf.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: compress.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: gzip.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: headers_util.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: frame.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: qpack.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: cc-cubic.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: cc-pico.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: loss.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: http1client.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: http2client.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: driver_url.cc:quicly_loss_get_sentmap_expiration_time(quicly_loss_t*, unsigned int) Unexecuted instantiation: driver_h3.cc:quicly_loss_get_sentmap_expiration_time(quicly_loss_t*, unsigned int) Unexecuted instantiation: quicly_mock.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: errordoc.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: expires.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: fastcgi.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: h2olog.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: connect.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: redirect.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: reproxy.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: throttle_resp.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: self_trace.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: server_timing.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: status.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: events.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: memory.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: requests.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: ssl.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: durations.c:quicly_loss_get_sentmap_expiration_time Unexecuted instantiation: brotli.c:quicly_loss_get_sentmap_expiration_time |
400 | | |
401 | | #ifdef __cplusplus |
402 | | } |
403 | | #endif |
404 | | |
405 | | #endif |