Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Monitoreo de tráfico eBPF

La herramienta de tráfico de red eBPF utiliza una combinación de implementación de kernel y espacio de usuario para monitorear el uso de la red en el dispositivo desde el último arranque del dispositivo. Proporciona funciones adicionales como etiquetado de enchufes, separación del tráfico en primer plano / en segundo plano y firewall por UID para bloquear el acceso de las aplicaciones a la red según el estado del teléfono. Las estadísticas recogidas de la herramienta se almacenan en una estructura de datos del núcleo denominado eBPF maps y el resultado es utilizado por servicios como NetworkStatsService para proporcionar estadísticas de tráfico persistente desde el último arranque.

Ejemplos y fuente

Los cambios de espacio de usuario se encuentran principalmente en los system/netd y framework/base proyectos. El desarrollo se realiza en AOSP, por lo que el código AOSP siempre estará actualizado. La fuente se encuentra principalmente en el system/netd/server/TrafficController* , system/netd/bpfloader y system/netd/libbpf/ . Algunos cambios marco necesarias están en framework/base/ y system/core también.

Implementación

A partir de Android 9, los dispositivos Android que se ejecuta en el kernel 4.9 o superior y se incluía originalmente con el lanzamiento p debe utilizar el tráfico de red basado en EBPF seguimiento de la contabilidad en lugar de xt_qtaguid . La nueva infraestructura es más flexible y más fácil de mantener y no requiere ningún código de kernel fuera del árbol.

Las principales diferencias de diseño entre el monitoreo de tráfico heredado y eBPF se ilustran en la Figura 1.

Diferencias de diseño de monitoreo de tráfico heredado y eBPF

Figura 1. Legacy (izquierda) y EBPF monitoreo (derecha) el tráfico diferencias de diseño

El nuevo trafficController diseño se basa en per- cgroup EBPF filtro, así como xt_bpf módulo de filtro de red en el interior del núcleo. Estos filtros eBPF se aplican en el paquete tx / rx cuando pasan por el filtro. El cgroup filtro EBPF se encuentra en la capa de transporte y es responsable de contar el tráfico contra el UID derecha en función de la toma de UID, así como ajuste de espacio de usuario. El xt_bpf filtro de red se engancha en el bw_raw_PREROUTING y bw_mangle_POSTROUTING cadena y es responsable de contar el tráfico en contra de la interfaz correcta.

Durante el arranque, el proceso de espacio de usuario trafficController crea la EBPF mapas utilizados para la recolección y los pasadores de todos los mapas como un archivo de datos virtual en sys/fs/bpf . Entonces el proceso privilegiada bpfloader cargas del programa EBPF precompilado en el núcleo y lo adjunta a la correcta cgroup . Hay una sola raíz cgroup para todo el tráfico por lo que todo el proceso debe incluirse en que cgroup por defecto.

En tiempo de ejecución, el trafficController etiqueta de lata / una toma untag por escrito al traffic_cookie_tag_map y traffic_uid_counterSet_map . El NetworkStatsService puede leer datos del tráfico Estadísticas de traffic_tag_stats_map , traffic_uid_stats_map y traffic_iface_stats_map . Además de la función de recogida del tráfico de las estadísticas, la trafficController y cgroup filtro EBPF también son responsables de bloquear el tráfico de ciertas UID dependiendo de la configuración del teléfono. El tráfico de red basadas en UID función de bloqueo es un reemplazo de la xt_owner módulo dentro del núcleo y el modo de detalle puede ser configurado por escrito a traffic_powersave_uid_map , traffic_standby_uid_map y traffic_dozable_uid_map .

La nueva implementación sigue el legado xt_qtaguid implementación del módulo de modo TrafficController y NetworkStatsService se ejecutarán ya sea con el legado o una nueva aplicación. Si la aplicación utiliza API públicas, no debería experimentar ninguna diferencia si xt_qtaguid herramientas o EBPF se utilizan en el fondo.

Si el kernel del dispositivo se basa en el kernel común de Android 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 o superior), no se requieren modificaciones en los HAL, los controladores o el código del kernel para implementar la nueva herramienta eBPF.

