Wi-Fi 7

对于运行 Android 13 或更高版本的设备,Android 支持 Wi-Fi 7 (IEEE 802.11be) 标准。本页介绍了 Android Wi-Fi 7 功能,包括基准和多链路操作 (MLO)。

基准 Wi-Fi 7 功能

本部分介绍了 Android 13 及更高版本中包含的基准 Wi-Fi 7 功能。

设备 Wi-Fi 7 支持

Android 框架包含 WifiManager#isWifiStandardSupported(int standard) API。应用可以调用此 API 并传入 ScanResults.WIFI_STANDARD_11BE 参数,以检查设备是否支持 Wi-Fi 7。

调用此 API 后,Wi-Fi 模块会检查是否使用了 config_wifi11beSupportOverride 配置叠加层作为替换,并执行以下操作:

  • 如果叠加层设置为 true,则假定设备支持 Wi-Fi 7,而无论 nl80211 的响应如何。此替换仅适用于没有驱动程序来返回 Wi-Fi 7 支持的设备制造商。
  • 如果叠加层设置为 false(默认值),则 Wi-Fi 模块会使用来自 nl80211 的信息。Wi-Fi 模块会从 wificond 请求信息,而 wificond 会调用 nl80211 命令 NL80211_CMD_GET_WIPHY。如果驱动程序的响应中包含 NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY 属性,则假定设备支持 Wi-Fi 7。

扫描到的 AP Wi-Fi 7 支持

Android 框架包含 int ScanResult#getWifiStandard() API。应用可以调用此 API 以检查扫描到的接入点 (AP) 是否支持 Wi-Fi 7。如果 AP 支持 Wi-FI 7,则 API 会返回 ScanResults.WIFI_STANDARD_11BE。应用无需设备支持 Wi-Fi 7 即可使用此 API。

调用此 API 后,Wi-Fi 模块会检查 EHT Capability IE 是否在连接扫描的返回结果中。如果扫描结果中包含 EHT Capability IE,则扫描到的 AP 支持 Wi-Fi 7。AOSP WifiTracker 类会在以详细模式运行时在用户界面中显示此支持信息。

STA 连接模式

Android 框架包含 int WifiInfo#getWifiStandard() API。应用可以调用此 API 以检查当前站点 (STA) 连接模式是否为 Wi-Fi 7。当设备和连接的 AP 都支持 Wi-Fi 7 时,STA 连接模式为 Wi-Fi 7。如果连接模式为 Wi-Fi 7,则 API 会返回 ScanResults.WIFI_STANDARD_11BE

调用 getWifiStandard 后,Wi-Fi 模块会通过调用 ISupplicantStaIface#getConnectionCapabilities() HAL API 来确定模式。此 HAL API 在 wpa_supplicant AIDL 层中的实现会检查连接设置期间的 AssocReqAssocRsp 中是否都包含 EHT Capability IE

网络选择

在 Android 13 中,网络选择使用多个参数来确定要连接到的 AP。其中一个参数是 AP 的估计吞吐量,该吞吐量是使用 ThroughputPredictor 块估算的。ThroughputPredictor 块使用设备和扫描到的 AP 的 PHY 参数。

在 Android 13 中,ThroughputPredictor 在其计算中使用以下 AP 功能:

  • 支持 Wi-Fi 7 (802.11be)
  • 支持 320 MHz 频道带宽

ThroughputPredictor 逻辑中加入这些功能,可提高在设备能够使用这些功能时选择支持 Wi-Fi 7 的 AP 的几率。

基于 Wi-Fi RTT 的测距

Android 为 EHT 前导码和 320 MHz 信道带宽的 Wi-Fi RTT 提供 API 支持。只要芯片支持,这就可以在 RTT 测距中支持 Wi-Fi 7 相关功能。

HAL API

以下 HAL API 支持基于 RTT 测距的 Wi-Fi 7 功能

API

应用可以使用以下 API 进行基于 Wi-Fi 7 RTT 的测距

Soft AP

Android 在 Soft AP 中支持 Wi-Fi 7,并提供以下功能。

启动 Soft AP

Android 支持在 Wi-Fi 7 模式下启动 Soft AP。这由 config_wifiSoftapIeee80211beSupported 叠加配置控制。

