- El servicio EthernetTracker de Android solo reconoce interfaces de red con nombres
ethX
- El controlador de Ethernet CDC de Linux crea los nombres de interfaz como
usbX
- Por esto, los dispositivos Ethernet CDC estándar no se activan automáticamente en Android
- Para resolverlo, el usuario debe rootear el teléfono y cambiar el valor de
config_ethernet_iface_regex
- En la práctica, la opción realista es usar solo productos con chipsets específicos que tengan controladores específicos del proveedor, en lugar de adaptadores USB Ethernet estándar compatibles con la norma
Introducción y resumen del problema
- La causa principal de que CDC Ethernet no funcione en dispositivos Android es la regla de nombres de las interfaces
- A nivel de sistema sí existe soporte para adaptadores USB Ethernet, pero las condiciones para que se active el menú de Ethernet tienen restricciones
- Es difícil obtener información sobre chipsets compatibles y, en la práctica, la situación depende de los "rumores" entre usuarios
- Android también está basado en el kernel de Linux, pero no todo se decide solo con la configuración del kernel
Depuración USB y configuración de ADB
- En un dispositivo Android es necesario activar la depuración USB e instalar ADB
- Para probar un adaptador de red, hay que cambiar ADB a modo de red por Wi‑Fi
- Mediante comandos se puede verificar la versión del kernel y la arquitectura actuales
Cómo verificar la versión y la configuración del kernel
- Los teléfonos recientes (Android 11 o superior) usan una estructura de kernel GKI (Generic Kernel Image)
- Google compila el kernel base y el fabricante solo agrega módulos
- En ese archivo de configuración del kernel (
gki_defconfig) se pueden revisar las funciones compatibles
- En teléfonos antiguos, hay que buscar el archivo defconfig en el código fuente del kernel que publica cada fabricante
- Si hay suerte, también se puede revisar directamente la configuración actual del kernel en
/proc/config.gz
Cómo comprobar qué adaptadores USB Ethernet están soportados
- La mayoría de las opciones relevantes del kernel tienen la forma
CONFIG_USB_NET_XXX
- Si es
y, está integrado; si es m, está compilado como módulo (probablemente usable); si aparece como is not set, no hay soporte
- En el archivo
drivers/net/usb/Kconfig se puede consultar la descripción de cada opción
- Aun así, rara vez se muestra con claridad la información del chipset del adaptador
Ethernet CDC (Communications Device Class) y su uso en Android
- CDC es un estándar de red por USB que ofrece varios protocolos como EEM/ECM/NCM
- En Linux, Windows y macOS, los dispositivos Ethernet CDC estándar se reconocen automáticamente sin controladores adicionales
- Android también tiene esos controladores compilados a nivel de kernel
- Ejemplo: dispositivos Samsung con
CONFIG_USB_NET_CDCETHER, EEM y NCM configurados como y
- Sin embargo, el menú de Ethernet sigue desactivado
Lógica de seguimiento de interfaces de red en Android
- Android usa la clase EthernetTracker.java para detectar interfaces de red
- EthernetTracker, cuando aparece una nueva interfaz, comprueba si su nombre coincide con un patrón (expresión regular)
- El criterio de coincidencia se toma del recurso
config_ethernet_iface_regex
- El valor predeterminado es
eth\\d (solo son válidas las interfaces de red que empiezan con eth y terminan en un número)
- El nombre que genera el kernel (
usb0) no coincide con ese patrón, así que se ignora al rastrearlo y activarlo
Limitaciones de la solución y conclusión
- El usuario no puede cambiar directamente esta expresión regular de nombres (sin root es imposible)
- Como resultado, aunque se conecten productos Ethernet CDC estándar, no pueden usarse desde el menú de red
- En cambio, sí pueden funcionar algunos adaptadores que se registran directamente mediante controladores del proveedor o del chipset
- Aunque Google incluya en el kernel código de soporte estándar como el módulo EEM, en la práctica no funciona
- Es un problema simple que se resolvería, al menos, cambiando la expresión regular a
(eth|usb)\\d, pero por ahora sigue igual
Resumen
- Causa principal: Android no está ignorando el estándar CDC Ethernet como tal; el problema es que el nombre de la interfaz de red no coincide con la expresión regular (
eth\\d), por lo que no se activa
- Forma de evitarlo: hay que rootear el teléfono y cambiar el valor de
config_ethernet_iface_regex a algo como (eth|usb)\\d
- Elección realista: más que usar adaptadores con soporte estándar USB CDC, la alternativa práctica es elegir productos cuyo controlador esté claramente vinculado a un chipset específico
- Problema estructural: este caso muestra cómo una política deficiente de nombres en la capa superior del software se convierte en una limitación del sistema en términos de visibilidad para el usuario y compatibilidad con estándares
1 comentarios
Comentarios de Hacker News
ethX; aclara que no lo probó personalmente ni actualizó la publicación con ese dato, que hoy casi no usa dispositivos Android, y agrega que este método solo sirve si puedes controlar la dirección MACeth\da*, por lo que se supone que el problema quedó resuelto; comparte un enlace al cambio de código relacionado y explica que, desde Android U+ (probablemente la versión 14), por defecto ya incluye tantousb\d+comoeth%dusbX", y que poco después volvió a aplicarse, pero solo para Android V+ (una versión nueva); también adjunta un enlace sobre la reversión y un enlace a la aplicación finalethX; explica que las distribuciones Linux ya habían resuelto este problema desde los años 2000, recuerda lo incómodo que era tener que revisar todo el sistema porque muchos drivers usaban su propio prefijo de nombre, y comenta que hoy las distribuciones Linux renombran automáticamente las interfaces de red con herramientas como udev, proceso que funciona mediante la llamada ioctlSIOCSIFNAMEdel kernel; además, añade que los kernels modernos incluso ofrecen la comodidad de asignar números automáticamente a nombres comowlan*owlan%dconfig_ethernet_iface_regexmás que rootear el teléfono</i>", y sostiene que esa es otra razón por la que el acceso root es importante en dispositivos que poseeifupfalla; la UI de Android no muestra en absoluto esta situación y solo se ve el problema revisando los logs dedmesg; no están seguros de si esto también aplica a dispositivos CDC, pero cuentan que muchos dongles USB Ethernet usaban chipsets Realtek o Kawasaki y había casos que requerían firmware; suponen que este cambio en Android es reciente, pero como pudieron usar bien dongles de red USB en un dispositivo de depuración con AOSP vanilla, sospechan que podría ser una convención de nombres del lado del kernel o del driver CDC; en cualquier caso, recomiendan fijarse en el chipset del dongle y en si necesita firmware