Requisitos

  1. La configuración del kernel DEBE tener las siguientes configuraciones activadas:

    1. CONFIG_CGROUP_BPF=y
    2. CONFIG_BPF=y
    3. CONFIG_BPF_SYSCALL=y
    4. CONFIG_NETFILTER_XT_MATCH_BPF=y
    5. CONFIG_INET_UDP_DIAG=y

    El VTS kernel prueba de configuración es útil cuando la verificación de la correcta configuración está activada.

  2. El dispositivo MEM_LOCK rlimit deberá ser fijado a 8 MB o más.

Proceso de obsolescencia de xt_qtaguid heredado

La nueva herramienta EBPF es la sustitución del xt_qtaguid módulo y el xt_owner módulo se basa en. Vamos a empezar a retirar el xt_qtaguid módulo del kernel de Android y desactivar sus configuraciones innecesarias.

En el comunicado de Android 9, el xt_qtaguid módulo está activada en todos los dispositivos, pero todas las API públicas que leen directamente la xt_qtaguid archivo de módulo proc se trasladó a la NetworkManagement de servicio. Dependiendo de la versión del núcleo y el dispositivo de primer nivel API, el NetworkManagement Servicio sabe si las herramientas EBPF esté encendido y elige el módulo derecho a obtener para cada red de aplicaciones el uso de estadísticas. Aplicaciones con nivel 28 y superior SDK se les impida el acceso a xt_qtaguid archivos proc por sepolicy.

En la próxima versión de Android después de las 9, la aplicación acceso a esos xt_qtaguid archivos proc será completamente bloqueado vamos a empezar a retirar el xt_qtaguid módulo de los nuevos núcleos comunes Android. Una vez eliminado, vamos a actualizar la configuración de base de Android para esa versión del kernel para activar explícitamente la xt_qtaguid módulo fuera. El xt_qtaguid módulo estará obsoleto por completo cuando la versión del kernel requisito mínimo para un lanzamiento de Android es 4.9 o superior.

En la versión de Android 9, solo los dispositivos que se inician con la versión de Android 9 deben tener la nueva función eBPF. Para los dispositivos que se envían con un kernel que puede admitir herramientas eBPF, recomendamos actualizarlo a la nueva función eBPF al actualizar a la versión de Android 9. No hay una prueba CTS para hacer cumplir esa actualización.

Validación

Debería tomar regularmente parches de los núcleos comunes de Android y del maestro AOSP de Android. Asegúrese de que su aplicación pasa las pruebas aplicables VTS y CTS, el netd_unit_test , y el libbpf_test .

Pruebas

Hay net_tests kernel para asegurarse de tener las características necesarias encendido y parches del kernel requeridos portado. Las pruebas están integradas como parte de las pruebas VTS de la versión de Android 9. Hay algunas pruebas de unidad en system/netd/ ( netd_unit_test y libbpf_test ). Hay algunas pruebas en netd_integration_test para validar el comportamiento global de la nueva herramienta.

Verificador CTS y CTS

Debido a que ambos módulos de monitoreo de tráfico son compatibles con la versión de Android 9, no existe una prueba CTS para forzar la implementación del nuevo módulo en todos los dispositivos. Pero para los dispositivos con una versión de kernel superior a 4.9 que originalmente se entregan con la versión de Android 9 (es decir, el primer nivel de API> = 28), hay pruebas CTS en GSI para validar que el nuevo módulo esté configurado correctamente. Antiguo CTS pruebas tales como TrafficStatsTest , NetworkUsageStatsTest y CtsNativeNetTestCases se pueden utilizar para verificar el comportamiento de ser coherente con el módulo de UID de edad.

Prueba manual

Hay algunas pruebas de unidad en system/netd/ ( netd_unit_test , netd_integration_test y libbpf_test ). Existe soporte para dumpsys para verificar manualmente el estado. El comando dumpsys netd muestra el estado básico de la trafficController módulo y si EBPF se ha encendido correctamente. Si EBPF está activada, el comando dumpsys netd trafficcontroller muestra el contenido detallado de cada mapa EBPF, incluyendo información de socket etiquetado, las estadísticas por etiqueta, UID y del iface, y propietario UID partido.

Ubicaciones de prueba

Las pruebas CTS se encuentran en:

Pruebas VTS se encuentran en https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py .

Las pruebas unitarias se encuentran en: