Wi-Fi HAL

Фреймворк Wi-Fi имеет три интерфейса HAL Wi-Fi, представленные тремя разными интерфейсами. На устройствах с Android 14 или более поздней версии все три интерфейса доступны в виде стабильных пакетов Android Interface Definition Language (AIDL). Ранее эти интерфейсы определялись с помощью языка определения аппаратного интерфейса (HIDL).

HAL поставщика

Vendor HAL предоставляет команды, предназначенные для Android. Для работы режимов инфраструктурной станции (STA) и программной точки доступа (SAP) он не требуется. Однако это обязательно для сервисов Wi-Fi Aware и Wi-Fi RTT.

В Android 14 и более поздних версиях интерфейс Vendor HAL определяется с помощью AIDL. В Android 13 и более ранних версий интерфейс HAL поставщика определяется с помощью HIDL.

До версии Android 8.0 в ОС использовался механизм HAL, который назывался устаревшим HAL. В исходном коде Android есть реализация AIDL или HIDL по умолчанию. В этой реализации используется прослойка, работающая поверх устаревшего уровня HAL.

Заголовки устаревшей версии HAL находятся в файле hardware/libhardware_legacy/include/hardware_legacy/. Устаревшая реализация на основе HAL находится в hardware/interfaces/wifi/aidl/default для AIDL и hardware/interfaces/wifi/1.x/default для HIDL.

Supplicant HAL

HAL-модуль Supplicant предоставляет интерфейс для управляющей программы wpa_supplicant. Начиная с Android 13, для определения HAL используется интерфейс AIDL. В версиях до Android 13 интерфейсы и разделы поставщиков используют HIDL.

Исходный код wpa_supplicant находится в каталоге external/wpa_supplicant_8/wpa_supplicant. В эталонной реализации есть интерфейс AIDL, который реализован в подкаталоге aidl.

Hostapd HAL

HAL hostapd предоставляет интерфейс для фонового процесса hostapd. Начиная с Android 13, для определения HAL используется интерфейс AIDL. В версиях до Android 13 интерфейсы и разделы поставщиков используют HIDL.

Исходный код hostapd находится в каталоге external/wpa_supplicant_8/hostapd. В эталонной реализации есть интерфейс AIDL, который реализован в подкаталоге aidl.

Одновременное использование нескольких интерфейсов Wi-Fi

Разные устройства Android могут поддерживать разные комбинации интерфейсов Wi-Fi одновременно. Поддерживаемые сочетания определяются в HAL и предоставляются фреймворку. Формат спецификации определен в файле hardware/interfaces/wifi/aidl/android/hardware/wifi/IWifiChip.aidl для AIDL Wi-Fi HAL, android/hardware/interfaces/wifi/1.6/IWifiChip.hal для Wi-Fi HAL 1.6 и android/hardware/interfaces/wifi/1.0/IWifiChip.hal для Wi-Fi HAL 1.5 и более ранних версий.

В AIDL HAL, доступном в Android 14 и более поздних версиях, и Wi-Fi HAL версии 1.6, доступном в Android 13, добавлена возможность указать интерфейс моста точки доступа (одновременная работа в двух диапазонах) в качестве явного элемента комбинации.

Формат спецификации параллелизма является гибким и общим; он может выражать комбинации, которые ещё не поддерживаются фреймворком. Чтобы настроить определенную комбинацию, используйте флаг сборки WIFI_HAL_INTERFACE_COMBINATIONS. Этот флаг находится в device/<oem>/<device>/BoardConfig-common.mk.

Например, устройство может поддерживать две станции и один интерфейс типа NAN (Wi-Fi Aware) или P2P (Wi-Fi Direct), но не оба одновременно. В device/<oem>/<device>/BoardConfig-common.mk это можно выразить следующим образом:

WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 2}, {{NAN, P2P}, 1}}

Другой пример – устройство, которое поддерживает STA с одной ТД или мостовую ТД (одновременную работу в двух диапазонах) без других интерфейсов. Это можно представить следующим образом:

WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{AP}, 1}}, {{{AP_BRIDGED}, 1}}

Кроме того, эталонный HAL имеет конфигурации для нескольких комбинаций, которые можно активировать с помощью (устаревших) флагов сборки. Инструкции по настройке приведены в следующих статьях: