Фреймворк Wi-Fi имеет три интерфейса HAL Wi-Fi, представленные тремя разными интерфейсами. На устройствах с Android 14 или более поздней версии все три интерфейса доступны в виде стабильных пакетов Android Interface Definition Language (AIDL). Ранее эти интерфейсы определялись с помощью языка определения аппаратного интерфейса (HIDL).
- Vendor HAL – поверхность HAL для команд, относящихся к Android. Файлы AIDL находятся в папке
hardware/interfaces/wifi/aidl. - Supplicant HAL – HAL-интерфейс для wpa_supplicant. Файлы AIDL находятся в папке
hardware/interfaces/wifi/supplicant/aidl. - Hostapd HAL – поверхность HAL для hostapd. Файлы AIDL находятся в каталоге
hardware/interfaces/wifi/hostapd/aidl.
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 имеет конфигурации для нескольких комбинаций, которые можно активировать с помощью (устаревших) флагов сборки. Инструкции по настройке приведены в следующих статьях: