pub trait Controller:
Send
+ Sync
+ Debug {
Show 14 methods
// Required methods
fn on_congestion_event(
&mut self,
now: Instant,
sent: Instant,
is_persistent_congestion: bool,
is_ecn: bool,
lost_bytes: u64,
largest_lost_pn: u64,
);
fn on_mtu_update(&mut self, new_mtu: u16);
fn window(&self) -> u64;
fn clone_box(&self) -> Box<dyn Controller>;
fn initial_window(&self) -> u64;
fn into_any(self: Box<Self>) -> Box<dyn Any>;
// Provided methods
fn on_sent(&mut self, now: Instant, bytes: u64, largest_pn: u64) { ... }
fn on_packet_sent(&mut self, now: Instant, bytes: u16, pn: u64) { ... }
fn on_ack(
&mut self,
now: Instant,
sent: Instant,
bytes: u64,
pn: u64,
app_limited: bool,
rtt: &RttEstimator,
) { ... }
fn on_end_acks(
&mut self,
now: Instant,
in_flight: u64,
app_limited: bool,
largest_packet_num_acked: Option<u64>,
) { ... }
fn on_packet_lost(&mut self, lost_bytes: u16, pn: u64, now: Instant) { ... }
fn on_spurious_congestion_event(&mut self) { ... }
fn on_ack_frequency_update(
&mut self,
ack_eliciting_threshold: u64,
requested_max_ack_delay: Duration,
) { ... }
fn metrics(&self) -> ControllerMetrics { ... }
}Expand description
Common interface for different congestion controllers
Required Methods§
Sourcefn on_congestion_event(
&mut self,
now: Instant,
sent: Instant,
is_persistent_congestion: bool,
is_ecn: bool,
lost_bytes: u64,
largest_lost_pn: u64,
)
fn on_congestion_event( &mut self, now: Instant, sent: Instant, is_persistent_congestion: bool, is_ecn: bool, lost_bytes: u64, largest_lost_pn: u64, )
Packets were deemed lost or marked congested
in_persistent_congestion indicates whether all packets sent within the persistent
congestion threshold period ending when the most recent packet in this batch was sent were
lost.
lost_bytes indicates how many bytes were lost. This value will be 0 for ECN triggers.
largest_lost_pn indicates the packet number of the packet with the highest packet number
in the congestion event.
Sourcefn on_mtu_update(&mut self, new_mtu: u16)
fn on_mtu_update(&mut self, new_mtu: u16)
The known MTU for the current network path has been updated
Sourcefn clone_box(&self) -> Box<dyn Controller>
fn clone_box(&self) -> Box<dyn Controller>
Duplicate the controller’s state
Sourcefn initial_window(&self) -> u64
fn initial_window(&self) -> u64
Initial congestion window
Provided Methods§
Sourcefn on_sent(&mut self, now: Instant, bytes: u64, largest_pn: u64)
fn on_sent(&mut self, now: Instant, bytes: u64, largest_pn: u64)
One or more packets were just sent
Sourcefn on_packet_sent(&mut self, now: Instant, bytes: u16, pn: u64)
fn on_packet_sent(&mut self, now: Instant, bytes: u16, pn: u64)
One packet was just sent
Sourcefn on_ack(
&mut self,
now: Instant,
sent: Instant,
bytes: u64,
pn: u64,
app_limited: bool,
rtt: &RttEstimator,
)
fn on_ack( &mut self, now: Instant, sent: Instant, bytes: u64, pn: u64, app_limited: bool, rtt: &RttEstimator, )
Packet deliveries were confirmed
app_limited indicates whether the connection was blocked on outgoing
application data prior to receiving these acknowledgements.
Sourcefn on_end_acks(
&mut self,
now: Instant,
in_flight: u64,
app_limited: bool,
largest_packet_num_acked: Option<u64>,
)
fn on_end_acks( &mut self, now: Instant, in_flight: u64, app_limited: bool, largest_packet_num_acked: Option<u64>, )
Packets are acked in batches, all with the same now argument. This indicates one of those batches has completed.
Sourcefn on_packet_lost(&mut self, lost_bytes: u16, pn: u64, now: Instant)
fn on_packet_lost(&mut self, lost_bytes: u16, pn: u64, now: Instant)
One packet was just lost
Sourcefn on_spurious_congestion_event(&mut self)
fn on_spurious_congestion_event(&mut self)
Packets were incorrectly deemed lost
This function is called when all packets that were deemed lost (for instance because of packet reordering) are acknowledged after the congestion event was raised.
Sourcefn on_ack_frequency_update(
&mut self,
ack_eliciting_threshold: u64,
requested_max_ack_delay: Duration,
)
fn on_ack_frequency_update( &mut self, ack_eliciting_threshold: u64, requested_max_ack_delay: Duration, )
The peer’s ACK-frequency parameters have changed
ack_eliciting_threshold is the number of ack-eliciting packets the peer may receive
before being required to send an immediate ACK (per the QUIC ACK frequency extension).
requested_max_ack_delay is the maximum delay we asked the peer to wait before sending
an ACK when the threshold hasn’t been reached.
Controllers can use this to refine estimates that depend on peer ACK behavior (e.g. BBR’s offload budget).
Sourcefn metrics(&self) -> ControllerMetrics
fn metrics(&self) -> ControllerMetrics
Retrieve implementation-specific metrics used to populate qlog traces when they are enabled
This is also used to alter the pacing of the connection with
pacing_rate and send_quantum