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

В 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, чтобы статистика учитывалась правильно.