use std::time::{Duration, SystemTime};
use crate::event::PacketMeta;
const MAX_KERNEL_RX_LAG: Duration = Duration::from_secs(1);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub(crate) struct ReceiveMeta {
pub(crate) traffic_class: Option<u8>,
pub(crate) kernel_rx_timestamp: Option<SystemTime>,
}
impl ReceiveMeta {
pub(crate) fn preferred_receive_wall(&self, userspace_wall: SystemTime) -> SystemTime {
let Some(kernel_wall) = self.kernel_rx_timestamp else {
return userspace_wall;
};
match userspace_wall.duration_since(kernel_wall) {
Ok(lag) if lag <= MAX_KERNEL_RX_LAG => kernel_wall,
_ => userspace_wall,
}
}
}
impl From<ReceiveMeta> for PacketMeta {
fn from(meta: ReceiveMeta) -> Self {
Self {
traffic_class: meta.traffic_class,
dscp: meta.traffic_class.map(|traffic_class| traffic_class >> 2),
ecn: meta.traffic_class.map(|traffic_class| traffic_class & 0b11),
kernel_rx_timestamp: meta.kernel_rx_timestamp,
}
}
}