Struktura Wi-Fi ma 3 platformy HAL Wi-Fi reprezentowane przez 3 różne interfejsy. W przypadku urządzeń z Androidem 14 lub nowszym wszystkie 3 interfejsy są dostępne jako stabilne pakiety Android Interface Definition Language (AIDL). Te interfejsy były wcześniej zdefiniowane za pomocą języka HIDL (Hardware Interface Definition Language).
- HAL dostawcy: powierzchnia HAL dla poleceń specyficznych dla Androida. Pliki AIDL znajdują się w folderze
hardware/interfaces/wifi/aidl. - Supplicant HAL: interfejs HAL dla wpa_supplicant. Pliki AIDL znajdują się w folderze
hardware/interfaces/wifi/supplicant/aidl. - Hostapd HAL: interfejs HAL dla hostapd. Pliki AIDL znajdują się w folderze
hardware/interfaces/wifi/hostapd/aidl.
Interfejs HAL dostawcy
Warstwa HAL dostawcy udostępnia polecenia specyficzne dla Androida. Jest to opcjonalne (nie jest wymagane) w przypadku trybów infrastruktury STA i SAP. Jest to jednak obowiązkowe w przypadku usług Wi-Fi Aware i Wi-Fi RTT.
W Androidzie 14 i nowszych interfejs HAL dostawcy jest zdefiniowany za pomocą AIDL. W Androidzie 13 i starszych wersjach interfejs HAL dostawcy jest zdefiniowany za pomocą HIDL.
W systemie Android w wersji wcześniejszej niż 8.0 (czyli przed wprowadzeniem HIDL) używano mechanizmu HAL o nazwie starszy HAL. Kod źródłowy Androida zawiera domyślną implementację AIDL lub HIDL. Ta implementacja korzysta z warstwy shim działającej na starszej warstwie HAL.
Starsze nagłówki HAL znajdują się w folderze hardware/libhardware_legacy/include/hardware_legacy/. Starsza implementacja oparta na HAL znajduje się w hardware/interfaces/wifi/aidl/default w przypadku AIDL i hardware/interfaces/wifi/1.x/default w przypadku HIDL.
Supplicant HAL
Warstwa HAL klienta zapewnia interfejs dla demona wpa_supplicant. Od Androida 13 interfejs używa AIDL do definiowania HAL. W przypadku wersji starszych niż Android 13 interfejsy i partycje dostawców korzystają z HIDL.
Kod źródłowy wpa_supplicant znajduje się w katalogu external/wpa_supplicant_8/wpa_supplicant. Implementacja referencyjna udostępnia interfejs AIDL, który jest zaimplementowany w podkatalogu aidl.
Hostapd HAL
Hostapd HAL udostępnia interfejs dla demona hostapd. Od Androida 13 interfejs używa AIDL do definiowania HAL. W przypadku wersji starszych niż Android 13 interfejsy i partycje dostawców korzystają z HIDL.
Kod źródłowy hostapd znajduje się w external/wpa_supplicant_8/hostapd.
Implementacja referencyjna udostępnia interfejs AIDL, który jest zaimplementowany w podkatalogu aidl.
Współbieżność wielu interfejsów Wi-Fi
Różne urządzenia z Androidem mogą obsługiwać różne kombinacje interfejsów Wi-Fi jednocześnie. Obsługiwane kombinacje są zdefiniowane w HAL i udostępniane platformie. Format specyfikacji jest zdefiniowany w tych dokumentach:
hardware/interfaces/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
w przypadku AIDL Wi-Fi HAL,
android/hardware/interfaces/wifi/1.6/IWifiChip.hal w przypadku Wi-Fi HAL 1.6 i
android/hardware/interfaces/wifi/1.0/IWifiChip.hal w przypadku Wi-Fi HAL 1.5 i starszych.
Interfejs HAL AIDL, dostępny w Androidzie 14 i nowszych, oraz interfejs HAL Wi-Fi w wersji 1.6, dostępny w Androidzie 13, umożliwiają określenie interfejsu połączonego punktu dostępu (dwupasmowego jednoczesnego) jako elementu kombinacji.
Format specyfikacji współbieżności jest elastyczny i ogólny. Może wyrażać kombinacje, które nie są jeszcze obsługiwane przez platformę. Aby skonfigurować konkretną kombinację, użyj flagi kompilacji WIFI_HAL_INTERFACE_COMBINATIONS. Flaga znajduje się w device/<oem>/<device>/BoardConfig-common.mk.
Na przykład urządzenie może obsługiwać 2 stacje STA i 1 interfejs typu NAN (Wi-Fi Aware) lub P2P (Wi-Fi Direct), ale nie oba jednocześnie. Możesz to wyrazić w atrybucie device/<oem>/<device>/BoardConfig-common.mk:
WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 2}, {{NAN, P2P}, 1}}
Innym przykładem jest urządzenie obsługujące STA z jednym punktem dostępu lub połączony punkt dostępu (dwupasmowy, działający jednocześnie) bez innych interfejsów. Jest to przedstawione w ten sposób:
WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{AP}, 1}}, {{{AP_BRIDGED}, 1}}
Alternatywnie referencyjna warstwa HAL ma konfiguracje dla kilku kombinacji, które można aktywować za pomocą (starszych) flag kompilacji. Instrukcje konfiguracji znajdziesz w tych artykułach: