use crate::PacketLoss;
#[derive(Debug)]
pub struct Trend {
previous_rott: f64,
gamma: f64,
s_threshold: f64,
s_f: f64,
}
impl Default for Trend {
fn default() -> Self {
Self {
previous_rott: 0.0,
gamma: 1.0 / 30.0,
s_threshold: 0.4,
s_f: 0.0,
}
}
}
impl Trend {
pub fn new(gamma: f64, s_threshold: f64) -> Self {
assert!(0.0 <= gamma && gamma <= 1.0);
assert!(0.0 <= s_threshold && s_threshold <= 1.0);
Self {
previous_rott: 0.0,
gamma,
s_threshold,
s_f: 0.0,
}
}
pub fn classify(&mut self, rott: f64) -> PacketLoss {
assert!(rott >= 0.0);
self.s_f = (1.0 - self.gamma) * self.s_f;
if rott > self.previous_rott {
self.s_f += self.gamma;
}
self.previous_rott = rott;
if self.s_threshold < self.s_f {
PacketLoss::Congestion
} else {
PacketLoss::Wireless
}
}
}