Разгрузка модема позволяет устройствам экономить энергию и повышать производительность за счет переноса трафика модема (через USB, Wi-Fi) на аппаратное обеспечение. Трафик модема передается напрямую между модемом и периферийными устройствами, минуя процессор приложений.
Характеристики
Начиная с Android 8.1 устройства могут использовать разгрузку режима модема, чтобы перенаправлять IPv4, IPv6 или IPv4+IPv6 на аппаратное обеспечение.
Функция разгрузки не должна разгружать все пакеты. Платформа может обрабатывать любые пакеты программным способом. Пакеты управления обычно обрабатываются программным обеспечением. Поскольку порты IPv4 используются как для трафика, передаваемого через режим модема, так и для трафика устройства, пакеты установки/завершения сеанса IPv4 (например, SYN/SYN+ACK, FIN) должны обрабатываться в программном обеспечении, чтобы ядро могло создать состояние потока. Фреймворк предоставляет уровень управления и конечные автоматы. Кроме того, он предоставляет оборудованию информацию об интерфейсах и префиксах восходящего и нисходящего трафика.
Для IPv4 аппаратное обеспечение позволяет пакетам настройки сеанса преобразования сетевых адресов (NAT) IPv4 достигать ЦП. Ядро создает записи NAT, а реализация HAL наблюдает за записями из дескрипторов файлов, предоставленных фреймворком, и обрабатывает эти потоки на уровне оборудования. Это означает, что для реализации HAL не требуется CAP_NET_*, поскольку HAL получает NF_NETLINK_CONNTRACK сокетов, открытых из фреймворка. Периодически оборудование отправляет фреймворку обновления состояния NAT для активных потоков, которые обновляют соответствующие записи состояния отслеживания подключений ядра.
Для IPv6 фреймворк программирует список префиксов назначения IPv6, на которые трафик не должен разгружаться. Все остальные пакеты, связанные с режимом модема, можно перенаправлять.
Для учета использования данных опросы NetworkStatsService приводят к тому, что фреймворк запрашивает статистику трафика у оборудования. Кроме того, фреймворк передает лимиты на использование данных на аппаратное обеспечение через HAL.
Требования к оборудованию
Чтобы реализовать разгрузку модема, ваше оборудование должно быть способно пересылать IP-пакеты между модемом и Wi-Fi/USB, не отправляя трафик через основной процессор.
Реализация
Чтобы включить разгрузку модема, необходимо реализовать HAL конфигурации (IOffloadConfig) и HAL управления (IOffloadControl).
Config HAL: IOffloadConfig
IOffloadConfig
HAL запускает реализацию разгрузки модема. Фреймворк предоставляет реализации HAL предварительно подключенные сокеты NF_NETLINK_CONNTRACK, которые можно использовать для наблюдения за потоками IPv4. Ускорять нужно только перенаправленные потоки.
Управление HAL: IOffloadControl
Уровень абстракции оборудования (HAL) IOffloadControl управляет реализацией разгрузки. Необходимо реализовать следующие методы:
- Запуск и остановка разгрузки аппаратного обеспечения: используйте
initOffload/stopOffloadи исключите локальные IP-адреса или другие сети из разгрузки с помощьюsetLocalPrefixes. - Задайте вышестоящий интерфейс, IPv4-адрес и шлюзы IPv6 с помощью
setUpstreamParametersи настройте диапазоны нижестоящих IP-адресов с помощьюaddDownstream/removeDownstream. - Учет использования данных: используйте
getForwardedStats/setDataLimit.
Кроме того, HAL поставщика должен отправлять обратные вызовы через интерфейс ITetheringOffloadCallback, чтобы сообщать фреймворку:
- Асинхронные события, например запуск и остановка разгрузки (OffloadCallbackEvent).
- Обновления тайм-аута NAT, которые необходимо периодически отправлять, чтобы указать, что определенный поток IPv4 содержит трафик и не должен быть закрыт ядром.
Проверка
Чтобы проверить, правильно ли работает разгрузка модема, вручную или автоматически протестируйте работу модема и точки доступа Wi-Fi. Vendor Test Suite (VTS) содержит тесты для HAL разгрузки модема.