Coverage Report

Created: 2025-07-12 06:34

/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