#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RawIpCapability {
Unsupported,
FullIpDatagram,
KernelRebuiltIpv6Header,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RawIpCapabilities {
pub ipv4: RawIpCapability,
pub ipv6: RawIpCapability,
}
pub const fn raw_ip_capabilities() -> RawIpCapabilities {
#[cfg(any(target_os = "linux", target_os = "macos"))]
{
RawIpCapabilities {
ipv4: RawIpCapability::FullIpDatagram,
ipv6: RawIpCapability::KernelRebuiltIpv6Header,
}
}
#[cfg(windows)]
{
RawIpCapabilities {
ipv4: RawIpCapability::FullIpDatagram,
ipv6: RawIpCapability::Unsupported,
}
}
#[cfg(not(any(target_os = "linux", target_os = "macos", windows)))]
{
RawIpCapabilities {
ipv4: RawIpCapability::Unsupported,
ipv6: RawIpCapability::Unsupported,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn capability_report_matches_the_compiled_platform() {
let capabilities = raw_ip_capabilities();
#[cfg(any(target_os = "linux", target_os = "macos"))]
assert_eq!(capabilities.ipv4, RawIpCapability::FullIpDatagram);
#[cfg(any(target_os = "linux", target_os = "macos"))]
assert_eq!(capabilities.ipv6, RawIpCapability::KernelRebuiltIpv6Header);
#[cfg(windows)]
assert_eq!(capabilities.ipv4, RawIpCapability::FullIpDatagram);
#[cfg(windows)]
assert_eq!(capabilities.ipv6, RawIpCapability::Unsupported);
}
}