use crate::time::Instant;
use super::RttEstimator;
pub(super) mod no_control;
#[cfg(feature = "socket-tcp-cubic")]
pub(super) mod cubic;
#[cfg(feature = "socket-tcp-reno")]
pub(super) mod reno;
#[allow(unused_variables)]
pub(super) trait Controller {
fn window(&self) -> usize;
fn set_remote_window(&mut self, remote_window: usize) {}
fn on_ack(&mut self, now: Instant, len: usize, rtt: &RttEstimator) {}
fn on_retransmit(&mut self, now: Instant) {}
fn on_duplicate_ack(&mut self, now: Instant) {}
fn pre_transmit(&mut self, now: Instant) {}
fn post_transmit(&mut self, now: Instant, len: usize) {}
fn set_mss(&mut self, mss: usize) {}
}
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(super) enum AnyController {
None(no_control::NoControl),
#[cfg(feature = "socket-tcp-reno")]
Reno(reno::Reno),
#[cfg(feature = "socket-tcp-cubic")]
Cubic(cubic::Cubic),
}
impl AnyController {
#[allow(unreachable_code)]
#[inline]
pub fn new() -> Self {
#[cfg(feature = "socket-tcp-cubic")]
{
return AnyController::Cubic(cubic::Cubic::new());
}
#[cfg(feature = "socket-tcp-reno")]
{
return AnyController::Reno(reno::Reno::new());
}
AnyController::None(no_control::NoControl)
}
#[inline]
pub fn inner_mut(&mut self) -> &mut dyn Controller {
match self {
AnyController::None(n) => n,
#[cfg(feature = "socket-tcp-reno")]
AnyController::Reno(r) => r,
#[cfg(feature = "socket-tcp-cubic")]
AnyController::Cubic(c) => c,
}
}
#[inline]
pub fn inner(&self) -> &dyn Controller {
match self {
AnyController::None(n) => n,
#[cfg(feature = "socket-tcp-reno")]
AnyController::Reno(r) => r,
#[cfg(feature = "socket-tcp-cubic")]
AnyController::Cubic(c) => c,
}
}
}