Coverage Report

Created: 2026-01-10 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/h2o/deps/quicly/include/quicly/rate.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2021 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
23
#ifndef quicly_rate_h
24
#define quicly_rate_h
25
26
#include <stdint.h>
27
#include "quicly/ranges.h"
28
29
#ifdef __cplusplus
30
extern "C" {
31
#endif
32
33
#ifndef QUICLY_DELIVERY_RATE_SAMPLE_PERIOD
34
/**
35
 * sampling period of delivery rate, in milliseconds
36
 */
37
0
#define QUICLY_DELIVERY_RATE_SAMPLE_PERIOD 50
38
#endif
39
40
#ifndef QUICLY_DELIVERY_RATE_SAMPLE_COUNT
41
/**
42
 * number of samples to retain (and to calculate average from)
43
 */
44
#define QUICLY_DELIVERY_RATE_SAMPLE_COUNT 10
45
#endif
46
47
struct st_quicly_rate_sample_t {
48
    uint32_t elapsed;
49
    uint32_t bytes_acked;
50
};
51
52
/**
53
 * State used for estimating the delivery rate.
54
 */
55
typedef struct st_quicly_ratemeter_t {
56
    /**
57
     * ring buffer retaining the most recent samples
58
     */
59
    struct {
60
        struct st_quicly_rate_sample_t entries[QUICLY_DELIVERY_RATE_SAMPLE_COUNT];
61
        size_t latest;
62
    } past_samples;
63
    /**
64
     * packet number range within which the flow has been CWND-limited
65
     */
66
    quicly_range_t pn_cwnd_limited;
67
    /**
68
     * Current sample being collected, if any. When running, `start.at` and `start.bytes_acked` retains the values at the start of
69
     * the current sampling period. When not, `start.at` is set to INT64_MAX, and `sample` is zero-cleared.
70
     */
71
    struct {
72
        struct {
73
            int64_t at;
74
            uint64_t bytes_acked;
75
        } start;
76
        struct st_quicly_rate_sample_t sample;
77
    } current;
78
} quicly_ratemeter_t;
79
80
/**
81
 * Estimated delivery rate, in bytes / second.
82
 */
83
typedef struct st_quicly_rate_t {
84
    uint64_t latest;
85
    uint64_t smoothed;
86
    uint64_t stdev;
87
} quicly_rate_t;
88
89
/**
90
 *
91
 */
92
void quicly_ratemeter_init(quicly_ratemeter_t *meter);
93
/**
94
 * returns if currently marked as CC-limited
95
 */
96
static int quicly_ratemeter_is_cc_limited(quicly_ratemeter_t *meter);
97
/**
98
 * Notifies the estimator that the flow is becoming CC-limited at the point of sending packets *starting* from packet number `pn`.
99
 */
100
void quicly_ratemeter_enter_cc_limited(quicly_ratemeter_t *meter, uint64_t pn);
101
/**
102
 * Notifies that the estimator that the flow is exiting from CC-limited when the packet number of the next packet will be `pn`.
103
 */
104
void quicly_ratemeter_exit_cc_limited(quicly_ratemeter_t *meter, uint64_t pn);
105
/**
106
 * Given three values, update the estimation.
107
 * @param bytes_acked  total number of bytes being acked from the beginning of the connection; i.e.,
108
 *                     `quicly_stats_t::num_bytes.ack_received`
109
 */
110
void quicly_ratemeter_on_ack(quicly_ratemeter_t *meter, int64_t now, uint64_t bytes_acked, uint64_t pn);
111
/**
112
 * Returns the delivery rate estimate
113
 */
114
void quicly_ratemeter_report(quicly_ratemeter_t *meter, quicly_rate_t *rate);
115
116
/* inline definitions */
117
118
inline int quicly_ratemeter_is_cc_limited(quicly_ratemeter_t *meter)
119
0
{
120
0
    return meter->pn_cwnd_limited.start != UINT64_MAX && meter->pn_cwnd_limited.end == UINT64_MAX;
121
0
}
Unexecuted instantiation: driver.cc:quicly_ratemeter_is_cc_limited(st_quicly_ratemeter_t*)
Unexecuted instantiation: driver_common.cc:quicly_ratemeter_is_cc_limited(st_quicly_ratemeter_t*)
Unexecuted instantiation: socket.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: config.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: configurator.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: context.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: headers.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: request.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: util.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: access_log.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: file.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: mimemap.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: proxy.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: http1.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: connection.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: scheduler.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: stream.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: http2_debug_state.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: common.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: server.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: cc-reno.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: defaults.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: quicly.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: rate.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: streambuf.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: http3client.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: httpclient.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: absprio.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: logconf.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: compress.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: gzip.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: headers_util.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: frame.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: qpack.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: cc-cubic.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: cc-pico.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: http1client.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: http2client.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: pipe_sender.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: driver_url.cc:quicly_ratemeter_is_cc_limited(st_quicly_ratemeter_t*)
Unexecuted instantiation: driver_h3.cc:quicly_ratemeter_is_cc_limited(st_quicly_ratemeter_t*)
Unexecuted instantiation: quicly_mock.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: errordoc.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: expires.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: fastcgi.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: h2olog.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: connect.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: redirect.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: reproxy.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: throttle_resp.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: self_trace.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: server_timing.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: status.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: events.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: memory.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: requests.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: ssl.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: durations.c:quicly_ratemeter_is_cc_limited
Unexecuted instantiation: brotli.c:quicly_ratemeter_is_cc_limited
122
123
#ifdef __cplusplus
124
}
125
#endif
126
127
#endif