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 |
|