use crate::PacketLoss;
#[derive(Debug)]
pub struct MBiaz {
lower_window_limit: f64,
upper_window_limit: f64,
interarrival_time_min: f64,
}
impl Default for MBiaz {
fn default() -> Self {
Self {
lower_window_limit: 1.0,
upper_window_limit: 1.25,
interarrival_time_min: std::f64::MAX,
}
}
}
impl MBiaz {
pub fn new(lower_window_limit: f64, upper_window_limit: f64) -> Self {
assert!(lower_window_limit <= upper_window_limit);
Self {
lower_window_limit,
upper_window_limit,
interarrival_time_min: std::f64::MAX,
}
}
pub fn classify(&mut self, interarrival_time: f64, num_lost_packets: u32) -> PacketLoss {
assert!(num_lost_packets > 0);
if interarrival_time < self.interarrival_time_min {
self.interarrival_time_min = interarrival_time;
}
let a = (num_lost_packets as f64 + self.lower_window_limit) * self.interarrival_time_min;
let b = (num_lost_packets as f64 + self.upper_window_limit) * self.interarrival_time_min;
if a <= interarrival_time && interarrival_time < b {
PacketLoss::Wireless
} else {
PacketLoss::Congestion
}
}
}