use std::collections::HashMap; // Base OUI simplifiée — préfixes MAC 3 octets → constructeur // Source : IEEE OUI registry (vendeurs les plus courants en homelab) pub fn lookup(mac: &str) -> Option<&'static str> { let prefix = mac.to_uppercase().replace('-', ":").chars().take(8).collect::(); OUI_MAP.get(prefix.as_str()).copied() } static OUI_MAP: std::sync::LazyLock> = std::sync::LazyLock::new(|| { HashMap::from([ // Apple ("00:17:F2", "Apple"), ("00:1E:52", "Apple"), ("00:23:32", "Apple"), ("00:25:00", "Apple"), ("00:26:B9", "Apple"), ("3C:15:C2", "Apple"), ("DC:A4:CA", "Apple"), ("F4:5C:89", "Apple"), ("A8:BE:27", "Apple"), // Raspberry Pi ("B8:27:EB", "Raspberry Pi Foundation"), ("DC:A6:32", "Raspberry Pi Ltd"), ("E4:5F:01", "Raspberry Pi Ltd"), // Intel ("00:1B:21", "Intel"), ("00:1F:3B", "Intel"), ("8C:EC:4B", "Intel"), ("AC:FD:CE", "Intel"), // Ubiquiti ("00:15:6D", "Ubiquiti"), ("00:27:22", "Ubiquiti"), ("04:18:D6", "Ubiquiti"), ("24:A4:3C", "Ubiquiti"), ("44:D9:E7", "Ubiquiti"), ("68:72:51", "Ubiquiti"), ("78:8A:20", "Ubiquiti"), ("80:2A:A8", "Ubiquiti"), ("DC:9F:DB", "Ubiquiti"), ("F0:9F:C2", "Ubiquiti"), ("FC:EC:DA", "Ubiquiti"), // TP-Link ("00:1D:0F", "TP-Link"), ("14:CC:20", "TP-Link"), ("50:C7:BF", "TP-Link"), ("54:A7:03", "TP-Link"), ("60:32:B1", "TP-Link"), ("98:DA:C4", "TP-Link"), ("C4:E9:84", "TP-Link"), ("EC:08:6B", "TP-Link"), // Netgear ("00:09:5B", "Netgear"), ("00:14:6C", "Netgear"), ("00:1B:2F", "Netgear"), ("20:4E:7F", "Netgear"), ("28:C6:8E", "Netgear"), ("A0:40:A0", "Netgear"), // Cisco ("00:0B:BE", "Cisco"), ("00:1A:A1", "Cisco"), ("00:1E:49", "Cisco"), ("00:23:AC", "Cisco"), ("00:25:45", "Cisco"), ("00:26:99", "Cisco"), ("58:AC:78", "Cisco"), ("7C:AD:74", "Cisco"), // Synology ("00:11:32", "Synology"), ("BC:14:EF", "Synology"), // QNAP ("00:08:9B", "QNAP"), ("24:5E:BE", "QNAP"), // Dell ("00:14:22", "Dell"), ("00:1A:A0", "Dell"), ("00:1C:23", "Dell"), ("00:21:70", "Dell"), ("14:18:77", "Dell"), ("18:66:DA", "Dell"), ("D4:BE:D9", "Dell"), ("F0:1F:AF", "Dell"), // HP / Hewlett-Packard ("00:17:08", "HP"), ("00:1C:C4", "HP"), ("3C:D9:2B", "HP"), ("70:10:6F", "HP"), ("98:E7:F4", "HP"), ("B4:99:BA", "HP"), // Proxmox VE (virtual MAC range) ("BC:24:11", "Proxmox VE"), // VMware ("00:0C:29", "VMware"), ("00:50:56", "VMware"), ("00:05:69", "VMware"), // Amazon / AWS ("0A:FE:1A", "Amazon"), ("02:42:AC", "Docker (bridge)"), // Samsung ("00:16:32", "Samsung"), ("00:21:19", "Samsung"), ("00:23:39", "Samsung"), ("2C:AE:2B", "Samsung"), ("94:35:0A", "Samsung"), // ASUS ("00:1A:92", "ASUS"), ("00:1D:60", "ASUS"), ("00:26:18", "ASUS"), ("10:BF:48", "ASUS"), ("AC:22:0B", "ASUS"), // Mikrotik ("00:0C:42", "MikroTik"), ("4C:5E:0C", "MikroTik"), // Xiaomi ("28:6C:07", "Xiaomi"), ("34:CE:00", "Xiaomi"), ("50:64:2B", "Xiaomi"), // Google ("F4:F5:D8", "Google"), ("54:60:09", "Google"), // Espressif (ESP32/ESP8266 IoT) ("24:0A:C4", "Espressif"), ("30:AE:A4", "Espressif"), ("3C:71:BF", "Espressif"), ("58:BF:25", "Espressif"), ("84:CC:A8", "Espressif"), ("A4:CF:12", "Espressif"), ("B4:E6:2D", "Espressif"), ("EC:62:60", "Espressif"), // Arduino / Melchior ("04:E9:E5", "Arduino"), ]) });