3#define QUIC_MAX_VARINT ((1ULL << 62) - 1)
4#define QUIC_FRAME_MAX_DATA 0x10
5#define QUIC_FRAME_MAX_STREAM_DATA 0x11
36static size_t varint_size(
uint64_t value) {
37 if (value < (1ULL << 6))
return 1;
38 if (value < (1ULL << 14))
return 2;
39 if (value < (1ULL << 30))
return 4;
57 for (
i = size;
i-- > 0; value >>= 8) buf[
i] = (
uint8_t)value;
59 buf[0] |= (
uint8_t)((size == 1 ? 0 : size == 2 ? 1 : size == 4 ? 2 : 3) << 6);
130 .stream_id = stream_id,
184 else if (fc->
srtt_us <= 150000)
186 else if (fc->
srtt_us <= 500000)
215 sfc->stream_window_size *= 2;
247 if (
sfc)
sfc->stream_consumed = saturating_add(
sfc->stream_consumed, bytes);
274 if (!fc || !buf || !
written)
return -1;
316 if (!fc || !
sfc || !buf || !
written)
return -1;
318 !should_update(
sfc->stream_consumed,
sfc->max_stream_data,
sfc->stream_window_size))
321 maximum = saturating_add(
sfc->stream_consumed,
sfc->stream_window_size);
328 write_varint(buf + 1,
sfc->stream_id,
id_size);
void quic_flow_control_consume_conn(quic_conn_fc_t *fc, uint64_t bytes)
Account for connection-level flow control bytes consumed by the peer.
#define QUIC_FRAME_MAX_DATA
void quic_flow_control_update_rtt(quic_conn_fc_t *fc, uint64_t rtt_sample_us)
Feed an RTT sample into the smoothed RTT estimator and re-evaluate quality.
void quic_flow_control_init(quic_conn_fc_t *fc, uint64_t initial_conn_window, uint64_t initial_stream_window, uint64_t max_conn_window, uint64_t max_stream_window)
Initialize the connection-level flow control state.
int quic_flow_control_maybe_send_max_stream_data(quic_conn_fc_t *fc, quic_stream_fc_t *sfc, uint8_t *buf, size_t buf_len, size_t *written, bool force)
Write a MAX_STREAM_DATA frame if the stream limit should be raised.
quic_net_quality_t quic_flow_control_evaluate_quality(quic_conn_fc_t *fc)
Recompute the network quality class from the smoothed RTT.
int quic_flow_control_maybe_send_max_data(quic_conn_fc_t *fc, uint8_t *buf, size_t buf_len, size_t *written, bool force)
Write a MAX_DATA frame if the connection limit should be raised.
void quic_flow_control_consume_stream(quic_conn_fc_t *fc, quic_stream_fc_t *sfc, uint64_t bytes)
Account for stream-level flow control bytes consumed by the peer.
void quic_stream_fc_init(quic_stream_fc_t *sfc, uint64_t stream_id, uint64_t initial_stream_window)
Initialize the flow control state for a single stream.
void quic_flow_control_adjust_windows(quic_conn_fc_t *fc, quic_stream_fc_t *sfc)
Grow flow control windows when the network quality is degraded.
#define QUIC_FRAME_MAX_STREAM_DATA
struct quic_conn_fc quic_conn_fc_t
@ QUIC_NET_QUALITY_NORMAL
@ QUIC_NET_QUALITY_HIGH_RTT
@ QUIC_NET_QUALITY_EXCELLENT
struct quic_stream_fc quic_stream_fc_t
#define QUIC_FLOW_CONTROL_MIN_INITIAL_WINDOW
uint64_t stream_max_window
uint64_t conn_window_size
quic_net_quality_t quality