- Le service EthernetTracker d’Android ne reconnaît que les interfaces réseau nommées
ethX
- Le pilote Linux pour Ethernet CDC crée les interfaces sous la forme
usbX
- À cause de cela, les périphériques Ethernet CDC standard ne s’activent pas automatiquement sur Android
- Pour contourner ce problème, l’utilisateur doit rooter le téléphone et modifier la valeur
config_ethernet_iface_regex
- En pratique, la solution réaliste consiste à utiliser non pas un adaptateur USB Ethernet standard conforme à la norme, mais des produits à chipset spécifique disposant d’un pilote propre au fournisseur
Introduction et aperçu du problème
- La raison principale pour laquelle Ethernet CDC ne fonctionne pas sur les appareils Android tient à la règle de nommage des interfaces
- Le système prend en charge les adaptateurs USB Ethernet, mais l’activation du menu Ethernet est soumise à certaines contraintes
- Il est difficile d’obtenir des informations sur les chipsets compatibles et, en pratique, on dépend souvent du « bouche-à-oreille » entre utilisateurs
- Android repose bien sur le noyau Linux, mais tout ne se décide pas uniquement via la configuration du noyau
Débogage USB et configuration d’ADB
- Il faut activer le débogage USB puis installer ADB sur l’appareil Android
- Pour tester un adaptateur réseau, il faut basculer ADB en mode réseau via le Wi-Fi
- Des commandes permettent de vérifier la version du noyau et l’architecture actuelles
Comment vérifier la version et la configuration du noyau
- Les téléphones récents (Android 11 et plus) utilisent une architecture de noyau GKI (Generic Kernel Image)
- Google compile le noyau de base, puis le fabricant n’ajoute que des modules
- Il est possible d’identifier les fonctionnalités prises en charge à partir du fichier de configuration du noyau correspondant (
gki_defconfig)
- Sur les anciens téléphones, il faut consulter les sources du noyau fournies par le constructeur et y chercher le fichier
defconfig
- Avec un peu de chance, on peut aussi vérifier directement la configuration actuelle du noyau via
/proc/config.gz
Comment vérifier les adaptateurs USB Ethernet pris en charge
- La plupart des paramètres de configuration du noyau concernés sont de la forme
CONFIG_USB_NET_XXX
y signifie intégré, m signifie compilé en module (donc probablement utilisable), is not set signifie non pris en charge
- On peut se référer au fichier
drivers/net/usb/Kconfig pour la description de chaque option
- Les informations sur le chipset de l’adaptateur restent malgré tout rarement indiquées clairement
Ethernet CDC (Communications Device Class) et son cas sur Android
- CDC est une norme USB pour la mise en réseau qui propose plusieurs protocoles comme EEM/ECM/NCM
- Sous Linux, Windows et macOS, les périphériques Ethernet CDC standard sont reconnus automatiquement sans pilote supplémentaire
- Android aussi compile les pilotes correspondants au niveau du noyau
- Exemple : sur certains appareils Samsung,
CONFIG_USB_NET_CDCETHER, EEM et NCM sont tous définis à y
- Pourtant, le menu Ethernet reste désactivé
Logique de suivi des interfaces réseau sur Android
- Android utilise la classe
EthernetTracker.java pour détecter les interfaces réseau
- Lorsqu’une nouvelle interface apparaît, EthernetTracker vérifie si son nom correspond à un motif (expression régulière)
- Le critère de correspondance provient d’une ressource (
config_ethernet_iface_regex)
- La valeur par défaut est
eth\\d (seules les interfaces réseau commençant par eth et suivies d’un chiffre sont valides)
- Le nom généré par le noyau (
usb0) ne correspond pas à ce motif et est donc ignoré lors du suivi et de l’activation
Limites de la solution et conclusion
- Cette expression régulière de nommage ne peut pas être modifiée directement par l’utilisateur (impossible sans root)
- En conséquence, les produits Ethernet CDC standard ne peuvent pas être utilisés depuis le menu réseau, même lorsqu’ils sont connectés
- À l’inverse, seuls certains adaptateurs enregistrés directement via un pilote fournisseur ou un pilote spécifique au chipset peuvent fonctionner
- Même si Google inclut dans le noyau le code de prise en charge standard, comme le module EEM, cela ne permet pas un fonctionnement réel en pratique
- C’est un problème simple qui serait résolu au minimum en remplaçant l’expression régulière par
(eth|usb)\\d, mais la situation n’a pas changé à ce jour
Résumé
- Cause principale : Android n’ignore pas la norme Ethernet CDC en elle-même ; l’activation échoue parce que le nom de l’interface réseau ne correspond pas à l’expression régulière (
eth\\d)
- Contournement : il faut rooter le téléphone puis modifier la valeur
config_ethernet_iface_regex vers quelque chose comme (eth|usb)\\d
- Choix réaliste : plutôt qu’un adaptateur USB CDC standard, il est plus pragmatique de choisir un produit dont l’intégration pilote est clairement définie pour un chipset donné
- Problème structurel : c’est un exemple où la politique de nommage dans la couche logicielle supérieure devient une limite systémique en matière de visibilité pour l’utilisateur et de compatibilité avec les standards
1 commentaires
Avis Hacker News
ethX, mais qu’il n’a ni testé lui-même cette méthode ni mis à jour son billet en conséquence, et qu’il utilise de toute façon très peu d’appareils Android aujourd’hui ; il ajoute que cette méthode ne fonctionne que si l’on peut contrôler l’adresse MACeth\dà*, ce qui aurait résolu le problème ; le lien vers la modification du code est donné, avec l’explication qu’à partir d’Android U+ (probablement la version 14),usb\d+eteth%dsont pris en charge par défautusbX», puis réintroduite en ne visant plus qu’Android V+ (nouvelle version) ; les liens sur le rollback et sur l’application finale sont aussi jointsEthernetTrackerd’Android ne reconnaisse que les interfaces nomméesethX; rappel que les distributions Linux avaient déjà réglé ce problème dans les années 2000 ; autrefois, chaque pilote utilisait souvent son propre préfixe de nom, obligeant à inspecter tout le système ; aujourd’hui, les distributions Linux renomment automatiquement les interfaces réseau avec des outils commeudev, au moyen de l’appel ioctlSIOCSIFNAMEdu noyau ; il est ajouté que les noyaux récents offrent même la commodité d’attribuer automatiquement un numéro à des noms commewlan*ouwlan%dconfig_ethernet_iface_regexque de rooter le téléphone</i> », en affirmant que c’est une raison supplémentaire pour laquelle l’accès root reste important sur les appareils qu’il possèdeifupéchoue ; l’interface Android n’affiche absolument pas cette situation, et il faut consulter les logsdmesgpour comprendre le problème ; l’auteur n’est pas certain que cela s’applique aux appareils CDC, mais beaucoup de dongles USB Ethernet utilisaient surtout des chipsets Realtek ou Kawasaki, et il y a déjà eu des cas nécessitant un firmware ; ce changement côté Android semble récent, mais sur des appareils de débogage AOSP vanilla, des dongles réseau USB fonctionnaient bien, d’où l’hypothèse que le problème venait peut-être des conventions de nommage du noyau ou du pilote CDC ; conclusion : il faut de toute façon prêter attention au chipset du dongle et à l’éventuel besoin de firmware