Pruebas de unidades de red del kernel

Desde Android 5.0, el funcionamiento adecuado de la pila de redes de Android en los kernels de Linux requiere varios commits que se incorporaron recientemente o que aún no se incorporaron. No es fácil verificar manualmente la funcionalidad del kernel requerida ni hacer un seguimiento de las confirmaciones faltantes, por lo que el equipo de Android comparte las pruebas que usa para garantizar que el kernel se comporte según lo esperado.

Motivos para ejecutar las pruebas

Estas pruebas existen por tres razones principales:

  1. La versión exacta del kernel de Linux que se usa en un dispositivo suele ser específica del dispositivo, y es difícil saber si algún kernel funciona correctamente sin ejecutar las pruebas.
  2. La transferencia de parches del kernel a versiones anteriores o posteriores, o a diferentes árboles de dispositivos, puede generar problemas sutiles que pueden ser imposibles de detectar sin ejecutar las pruebas.
  3. Es posible que las nuevas funciones de redes requieran nuevas funciones del kernel o correcciones de errores del kernel.

Si las pruebas no se aprueban, la pila de red del dispositivo se comporta de forma incorrecta, lo que provoca errores de conectividad visibles para el usuario (como la desconexión de redes Wi-Fi). Es probable que el dispositivo también falle en las pruebas del Conjunto de pruebas de compatibilidad (CTS) de Android.

Cómo usar las pruebas

Las pruebas usan Linux en modo de usuario para iniciar el kernel como un proceso en una máquina host de Linux. Consulta Cómo establecer un entorno de compilación para conocer las versiones adecuadas del sistema operativo. El framework de pruebas de unidades inicia el kernel con una imagen de disco adecuada y ejecuta las pruebas desde el sistema de archivos del host. Las pruebas se escriben en Python y usan interfaces TAP para ejercitar el comportamiento del kernel y la API de sockets.

Compila el kernel para ARCH=um

Para que se ejecuten las pruebas, el kernel debe compilarse para ARCH=um SUBARCH=x86_64. Esta es una arquitectura compatible tanto en sentido ascendente como en los árboles del kernel de Android comunes (como android-4.4), pero, a veces, los kernels de los dispositivos no se compilan en este modo porque los árboles de dispositivos contienen código específico del dispositivo o del hardware en archivos comunes (por ejemplo, sys/exit.c).

En muchos casos, es suficiente con garantizar que el código específico del hardware esté detrás de un #ifdef. Por lo general, debe ser un #ifdef en una opción de configuración que controle la función específica pertinente para el código. Si no existe esa opción de configuración, coloca el código específico del hardware dentro de los bloques #ifndef CONFIG_UML.

En general, la corrección de este problema debería ser responsabilidad del proveedor del árbol del kernel (como el proveedor del chipset o del SoC). Trabajamos con OEM y proveedores para garantizar que los kernels actuales y futuros se compilen para ARCH=um SUBARCH=x86_64 sin necesidad de realizar cambios.

Ejecuta las pruebas

Las pruebas se encuentran en kernel/tests/net/test. Se recomienda que las pruebas se ejecuten desde la rama principal del AOSP porque son las más actualizadas. En algunos casos, las funciones del kernel que son necesarias para el funcionamiento adecuado en una versión determinada de Android aún no tienen una cobertura de prueba completa en esa versión. Para obtener información sobre cómo ejecutar las pruebas, consulta el archivo README de la prueba de red del kernel. Básicamente, desde la parte superior del árbol del kernel, ejecuta lo siguiente:

ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh

Aprobar las pruebas

Los archivos fuente de Python de la prueba de red del kernel contienen comentarios que especifican las confirmaciones del kernel que se sabe que son necesarias para aprobar las pruebas. Las pruebas deben aprobarse en los árboles del kernel comunes (todas las ramas del kernel comunes android-4.4 y superiores) en el proyecto kernel/common en AOSP. Por lo tanto, aprobar las pruebas en un kernel es simplemente una cuestión de realizar una combinación continua desde la rama del kernel común correspondiente.

Contribuciones

Informar problemas

Informa cualquier problema con las pruebas de red del kernel en la herramienta de seguimiento de errores de Android con la etiqueta Component-Networking.

Confirmación de documentos y adición de pruebas

Informa los problemas como se describió anteriormente y, si es posible, sube un cambio para corregirlos en los siguientes casos:

  • Las pruebas no se aprueban en los árboles de kernel comunes.
  • Encuentras una confirmación necesaria que no se menciona en los comentarios de la fuente.
  • Para que las pruebas se aprueben en los kernels upstream, se requieren cambios importantes
  • Crees que las pruebas están demasiado especificadas o que fallarán en kernels futuros.
  • Quieres agregar más pruebas o más cobertura a las pruebas existentes.