Обзор статистики сетевого интерфейса

В Android 4.0 статистика, сообщаемая сетевыми интерфейсами Linux, записывается с течением времени и используется для обеспечения соблюдения ограничений сетевых квот, отображения диаграмм, видимых пользователям, и многого другого.

Каждый драйвер сетевого устройства (включая Wi-Fi) должен следовать стандартному жизненному циклу устройства ядра и возвращать правильную статистику через dev_get_stats() . В частности, возвращаемая статистика должна оставаться строго монотонной, пока интерфейс активен. Драйверы могут сбрасывать статистику только после успешного завершения unregister_netdev() или эквивалентного, который генерирует событие NETDEV_UNREGISTER для обратных вызовов, зарегистрированных с помощью register_netdevice_notifier() / register_inetaddr_notifier() / register_inet6addr_notifier() .

Мобильные операторы обычно измеряют использование данных на уровне Интернета (IP). Чтобы соответствовать этому подходу в Android 4.0, мы полагаемся на тот факт, что для устройств ядра мы заботимся о значениях rx_bytes и tx_bytes , возвращаемых dev_get_stats() , которые возвращают точно переданные байты интернет-уровня ( IP ). Но мы понимаем, что для других устройств это может быть не так. На данный момент функция опирается на эту особенность. Новые драйверы также должны иметь это свойство, а значения dev_get_stats() не должны включать какие-либо накладные расходы на инкапсуляцию нижних сетевых уровней (например, заголовки Ethernet) и предпочтительно не должны включать другой трафик (например, ARP), если он не является незначительным.

Платформа Android собирает статистику только с сетевых интерфейсов, связанных с NetworkStateTracker в ConnectivityService . Это позволяет платформе точно идентифицировать каждый сетевой интерфейс, включая его тип (например, TYPE_MOBILE или TYPE_WIFI ) и идентификатор абонента (например, IMSI). Все сетевые интерфейсы, используемые для маршрутизации данных, должны быть представлены NetworkStateTracker , чтобы можно было правильно учитывать статистику.