Wi-Fi 模块使用叠加 config_wifiSoftapIeee80211beSupportedIHostApd#addAccessPoint() API 调用中设置布尔值 HwModeParams#enable80211BE。在 hostapd AIDL 层中,此值用于设置 hostapd.conf 参数。

HAL API

hostapd HAL 中 HwModeParams 中的 enable80211BE 布尔值支持在 Wi-Fi 7 模式下启动 Soft AP。

报告 Soft AP 信息

Android 包括 API 支持,可在报告的 Soft AP 信息中加入 Wi-Fi 7 和 320 MHz 信道带宽信息。

HAL API

hostapd HAL 中 Generation.aidl AIDL 接口中的 WIFI_STANDARD_11BE 常量(在 IHostapdCallback#onApInstanceInfoChanged() 回调中报告的 ApInfo 中使用)支持报告 Soft AP 信息。

API

应用可以使用 SoftApInfo 中的以下方法(系统 API)来报告 Soft AP 信息。

MLO Wi-Fi 7 功能

多链路操作 (MLO) 是 Wi-Fi 7 (802.11be) 规范中的主要功能。对于在 Wi-Fi 7 中运行的多链路设备 (MLD) 来说,MLO 是强制性功能,无论是以并发方式还是非并发方式运行。

MLO diagram

图 1. MLO 图。

如图 1 所示,AP-MLD 和 STA-MLD 在每个链路上都有多个 AP 或 STA 实例在运行。每个链路都有单独的 AP 或 STA MAC 地址。AP 或 STA 还有一个 MLD MAC 地址来标识设备。

android.net.wifi.MloLink 类表示 MLO 链路。此类包含以下参数

扫描到的 Wi-Fi 7 AP MLO 信息

当 Wi-Fi 模块从 AP-MLD 接收到 ScanResult 对象时,应用可以获取 Wi-Fi 7 AP MLD 的 MLO 参数。AOSP WifiTracker 在以详细模式运行时会显示 MLO 参数。

Wi-Fi 模块通过执行以下操作来收集 MLO 信息

  • 解析信标或探测响应中包含的多链路信息元素 (IE),以读取 AP MLD MAC 地址和当前链路 ID。
  • 解析信标或探测响应中包含的缩减邻居报告 (RNR) IE,以读取关联链路信息的列表。

API

要获取扫描到的 AP MLO 信息,应用可以使用以下 API

已连接的 Wi-Fi 7 AP MLO 信息

当设备连接到 Wi-Fi 7 AP-MLD 时,框架会从 WifiInfo 对象收集连接的 MLO 参数。AOSP WifiTracker 对象在以详细模式运行时会显示此信息。

当设备与 AP-MLD 连接时,Wi-Fi 模块会将 MLO 信息从从 AP 接收到的 ScanResult 对象复制过来。然后,该模块调用 ISupplicantStaIface#getConnectionMloLinksInfo() HAL API,以读取 AP 和 STA 的每个链路的 MAC 地址,并更新关联链路的状态。

API

要获取 MLO 连接信息,应用可以使用以下 API

AP-MLD 扫描

供应商软件为 Wi-Fi 框架提供其接收到的每个信标或探测响应的扫描结果。这意味着 Wi-Fi 框架

  • 可能会从同一 AP-MLD 接收到多个 ScanResults 对象(因为 AP 可以有多个信标链路)。
  • 可能只会接收到 AP-MLD 的 AP 链路的部分扫描结果,因为固件可能未接收到其中一些链路信号。

供应商软件仅报告通过无线方式接收到的扫描结果,并且不得根据 AP-MLD 播发的链路创建(人为合成)扫描结果。

供应商软件必须在报告的扫描结果中包含从 AP 实例接收到的基本变体多链路和 RNR IE。如果扫描结果中缺少关联的 AP 详细信息,供应商软件可以发送多链路探测请求(包含探测请求多链路元素的探测请求帧),以便在响应帧中包含 AP 的完整或部分功能、参数和操作元素以及目标 AP-MLD。

如果需要,供应商软件可以触发 ML 探测(在探测请求帧中使用探测请求变体 ML IE)。

AP-MLD 网络关联

当设备加入 AP-MLD 网络时,供应商软件会使用选定的 AP 链路(关联链路)进行信令传输。供应商软件可以关联到设备支持的所有链路或部分链路。

关联成功后,驱动程序会使用 AP-MLD 的链路 BSSID 报告 ISupplicantStaIfaceCallback#onStateChanged()。然后,驱动程序选择 AP-MLD 的链路,前提是已向框架报告了该链路的扫描结果。

网络评分

对于运行 Android 14 或更高版本的设备,Android Wi-Fi 网络选择支持 Wi-Fi 7 MLO。这意味着 Android 会根据 MLO 可用的链路数量为设备选择最佳 Wi-Fi 网络。

为了支持 MLO,网络选择算法使用来自 Wi-Fi 芯片的以下 MLO 功能

  • 最大 STR 链路计数
  • 最大关联链路计数
  • 并发频段组合

Wi-Fi MLO network selection

图 2. MLO 网络选择。

同步传输和接收 (STR) 是多链路操作的 Wi-Fi 介质争用方案。不同链路之间的信号隔离充分,因此链路可以独立运行,并且能够同时在不同链路中传输和接收。STR 不同于旧版单链路 (SL) STA 和旧版双频段双并发 (DBDC) STA。与 STA MLD 关联的 STA 共享一个通用发射器序列号 (SN) 和一个通用空间,用于为具有相同访问类别 (AC) 的多链路传输分配数据传输。

使用的最大 STR 链路数可能与芯片支持的最大无线装置数不同。在图 2 的示例中,最大 STR 链路计数为 2。

以下 AIDL HAL 接口支持最大 STR 链路计数和最大关联链路计数功能

多个链路可以使用争用方案增强型多链路单射频 (eMLSR) 在单个无线装置上运行。如果多链路设备可以接收某些基本控制帧并在链路集上同时执行空闲信道评估 (CCA),则该设备可以在一组链路上使用 eMLSR。但是,MLD 一次仅在一个链路(在每个传输机会 (TXOP) 期间动态选择的链路)上发送或接收数据。

如果芯片支持,MLD 工作站可以通过并发运行 STR 和 eMLSR 来最大化关联链路数,从而获得更高的可靠性、更高的吞吐量和更低的延迟(与单链路旧版工作站相比)。在图 2 中,最大关联链路计数为 3。

以下 AIDL HAL 接口支持最大关联链路计数功能

并发频段组合

框架查询芯片以获取可以同时运行的允许无线装置组合(通过 IWifiChip.aidl AIDL 接口)。框架从该信息中推导出可能的并发频段组合。以下是并发频段组合 (GHz) 的示例列表

  • 2.4
  • 5
  • 6
  • 2.4 x 5
  • 2.4 x 6
  • 5 x 6

以下 AIDL HAL 接口支持并发无线装置组合

网络选择

在网络选择 (MLO) 期间,候选列表按具有相同 MLD MAC 地址的成员分组。根据芯片支持的最大 STR 链路计数和并发频段组合,计算每个组的最大预测多链路吞吐量得分。如果候选对象支持多链路且芯片支持 STR,则预测的吞吐量得分将替换为多链路预测的吞吐量得分。这在网络选择期间提高了 MLO 候选对象的得分。

当加入 AP-MLD 网络时,框架会根据供应商软件报告的 ScanResults 对象中接收到的信息执行 SSID 选择。在框架选择 SSID 后,供应商软件负责选择最佳 AP(或 AP 链路)的 BSSID 以用于关联。

设备 STA MAC 地址处理

本部分介绍如何处理设备 STA MAC 地址(MLD MAC 地址和每链路 STA MAC 地址)。

MLD MAC 地址

Wi-Fi 框架管理设备的 MLD MAC 地址。MLD MAC 地址的处理方式与非 MLD 设备处理其自身 MAC 地址的方式相同。MAC 地址可以是随机 MAC 地址,也可以是根据用户选择的硬件预配 MAC 地址。MLD MAC 地址由框架使用 IWifiStaIface#setMacAddress() HAL API 设置。

供应商软件管理实例 STA MAC 地址(对于每个链路)。当设备与 AP 关联时,供应商软件会为每个关联链路分配一个实例 MAC 地址。

供应商软件根据其算法分配每链路 MAC 地址。该算法必须是可重复的,并且是以下项的函数

  • Wi-Fi 框架设置的 STA-MLD MAC 地址。
  • 链路 ID(从 AP 接收)

这意味着,如果框架重复使用相同的 MLD MAC 地址,则供应商必须重复使用相同的关联每实例 MAC 地址,反之亦然。这保证了当框架生成的 STA-MLD 地址对于 SSID 是持久的时,每 STA MAC 地址也是持久的。

以下是每链路 STA MAC 地址分配的示例算法(供应商可以实现满足算法条件的任何算法)

  • 八位字节 0:确保设置了本地管理位
  • 八位字节 1-4:与 STA-MLD MAC 地址相同
  • 八位字节 5:每 STA = (STA-MLD + 链路 ID + 1) MOD (256)

供应商固件可以执行链路切换并管理链路的省电状态以进行激活或停用,而无需 Wi-Fi 框架的输入。

当链路状态更改时,Wi-Fi 框架不希望收到通知。

省电状态管理

默认情况下,Wi-Fi 框架上启用了省电状态。在省电状态下,供应商固件根据流量模式和链路激活或停用决策来管理各个链路的省电状态。

但是,Wi-Fi 框架可以通过调用 ISupplicantStaIface::setPowerSave(false) HAL API 强制停用省电状态。如果框架停用了省电状态,则供应商固件必须保持至少一个链路处于活跃状态(省电已停用)。在这种状态下,固件实现会决定设置哪个链路。

数据路径

这介绍了供应商固件处理上行链路和下载流量的实现方式。

固件根据其内部实现将上行链路流量路由到一个(或多个)链路。供应商固件决定何时根据流量模式执行负载均衡、重复或聚合流量。我们建议固件在以下情况下将流量复制到多个链路

  • 当通过 IWifiChip#setLatencyMode() HAL API 设置低延迟模式时。
  • 当存在用户优先级为 6 和 7 的流量时。

固件必须将 MAC 标头的(目标)每 STA MAC 地址替换为 MLD-STA MAC,并将 MAC 标头的(源)每 AP MAC 地址替换为 MLD-AP MAC 地址。固件必须在通过 APF 过滤器之前执行此 MAC 地址替换,因为 APF 过滤器命令具有基于 MLD MAC 地址的过滤器。AP-MLD 的所有链路都有一个 APF 过滤器。

并发

在并发场景中,用于新接口的无线装置必须优先于为同一接口的链路专用多个无线装置。并发场景也必须优先于 MLO,无论哪个先出现。为一个接口使用多个链路是机会性的,这意味着仅在以下情况下才使用多个链路

  • 需要 MLO,具体取决于固件针对负载均衡、聚合或重复的决策。
  • MLO 可用,这意味着另一个接口不需要无线装置。

对于运行 Android 14 或更高版本的设备,当 Wi-Fi 7 AP 通过在信标、探测响应和关联响应帧中传输的 TID 到链路的映射元素宣布临时停用其中一个链路时,Wi-Fi 7 工作站会继续使用已设置的剩余链路与 AP 建立连接,而无需执行另一次关联。

对于运行 Android 13 或更低版本的设备,即使关联链路未链接到 TID,Wi-Fi 框架也不支持接收有关由于 TID 到链路的映射而导致链路状态更改的通知。

Wi-Fi 客户端通过以下 AIDL 接口将 TID 到链路的映射更改通知 Wi-Fi 框架

应用可以使用以下 API 获取有关 TID 到链路的映射更改的信息

对于运行 Android 14 或更高版本的设备,以下 API 可用于获取工作站和 AP 的 TID 到链路的映射协商功能。

芯片功能

以下接口支持 TID 到链路的映射协商的芯片功能。

AIDL HAL

TID 到链路的映射协商的 AIDL 接口位于 hardware/interfaces/wifi/aidl/android/hardware/wifi/IWifiChip.aidl 中的 FeatureSetMask 中。T2LM_NEGOTIATION = 1 << 8 功能指示芯片支持 TID 到链路的映射。API

AP 功能

以下接口支持 TID 到链路的映射协商的 AP 功能。

AIDL HAL

框架从客户端查询 AP 功能以及当前连接功能。

API

链路层统计信息包括 Wi-Fi 链路特定详细信息,例如 RSSI、各种 TX 和 RX 数据包计数器以及无线装置统计信息。Wi-Fi 框架定期轮询链路层统计信息和 RSSI,以选择最佳网络或评估已连接网络的质量。对于运行 Android 14 或更高版本的设备,链路层统计信息包括多链路支持。为了支持 Wi-Fi 7,Android 在链路层统计信息和信号轮询中都支持 MLO。

链路特定统计信息可在以下链路层 AIDL 接口中找到

android.net.wifi.WifiManager#addOnWifiUsabilityStatsListener() 系统 API 侦听所有链路层统计信息。框架定期调用此 API 以更新 Wi-Fi 可用性统计信息。

以下链路特定 API 在 android.net.wifi.WifiUsabilityStatsEntry 中可用。

int getRssi(int linkId)
int getLinkState(int linkId)
int getRadioId(int linkId)
int getTxLinkSpeedMbps(int linkId)
long getTotalTxSuccess(int linkId)
long getTotalTxRetries(int linkId)
long getTotalTxBad(int linkId)
long getTotalRxSuccess(int linkId)
long getTotalBeaconRx(int linkId)
int getRxLinkSpeedMbps(int linkId)
int getTimeSliceDutyCycleInPercent(int linkId)
ContentionTimeStats getContentionTimeStats(int linkId, @WmeAccessCategory int ac)
List<RateStats> getRateStats(int linkId)

要查询可用的链路 ID,应用可以调用 android.net.wifi.WifiUsabilityStatsEntry#getLinkIds() 方法。

android.net.wifi.WifiUsabilityStatsEntry 中的 API(用于单链路(非 MLO))返回 MLO 连接的聚合统计信息。以下是聚合标准

  • 以下聚合数据包统计信息使用每链路统计信息的总和

    public long getTotalTxSuccess()
    public long getTotalTxRetries()
    public long getTotalTxBad()
    public long getTotalRxSuccess()
    public int getRxLinkSpeedMbps()
    
  • 以下统计信息使用来自 RSSI 最高的链路的数据

    public int getRssi()
    public int getLinkSpeedMbps()
    public long getTotalBeaconRx()
    public int getTimeSliceDutyCycleInPercent()
    public ContentionTimeStats getContentionTimeStats(@WmeAccessCategory int ac)
    public List<RateStats> getRateStats()
    

对于运行 Android 13 的设备,链路层统计信息不考虑为单个接口使用多个链路的情况。为了支持 MLO,供应商软件在通过 IWifi# getLinkLayerStats_1_6() HAL API 报告 LinkLayerStats 时必须应用以下聚合逻辑。最佳链路是 RSSI 最高的链路。

  • StaLinkLayerStats.iface.beaconRx:报告用于接口的最佳链路的信标计数。
  • StaLinkLayerStats.iface.avgRssiMgmt:报告用于接口的最佳链路的 avgRssiMgmt
  • StaLinkLayerStats.iface.wmeXxPktStats (Xx = Vo, Vi, Be,Bk):报告接口链路上的聚合数据包统计信息(总计)。
  • StaLinkLayerStats.iface.wmeXxContentionTimeStats (Xx = Vo, Vi, Be,Bk):报告接口上使用的最佳链路的争用时间统计信息(最低争用时间统计信息)。

当 Wi-Fi 7 接入点的一个链路被重新用于其他用途时,AP 可以通过 MLO 链路重新配置宣布移除该链路。工作站可以使用剩余链路维持与 AP 的无缝连接,而无需重新关联。

位于 ISupplicantStaIfaceCallback.aidl 中的 Wi-Fi 客户端中的 onMloLinksInfoChanged AIDL 接口支持链路重新配置(AP 移除链路)。

当 Wi-Fi 框架处理链路移除时,链路状态设置为 MLO_LINK_STATE_UNASSOCIATED。然后,框架为链路状态更改触发 ConnectivityManager.NetworkCallback#onCapabilitiesChanged()

WifiInfo#getAffiliatedMloLinks 方法返回关联的 MLO 链路。MloLink#getState 方法返回链路的状态。如果链路被移除,则返回的链路状态为 MLO_LINK_STATE_UNASSOCIATED

芯片 MLO 策略

MLO 允许设备同时在多个 Wi-Fi 链路上发送和接收数据,这可以提高对低延迟、高带宽和低功耗等有特定要求的应用的性能。芯片供应商可以开发关于如何使用可用链路的算法。

特权应用可以使用 Wifimanager 中的 setMloMode 方法修改这些算法,并设置以下模式

  • MLO_MODE_DEFAULT = 0
  • MLO_MODE_LOW_LATENCY = 1
  • MLO_MODE_HIGH_THROUGHPUT = 2
  • MLO_MODE_LOW_POWER = 3

框架在 IWifiChip AIDL 接口中使用 setMloMode 来设置 MLO 模式。