Descripción general de las estadísticas de la interfaz de red

En Android 4.0, las estadísticas que informan las interfaces de red de Linux se registran con el tiempo y se usan para aplicar límites de cuota de red, renderizar gráficos visibles para el usuario y mucho más.

Cada controlador de dispositivo de red (Wi-Fi incluido) debe seguir el ciclo de vida estándar del dispositivo del kernel y mostrar estadísticas correctas a través de dev_get_stats(). En particular, las estadísticas que se muestran deben permanecer estrictamente monótonas mientras la interfaz está activa. Los controladores solo pueden restablecer las estadísticas después de completar correctamente un unregister_netdev() o el equivalente que genera un evento NETDEV_UNREGISTER para las devoluciones de llamada registradas con register_netdevice_notifier(), register_inetaddr_notifier() o register_inet6addr_notifier().

Por lo general, los operadores de telefonía celular miden el uso de datos en la capa de Internet (IP). Para que coincida con este enfoque en Android 4.0, nos basamos en el hecho de que, para los dispositivos del kernel, nos interesan los valores rx_bytes y tx_bytes que muestra dev_get_stats(), que devuelven exactamente los bytes transferidos de la capa de Internet (IP).  Sin embargo, comprendemos que es posible que no sea así en otros dispositivos. Por el momento, la función se basa en esta peculiaridad. Los controladores nuevos también deben tener esa propiedad, y los valores de dev_get_stats() no deben incluir ninguna sobrecarga de encapsulamiento de capas de red inferiores (como los encabezados Ethernet) y, de preferencia, no deben incluir otro tráfico (como ARP), a menos que sea despreciable.

El framework de Android solo recopila estadísticas de las interfaces de red asociadas con un NetworkStateTracker en ConnectivityService. Esto permite que el framework identifique de forma concreta cada interfaz de red, incluido su tipo (como TYPE_MOBILE o TYPE_WIFI) y la identidad del suscriptor (como IMSI).  Todas las interfaces de red que se usan para enrutar datos deben estar representadas por un NetworkStateTracker para que las estadísticas se puedan registrar correctamente.