Wi-Fi HIDL接口梳理 | Jiansoft
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语法关键字
- 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 | |