netdev 0.44.0

Cross-platform library for enumerating network interfaces with metadata.
Documentation
use crate::interface::types::InterfaceType;

pub fn guess_type_by_name(name: &str) -> Option<InterfaceType> {
    let n = name.as_bytes();

    if n == b"lo" {
        return Some(InterfaceType::Loopback);
    }
    if n.starts_with(b"wlan") || n.starts_with(b"wifi") {
        return Some(InterfaceType::Wireless80211);
    }
    if n.starts_with(b"p2p") || n.starts_with(b"swlan") {
        return Some(InterfaceType::PeerToPeerWireless);
    }
    if n.starts_with(b"rmnet")
        || n.starts_with(b"rmnet_data")
        || n.starts_with(b"ccmni")
        || n.starts_with(b"pdp")
    {
        return Some(InterfaceType::Wwanpp);
    }
    if n.starts_with(b"tun")
        || n.starts_with(b"tap")
        || n.starts_with(b"ipsec")
        || n.starts_with(b"clat")
        || n.starts_with(b"v4-")
    {
        return Some(InterfaceType::Tunnel);
    }
    if n.starts_with(b"br-") || n.starts_with(b"bridge") {
        return Some(InterfaceType::Bridge);
    }
    if n.starts_with(b"veth") {
        return Some(InterfaceType::ProprietaryVirtual);
    }

    None
}

#[cfg(test)]
mod tests {
    use super::guess_type_by_name;
    use crate::interface::types::InterfaceType;

    #[test]
    fn test_name_guess_lo() {
        assert_eq!(guess_type_by_name("lo"), Some(InterfaceType::Loopback));
    }

    #[test]
    fn test_name_guess_wlan() {
        assert_eq!(
            guess_type_by_name("wlan0"),
            Some(InterfaceType::Wireless80211)
        );
        assert_eq!(
            guess_type_by_name("wifi-aware0"),
            Some(InterfaceType::Wireless80211)
        );
    }

    #[test]
    fn test_name_guess_peer_to_peer_wireless() {
        assert_eq!(
            guess_type_by_name("p2p0"),
            Some(InterfaceType::PeerToPeerWireless)
        );
        assert_eq!(
            guess_type_by_name("swlan0"),
            Some(InterfaceType::PeerToPeerWireless)
        );
    }

    #[test]
    fn test_name_guess_cellular() {
        assert_eq!(
            guess_type_by_name("rmnet_data0"),
            Some(InterfaceType::Wwanpp)
        );
        assert_eq!(guess_type_by_name("ccmni0"), Some(InterfaceType::Wwanpp));
        assert_eq!(guess_type_by_name("pdp0"), Some(InterfaceType::Wwanpp));
    }

    #[test]
    fn test_name_guess_tunnel() {
        assert_eq!(guess_type_by_name("tun0"), Some(InterfaceType::Tunnel));
        assert_eq!(guess_type_by_name("tap0"), Some(InterfaceType::Tunnel));
        assert_eq!(guess_type_by_name("ipsec0"), Some(InterfaceType::Tunnel));
        assert_eq!(guess_type_by_name("clat4"), Some(InterfaceType::Tunnel));
        assert_eq!(guess_type_by_name("v4-wlan0"), Some(InterfaceType::Tunnel));
    }

    #[test]
    fn test_name_guess_bridge_and_virtual() {
        assert_eq!(guess_type_by_name("br-lan"), Some(InterfaceType::Bridge));
        assert_eq!(guess_type_by_name("bridge0"), Some(InterfaceType::Bridge));
        assert_eq!(
            guess_type_by_name("veth1234"),
            Some(InterfaceType::ProprietaryVirtual)
        );
    }

    #[test]
    fn test_name_guess_ambiguous_usb() {
        assert_eq!(guess_type_by_name("usb0"), None);
    }
}