Skip to main content

netdev/net/db/
oui.rs

1use crate::net::mac::MacAddr;
2
3/// Known MAC address prefixes commonly assigned to virtualized environments.
4pub const KNOWN_VM_MAC_PREFIXES: &[&str] = &[
5    "00:05:69", // VMware
6    "00:0C:29", // VMware
7    "00:1C:14", // VMware
8    "00:50:56", // VMware
9    "00:03:FF", // Microsoft Hyper-V
10    "00:1C:42", // Parallels Desktop
11    "00:0F:4B", // Virtual Iron 4
12    "00:16:3E", // Xen or Oracle VM
13    "08:00:27", // VirtualBox
14    "02:42:AC", // Docker Container
15];
16
17/// Known MAC addresses used by loopback-style adapters.
18pub const KNOWN_LOOPBACK_MAC_ADDRESSES: &[&str] = &[
19    "00:00:00:00:00:00", // Default
20    "02:00:4C:4F:4F:50", // Npcap Loopback Adapter, Microsoft Loopback Adapter
21];
22
23/// Returns `true` when the MAC address matches a known virtual-machine prefix.
24///
25/// This is a heuristic and may not cover every virtualization platform.
26pub fn is_virtual_mac(mac: &MacAddr) -> bool {
27    let mac = mac.address();
28    let prefix = mac[0..8].to_uppercase();
29    KNOWN_VM_MAC_PREFIXES.contains(&prefix.as_str())
30}
31
32/// Returns `true` when the MAC address matches a known loopback adapter address.
33pub fn is_known_loopback_mac(mac: &MacAddr) -> bool {
34    let mac = mac.address();
35    KNOWN_LOOPBACK_MAC_ADDRESSES.contains(&mac.to_uppercase().as_str())
36}
37
38#[cfg(test)]
39mod tests {
40    use crate::net::db::oui;
41    use crate::net::mac::MacAddr;
42
43    #[test]
44    fn detects_loopback() {
45        let mac: MacAddr = "00:00:00:00:00:00".parse().unwrap();
46        assert!(oui::is_known_loopback_mac(&mac));
47    }
48
49    #[test]
50    fn detects_virtual() {
51        let mac: MacAddr = "00:50:56:AA:BB:CC".parse().unwrap();
52        assert!(oui::is_virtual_mac(&mac));
53    }
54}