- Der EthernetTracker-Dienst von Android erkennt nur Netzwerk-Interfaces mit dem Namen
ethX
- Der CDC-Ethernet-Treiber von Linux erstellt Interface-Namen als
usbX
- Dadurch werden standardkonforme CDC-Ethernet-Geräte unter Android nicht automatisch aktiviert
- Um das zu beheben, muss der Nutzer das Smartphone selbst rooten und den Wert
config_ethernet_iface_regex ändern
- Praktisch realistisch ist es, nicht standardkonforme USB-Ethernet-Adapter zu verwenden, sondern nur Produkte mit bestimmten Chipsätzen mit vendorspezifischen Treibern
Einleitung und Problemüberblick
- Der zentrale Grund, warum CDC Ethernet auf Android-Geräten nicht funktioniert, ist die Benennungsregel für Interfaces
- Systemseitig wird USB-Ethernet zwar unterstützt, aber die Bedingungen für die Aktivierung des Ethernet-Menüs sind eingeschränkt
- Informationen zu kompatiblen Chipsätzen sind schwer zu bekommen, und praktisch ist man auf "Mundpropaganda" unter Nutzern angewiesen
- Auch Android basiert auf dem Linux-Kernel, aber nicht alles wird allein durch die Kernel-Konfiguration entschieden
USB-Debugging und ADB-Einrichtung
- Auf dem Android-Gerät müssen USB-Debugging aktiviert und ADB installiert werden
- Um einen Netzwerkadapter zu testen, muss ADB in den Netzwerkmodus über Wi-Fi umgeschaltet werden
- Per Kommando lassen sich die aktuelle Kernel-Version und Architektur prüfen
So prüft man Kernel-Version und Konfiguration
- Neuere Smartphones (Android 11 und höher) verwenden die GKI(Generic Kernel Image)-Kernel-Struktur
- Google baut den Basiskernel, und der Hersteller fügt nur Module hinzu
- In der zugehörigen Kernel-Konfigurationsdatei (
gki_defconfig) lassen sich unterstützte Funktionen erkennen
- Bei älteren Smartphones muss man in den jeweils vom Hersteller bereitgestellten Kernel-Quellen nach der Datei
defconfig suchen
- Mit etwas Glück kann man die aktuelle Kernel-Konfiguration auch direkt unter
/proc/config.gz prüfen
So erkennt man unterstützte USB-Ethernet-Adapter
- Die meisten relevanten Kernel-Konfigurationswerte haben die Form
CONFIG_USB_NET_XXX
y bedeutet eingebaut, m bedeutet als Modul gebaut (wahrscheinlich nutzbar), is not set bedeutet keine Unterstützung
- In der Datei
drivers/net/usb/Kconfig kann man die Beschreibung der einzelnen Konfigurationswerte nachlesen
- Informationen zum Adapter-Chipsatz werden dennoch nur selten klar ausgewiesen
CDC Ethernet (Communications Device Class) und seine Anwendung unter Android
- CDC ist ein USB-Networking-Standard und bietet verschiedene Protokolle wie EEM/ECM/NCM
- Unter Linux, Windows und macOS werden standardkonforme CDC-Ethernet-Geräte ohne separaten Treiber automatisch erkannt
- Auch unter Android sind die zugehörigen Treiber auf Kernel-Ebene gebaut
- Beispiel: Samsung-Geräte, bei denen
CONFIG_USB_NET_CDCETHER, EEM und NCM alle auf y gesetzt sind
- Trotzdem bleibt das Ethernet-Menü weiterhin deaktiviert
Die Logik zur Verfolgung von Netzwerk-Interfaces in Android
- Android verwendet zur Erkennung von Netzwerk-Interfaces die Klasse
EthernetTracker.java
EthernetTracker führt beim Auftauchen eines neuen Interfaces ein Matching anhand eines Namensmusters (regulärer Ausdruck) durch
- Das Matching-Kriterium wird aus der Ressource
config_ethernet_iface_regex übernommen
- Der Standardwert ist
eth\\d (nur Netzwerk-Interfaces, die mit eth beginnen und auf die eine Zahl folgt, sind gültig)
- Der vom Kernel erzeugte Name (
usb0) passt nicht zu diesem Muster und wird deshalb bei Verfolgung und Aktivierung ignoriert
Einschränkungen der Lösung und Fazit
- Diesen Benennungs-RegEx kann der Nutzer nicht direkt ändern (ohne Root nicht möglich)
- Dadurch können standardkonforme CDC-Ethernet-Produkte zwar verbunden werden, sind aber im Netzwerk-Menü nicht nutzbar
- Umgekehrt funktionieren nur einige Adapter, die direkt über Vendor- oder Chipsatz-Treiber registriert werden
- Selbst wenn Google standardmäßigen Support-Code wie das EEM-Modul in den Kernel aufnimmt, ist der praktische Betrieb nicht möglich
- Es wäre ein einfaches Problem zu lösen, wenn der reguläre Ausdruck zumindest auf
(eth|usb)\\d geändert würde, aber derzeit bleibt es unverändert
Zusammenfassung
- Kernursache: Android ignoriert den CDC-Ethernet-Standard nicht, sondern aktiviert ihn nicht, weil der Netzwerk-Interface-Name nicht zum regulären Ausdruck (
eth\\d) passt
- Workaround: Das Smartphone muss gerootet und der Wert
config_ethernet_iface_regex auf etwas wie (eth|usb)\\d geändert werden
- Praktische Wahl: Statt eines standardkonformen USB-CDC-Adapters ist es realistischer, ein Produkt zu wählen, bei dem die Treiberanbindung pro Chipsatz klar ist
- Strukturelles Problem: Dieses Beispiel zeigt, wie eine unzureichende Benennungspolitik im höheren Software-Stack im Hinblick auf Nutzersichtbarkeit und Standardkompatibilität zu einer systemischen Einschränkung wird
1 Kommentare
Hacker-News-Kommentare
ethX-Namensschema vergibt, wenn man ein bestimmtes Bit der MAC-Adresse ändert. Er selbst habe das weder direkt getestet noch in den Beitrag übernommen und nutze Android-Geräte heute kaum noch. Zusätzlich der Hinweis, dass diese Methode nur funktioniert, wenn man die MAC-Adresse kontrollieren kann.eth\\dauf*geändert worden zu sein, wodurch das Problem vermutlich behoben wurde. Dazu ein Link zur Code-Änderung. Ab Android U+ (vermutlich Version 14) seien damit standardmäßig sowohlusb\\d+als aucheth%deingeschlossen.usbX-Interfaces machen“; kurz darauf sei sie erneut eingepflegt worden, diesmal nur für Android V+ (eine neuere Version). Ergänzt um einen Link zum Rollback und einen Link zur finalen Übernahme.ethXbenannt sind; Linux-Distributionen hätten dieses Problem bereits in den 2000er Jahren gelöst. Rückblick darauf, dass es mühsam war, das ganze System zu durchsuchen, weil viele Treiber ihr eigenes Namenspräfix verwendeten. Heutige Linux-Distributionen benennen Netzwerkschnittstellen mit Tools wieudevautomatisch um; das funktioniere über denSIOCSIFNAME-ioctl-Aufruf des Kernels. Ergänzend der Hinweis, dass moderne Kernel sogar die bequeme automatische Nummerierung für Namen wiewlan*oderwlan%dbieten.config_ethernet_iface_regexzu ändern, bleibt außer Rooten des Telefons keine andere Möglichkeit</i>“, verbunden mit der Aussage, dass dies ein weiterer Grund sei, warum Root-Zugriff auf eigenen Geräten wichtig ist.ifup, wenn die notwendige Firmware nicht vorhanden ist. Die Android-Oberfläche zeige diesen Zustand überhaupt nicht an; das Problem sei nur indmesgsichtbar. Ob das auch für CDC-Geräte gilt, sei unklar, aber viele USB-Ethernet-Dongles hätten auf Realtek- oder Kawasaki-Chipsätzen basiert, bei denen es solche Firmware-Anforderungen gab. Die Android-Änderung scheine zwar jüngeren Datums zu sein, aber auf einem unveränderten AOSP-Debug-Gerät hätten USB-Netzwerk-Dongles gut funktioniert, daher liege die Vermutung eher bei den Namenskonventionen des Kernels oder des CDC-Treibers. Fazit: Auf Chipsatz und eventuellen Firmware-Bedarf des Dongles sollte man achten.