pub const DEFAULT_MTU: usize = 1200;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LinkMtu {
min_mtu: usize,
mtu: usize,
}
impl LinkMtu {
pub const fn new(min_mtu: usize) -> Self {
Self {
min_mtu,
mtu: min_mtu,
}
}
pub const fn min_mtu(self) -> usize {
self.min_mtu
}
pub const fn mtu(self) -> usize {
self.mtu
}
pub const fn set_mtu(&mut self, mtu: usize) -> Result<(), MtuTooSmall> {
if mtu < self.min_mtu {
return Err(MtuTooSmall {
mtu,
min: self.min_mtu,
});
}
self.mtu = mtu;
Ok(())
}
}
impl Default for LinkMtu {
fn default() -> Self {
Self::new(DEFAULT_MTU)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MtuTooSmall {
pub mtu: usize,
pub min: usize,
}
impl core::fmt::Display for MtuTooSmall {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"link MTU {} is smaller than its minimum {}",
self.mtu, self.min
)
}
}
impl core::error::Error for MtuTooSmall {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn link_mtu_tracks_stable_minimum_and_current_value() {
let mut mtu = LinkMtu::new(900);
assert_eq!(mtu.min_mtu(), 900);
assert_eq!(mtu.mtu(), 900);
mtu.set_mtu(1400).unwrap();
assert_eq!(mtu.min_mtu(), 900);
assert_eq!(mtu.mtu(), 1400);
assert_eq!(mtu.set_mtu(899), Err(MtuTooSmall { mtu: 899, min: 900 }));
assert_eq!(mtu.mtu(), 1400);
}
}