Android Wi-Fi架构概述
熟悉Android Wi-Fi Framework的同学都知道,Android Wi-Fi架构如下图所示:

简单来说Android Wi-Fi架构分三层:
- Application层,即应用层,指系统应用或第三方应用
- Wi-Fi Service层,属于Android framework层,是aosp中Wi-Fi相关功能的主要代码
- Native层,包括wpa_supplicant、hostapd、driver
这篇文章聚焦在Wi-Fi Service层和Native层之间的HIDL接口,梳理下都有哪些HIDL接口以及这些接口的功能。为后续分析WiFi具体功能流程时打下基础。
从上面的架构图可以看到,HIDL接口主要分三类,Vendor HAL、Supplicant HAL和Hostapd HAL:
- Vendor HAL: Android专用命令的HAL接口。HIDL 文件位于 hardware/interfaces/wifi/1.x 中
- Supplicant HAL: wpa_supplicant的HAL接口。HIDL 文件位于 hardware/interfaces/supplicant/1.x 中
- Hostapd HAL: hostapd的HAL接口。HIDL 文件位于 hardware/interfaces/hostapd/1.x 中
HIDL接口简介
分析具体Wi-Fi Service的HIDL接口之前,先简单了解下Android HIDL机制。
HIDL是HAL interface definition language的缩写,用来定义HAL和HAL使用者之间的接口。HIDL可以让通信的两端代码独立编译。HIDL旨在用于进程间通信,进程间通信采用Binder机制。
HIDL在一个接口文件中指定数据结构和方法签名,最终生成一个包。HIDL语法与C类似。
HIDL设计初衷
HIDL设计的目标是可以独立的替换android framework而不用重新编译HAL层。HAL层由vendor厂商编译,放到/vendor分区;framework在其它分区,OTA可以直接替换framework所在的分区,而不用重新编译HAL。
HIDL设计考虑以下方面的平衡:
- 互操作性:在可以使用各种架构、工具链和构建配置来编译的进程之间创建可互操作的可靠接口。HIDL 接口带有版本编号,发布后无法再进行更改。
- 效率: HIDL 会尝试尽可能减少复制操作的次数。HIDL 定义的数据以 C++ 标准布局数据结构传递至 C++ 代码,无需解包,可直接使用。此外,HIDL 还提供共享内存接口;由于 RPC 本身有点慢,因此 HIDL 支持两种无需使用 RPC 调用的数据传输方法:共享内存和快速消息队列 (FMQ)。
- 直观: 通过仅针对 RPC 使用 in 参数,HIDL 避开了内存所有权这一棘手问题。无论是将数据传递到 HIDL 中以进行传输,还是从 HIDL 接收数据,都不会改变数据的所有权。
HIDL语法关键字
- generates: 表示将值返回客户端的接口方法。要返回一个非原始值或多个值,会生成同步回调函数。
- oneway: 用来修饰HIDL方法,表示这个方法没有返回值并且非阻塞。
Wi-Fi HIDL接口梳理
下面开始梳理WiFi HIDL接口,主要梳理Vendor HAL和Supplicant HAL两部分,Hostapd HAL留到后面分析Soft AP代码时再补充。这里以列表的方式列出接口名和接口描述,为后续分析WiFi代码流程打基础。
Vendor HAL
IWifi.hal
HAL模块的根模块,加载WiFi HAL时返回的接口
| 接口名 |
描述 |
| registerEventCallback |
|
| isStarted |
获取HAL当前状态 |
| start |
执行使用这个模块的任何设置动作 |
| stop |
|
| getChipIds |
|
| getChip |
获取chip的HIDL接口对象 |
IWifiEventCallback.hal
| 接口名 |
描述 |
| oneway onStart() |
|
| oneway onStop() |
|
| oneway onFailure |
|
IWifiChip.hal
表示芯片的接口
| 接口名 |
描述 |
| getId |
|
| registerEventCallback |
注册这个chip上事件的回调 |
| getCapabilities |
|
| getAvailableModes |
|
| configureChip |
|
| getMode |
|
| createApIface |
|
| getApIfaceNames |
|
| getApIface |
|
| removeApIface |
|
| createNanIface |
|
| createP2pIface |
|
| createStaIface |
|
| createRttController |
|
| 接口名 |
描述 |
| selectTxPowerScenario |
选择tx功率场景,OEM厂商可以定义不同场景的功率配置 |
| resetTxPowerScenario |
|
| 接口名 |
描述 |
| selectTxPowerScenario_1_2 |
选择tx功率场景,OEM厂商可以定义不同场景的功率配置 |
| registerEventCallback_1_2 |
|
| 接口名 |
描述 |
| getCapabilities_1_3 |
1.3新增SET_LATENCY_MODE和P2P_RAND_MAC两个能力 |
| setLatencyMode |
设置低时延模式;低时延优化是牺牲扫描、漫游等功能的权衡 |
| flushRingBufferToFile |
This API help to collect firmware/driver/pkt logs |
IWifiChipEventCallback.hal
| 接口名 |
描述 |
| oneway onChipReconfigured |
表示芯片重配置成功 |
| oneway onChipReconfigureFailure |
|
| oneway onIfaceAdded |
|
| oneway onIfaceRemoved |
|
| oneway onDebugRingBufferDataAvailable |
|
| oneway onDebugErrorAlert |
|
| 接口名 |
描述 |
| oneway onRadioModeChange |
|
IWifiIface.hal
用来表示单个接口的接口
IWifiStaIface.hal
用来表示单个STA接口的接口
| 接口名 |
描述 |
| registerEventCallback |
|
| getCapabilities |
获取这个STA Iface支持的能力 |
| getApfPacketFilterCapabilities |
查询芯片支持的APF能力 |
| installApfPacketFilter |
安装APF程序 |
| getBackgroundScanCapabilities |
|
| getValidFrequenciesForBand |
|
| startBackgroundScan |
|
| stopBackgroundScan |
|
| enableLinkLayerStatsCollection |
|
| disableLinkLayerStatsCollection |
|
| getLinkLayerStats |
|
| startRssiMonitoring |
|
| stopRssiMonitoring |
|
| getRoamingCapabilities |
|
| configureRoaming |
|
| setRoamingState |
|
| enableNdOffload |
|
| startSendingKeepAlivePackets |
|
| stopSendingKeepAlivePackets |
|
| setScanningMacOui |
|
| startDebugPacketFateMonitoring |
|
| getDebugTxPacketFates |
|
| getDebugRxPacketFates |
|
| 接口名 |
描述 |
| readApfPacketFilterData |
获取APF程序,获取APF程序等同于被卸载 |
| setMacAddress |
|
| 接口名 |
描述 |
| getLinkLayerStats_1_3 |
|
| getFactoryMacAddress |
获取这个STA接口的工厂MAC |
IWifiStaIfaceEventCallback
| 接口名 |
描述 |
| oneway onBackgroundScanFailure |
|
| oneway onBackgroundFullScanResult |
|
| oneway onBackgroundScanResults |
|
| oneway onRssiThresholdBreached |
|
IWifiApIface.hal
| 接口名 |
描述 |
| setCountryCode |
|
| getValidFrequenciesForBand |
|
Supplicant HAL
ISupplicant.hal
| 接口名 |
描述 |
| getInterface |
获取supplicant控制的一个HIDL接口对象 |
| listInterfaces |
获取supplicant控制的所有接口 |
| registerCallback |
注册supplicant服务的回调,这些回调由不属于任何接口或网络的全局事件回调 |
| setConcurrencyPriority |
P2P和STA单信道共存产生信道冲突时,设置谁更优先 |
| 接口名 |
描述 |
| addInterface |
注册一个接口到supplicant |
| removeInterface |
从supplicant去注册一个接口 |
| oneway terminate |
|
ISupplicantCallback.hal
supplicant服务提供的callback接口,通过ISupplicant.registerCallback注册
| 接口名 |
描述 |
| oneway onInterfaceCreated |
一个新的接口被创建 |
| oneway onInterfaceRemoved |
一个接口被删除 |
| oneway onTerminating |
supplicant退出 |
ISupplicantIface.hal
supplicant对每个网络接口(比如wlan0)暴露的接口
| 接口名 |
描述 |
| getName |
获取网络接口名字,比如返回wlan0 |
| getType |
获取网络接口类型,比如STA |
| addNetwork |
添加一个网络,返回这个网络的HIDL接口对象 |
| removeNetwork |
移除网络 |
| getNetwork |
获取网络 |
| listNetworks |
获取网络列表 |
| WPS相关的一些接口 |
|
| setWpsDeviceName |
|
| setWpsDeviceType |
|
| setWpsManufacturer |
|
| setWpsModelName |
|
| setWpsModelNumber |
|
| setWpsSerialNumber |
|
| setWpsConfigMethods |
|
ISupplicantNetwork.hal
supplicant为每个网络配置暴露的接口
| 接口名 |
描述 |
| getId |
获取由supplicant所分配的网络的ID |
| getInterfaceName |
获取这个网络所属的interface name |
| getType |
获取这个网络所属的interface type |
ISupplicantStaIface.hal
extends ISupplicantIface,supplicant为每个station模式网络接口暴露的接口
| 接口名 |
描述 |
| registerCallback |
注册这个接口的回调 |
| reassociate |
重连当前使能的网络,即使是已连接 |
| reconnect |
重连当前使能的网络,在当前是断连状态下 |
| disconnect |
断开当前使能的网络 |
| setPowerSave |
开关power save |
| initiateTdlsDiscover |
发起TDLS discover |
| initiateTdlsSetup |
发起TDLS设置 |
| initiateTdlsTeardown |
发起TDLS down |
| initiateAnqpQuery |
发起ANQP查询 |
| initiateHs20IconQuery |
发起Hotspot2.0图标查询 |
| getMacAddress |
获取MAC地址 |
| startRxFilter |
开启rx filter |
| stopRxFilter |
停止rx filter |
| addRxFilter |
添加指定的rx filter |
| removeRxFilter |
删除指定的rx filter |
| setBtCoexistenceMode |
|
| setBtCoexistenceScanModeEnabled |
|
| setSuspendModeEnabled |
|
| setCountryCode |
|
| startWpsRegistrar |
|
| startWpsPbc |
|
| startWpsPinKeypad |
|
| cancelWps |
|
| setExternalSim |
|
| addExtRadioWork |
|
| removeExtRadioWork |
|
| enableAutoReconnect |
|
| 接口名 |
描述 |
| registerCallback_1_1 |
|
增加了DPP相关的接口
| 接口名 |
描述 |
| registerCallback_1_2 |
|
| getKeyMgmtCapabilities |
|
| addDppPeerUri |
|
| removeDppUri |
|
| startDppConfiguratorInitiator |
|
| startDppEnrolleeInitiator |
|
| stopDppInitiator |
|
ISupplicantStaIfaceCallback.hal
supplicant为STA模式接口暴露的回调接口
| 接口名 |
描述 |
| oneway onNetworkAdded |
|
| oneway onNetworkRemoved |
|
| oneway onStateChanged |
|
| oneway onAnqpQueryDone |
|
| oneway onHs20IconQueryDone |
|
| oneway onHs20SubscriptionRemediation |
|
| onHs20DeauthImminentNotice |
|
| oneway onDisconnected |
|
| oneway onAssociationRejected |
|
| oneway onAuthenticationTimeout |
|
| oneway onEapFailure |
|
| oneway onBssidChanged |
|
| oneway onWpsEventSuccess |
|
| oneway onWpsEventFail |
|
| oneway onWpsEventPbcOverlap |
|
| oneway onExtRadioWorkStart |
|
| oneway onExtRadioWorkTimeout |
|
| 接口名 |
描述 |
| oneway onEapFailure_1_1 |
指示EAP认证失败 |
| 接口名 |
描述 |
| oneway onDppSuccessConfigReceived |
|
| oneway onDppSuccessConfigSent |
|
| oneway onDppProgress |
|
| oneway onDppFailure |
|
ISupplicantStaNetwork.hal
extends ISupplicantNetwork,supplicant为每个STA模式网络配置暴露的接口
| 接口名 |
描述 |
| registerCallback |
|
| setSsid |
对应wpa_s中的ssid成员 |
| setBssid |
|
| setScanSsid |
对于此网络是否要发probe request |
| setKeyMgmt |
哪一种密钥管理方式 |
| setProto |
设置所使用的协议,即WPA WPA2 |
| setAuthAlg |
认证算法,open/share key/LEAP |
| setGroupCipher |
|
| setPairwiseCipher |
|
| setPskPassphrase |
|
| setPsk |
直接设置raw psk |
| setWepKey |
|
| setWepTxKeyIdx |
|
| setRequirePmf |
|
| setEapMethod |
|
| setEapPhase2Method |
|
| setEapIdentity |
|
| setEapAnonymousIdentity |
|
| setEapPassword |
|
| setEapCACert |
设置EAP CA证书文件路径 |
| setEapCAPath |
设置CA证书文件夹路径 |
| setEapClientCert |
|
| setEapPrivateKeyId |
|
| setEapSubjectMatch |
|
| setEapAltSubjectMatch |
|
| setEapEngine |
Enable EAP Open SSL Engine for this network |
| setEapEngineID |
|
| setEapDomainSuffixMatch |
|
| setProactiveKeyCaching |
|
| setIdStr |
|
| enable |
|
| disable |
|
| select |
发起连接 |
| sendNetworkEapSimGsmAuthResponse |
|
| sendNetworkEapSimGsmAuthFailure |
|
| sendNetworkEapSimUmtsAuthResponse |
|
| sendNetworkEapSimUmtsAutsResponse |
|
| sendNetworkEapSimUmtsAuthFailure |
|
| sendNetworkEapIdentityResponse |
|
| 接口名 |
描述 |
| setEapEncryptedImsiIdentity |
|
| sendNetworkEapIdentityResponse_1_1 |
|
| 接口名 |
描述 |
| setKeyMgmt_1_2 |
|
| getKeyMgmt_1_2 |
|
| setPairwiseCipher_1_2 |
|
| getPairwiseCipher_1_2 |
|
| setGroupCipher_1_2 |
|
| getGroupCipher_1_2 |
|
| setGroupMgmtCipher |
|
| getGroupMgmtCipher |
|
| enableTlsSuiteBEapPhase1Param |
|
| enableSuiteBEapOpenSslCiphers |
|
| getSaePassword |
|
| getSaePasswordId |
|
| getSaePasswordId |
|
| setSaePasswordId |
|
ISupplicantStaNetworkCallback
supplicant为每一个网路配置暴露的回调接口
| 接口名 |
描述 |
| oneway onNetworkEapSimGsmAuthRequest |
|
| oneway onNetworkEapSimUmtsAuthRequest |
|
| oneway onNetworkEapIdentityRequest |
|