/** * Ordnet die ersten drei Oktette einer MAC-Adresse (OUI-Präfix) einem * Hersteller zu. Bewusst eine KLEINE, aber jeweils einzeln online * verifizierte Auswahl (nicht aus dem Gedächtnis geraten) - NICHT die * vollständige IEEE-OUI-Registrierung (die hat >50.000 Einträge). Komplett * offline zur Laufzeit, kein externer Dienst. * * Deckt bewusst die im Homelab-Kontext häufigsten "Kern"-Geräte ab: Single- * Board-Computer, NAS-Systeme und Virtualisierung. Router/Switches/IoT * wurden nicht aufgenommen, weil sich die exakten Präfixe nicht ohne * weitere ausführliche Recherche verlässlich verifizieren ließen - lieber * gar keinen Treffer als einen falschen. * * Unbekannte Präfixe liefern null, das Feld bleibt dann leer und frei * editierbar. Bereits gesetzte Werte werden nie überschrieben (siehe * Aufrufer in devices.ts). */ const OUI_VENDORS: Record = { // Raspberry Pi Foundation / Raspberry Pi Trading Ltd // Quelle: forums.raspberrypi.com/viewtopic.php?t=347926, maclookup.app/macaddress/b827eb "28CDC1": "Raspberry Pi", B827EB: "Raspberry Pi", D83ADD: "Raspberry Pi", DCA632: "Raspberry Pi", E45F01: "Raspberry Pi", // VMware (virtuelle Netzwerkkarten) // Quelle: maclookup.app/macaddress/005056, maclookup.app/macaddress/000c29 "005056": "VMware (VM)", "000C29": "VMware (VM)", // Synology // Quelle: maclookup.app/vendors/synology-incorporated "001132": "Synology", "9009D0": "Synology", // QNAP // Quelle: maclookup.app/vendors/qnap-systems-inc "245EBE": "QNAP", E843B6: "QNAP", // QEMU/KVM (Standard-Präfix für automatisch generierte VM-MACs, // u. a. von Proxmox VE verwendet) - allgemein bekannte Konvention. "525400": "QEMU/Proxmox (VM)", // Docker (docker0-Bridge-Netzwerk) - Software-Konvention, kein // IEEE-registriertes OUI, aber in der Praxis sehr zuverlässig. "0242AC": "Docker (virtuell)", }; function normalizeOui(mac: string): string | null { const cleaned = mac.replace(/[^0-9A-Fa-f]/g, "").toUpperCase(); if (cleaned.length < 6) return null; return cleaned.slice(0, 6); } export function lookupVendorFromMac(mac: string): string | null { const oui = normalizeOui(mac); if (!oui) return null; return OUI_VENDORS[oui] ?? null; }