WLAN漫游(Roaming)指的是STA(Station)尝试寻找一个有效的AP(接入点)以获取更高数据吞吐量和可靠连接的过程,且在移动的过程中保持用户业务不中断,具体如下图所示:
- STA首先关联到基本服务集1(BSS1)中的AP1,然后在同一个扩展服务集(ESS)中,向BSS2的AP2移动;
- STA在移动过程中,显式或隐式的终止了AP1的关联,并和AP2建立关联;

WLAN漫游解决了以下问题:
- 保证用户IP地址不变,漫游后仍能访问初次上线时关联的网络,且所能执行的业务保持不变。
- 避免漫游过程中用户的认证时间过长而导致数据丢包甚至业务中断。
Wi-Fi中的漫游可分为以下三个主要阶段,每个阶段都有其特定的目的、定义的输入以及相应的操作步骤:
- 漫游触发 —— “我是否需要进行漫游?”
- 候选搜索与选择 —— “我应该漫游到哪个AP?”
- 漫游切换 —— 连接到更好的AP。
Qualcomm WLAN芯片的漫游切换可以在WLAN固件(漫游offload)上执行,以适用于大多数Wi-Fi安全机制,也可以在WLAN Host上执行,以支持WPA3安全机制。漫游offload的优势在于可以获得更好的功耗,因为系统能够在睡眠模式下漫游。
1. WLAN 漫游过程详解
本章节将详细介绍了 WLAN 漫游的三个阶段。
阶段 1 – 我需要进行漫游吗?
- 低 RSSI:Beacon RSSI 是主要触发因素
- 当 RSSI 低于 gNeighborLookupThreshold 时,漫游模块会执行周期性扫描,以获取并将符合条件的接入点(AP)的信道添加到信道映射中。当扫描持续到达 qNeighborScanRefreshPeriod 时间,或者 RSSI 升至高于 gNeighborLookupThreshold 时,周期性扫描就会停止。
- 当 RSSI 低于 -68 dBm(gNeighborLookupThreshold - gRoamRescanRssiDiff)时,将触发漫游扫描。
- 高 RSSI
- 几乎 90% 的现代 AP 都具备 2.4G/5G 双频能力。由于法规限制,2.4G 的发射功率高于 5G。因此,Wi-Fi 终端在进入 AP 信号覆盖范围时,通常会先发现并连接到 2.4G AP。
- 通过此特性,Wi-Fi 终端有机会切换到 5G 频段,以利用 5G 所带来的优势,例如更高的速度和更少的信道干扰。
- DUT 连接到 2.4G AP,当前 RSSI = X dBm
- DUT 将高 RSSI 阈值设置为 -66 dBm。
- 高 RSSI 阈值 = gNeighborLookupThreshold(-78) + 高 RSSI 差值
- 高 RSSI 差值:
-
If ((gNeighborLookupThreshold + gOpportunisticThresholdDiff + gRoamScanHiRssiDelta) – current RSSI) < gRoamScanHiRssiDelta)
High RSSI delta = gNeighborLookupThreshold(-78) + gOpportunisticThresholdDiff(0) + gRoamScanHiRssiDelta(10) – current RSSI
Else
High RSSI delta = gRoamScanHiRssiDelta (10)
-
- DUT 还会根据 INI 参数 roam_bad_rssi_thresh_offset_2g 设置另一个阈值。
-
RSSI_h = gNeighborLookupThreshold + roam_bad_rssi_thresh_offset_2g
-
- 在正向跨过高 RSSI(第 (b) 点提到的)阈值时,会触发一次事件,DUT 同时会执行 3 次周期性扫描(由 gRoamScanHiRssiMaxCount 指定),以寻找更优的 5G AP,周期为 15 秒。
- - 如果在步骤 (d) 的扫描中未找到任何 5G AP,即使如此,固件仍会执行后台扫描,以基于系统中发生的任何其他扫描(例如主机扫描)来持续寻找更优的 AP。由于主机扫描的存在,如果固件发现了任何 5G AP,DUT 将切换到该 5G AP。此时的 RSSI 范围为 -66 dBm 到在步骤 (c) 中计算得到的 RSSI_h。
- 需要注意的另一点是,后台扫描(BG)的范围从 gNeighborLookupThreshold 到 RSSI_h。在此范围内,后台扫描处于激活状态,并会持续寻找更优的 AP。
- 通过上述步骤,DUT 在连接到 2.4G 后可以切换到 5G AP。
- Beacon miss
- 如果连续丢失了 gRoamEmissFirstEnct 个信标,漫游模块会使用主机发送的信道映射执行一次学习扫描。如果再次连续丢失 gRoamEmissFirstEnct 个信标,则会产生最终的信标丢失状态。该状态将触发漫游。如果未找到可进行漫游的候选 AP,则会导致“心跳断开”问题。
- STA_KICKOUT
- 数据通路会跟踪每次重试的发送失败情况。如果发送尝试的失败次数过多(大约 2000 次尝试),则会触发 STA_KICKOUT 事件。当前的实现将此情况视为心跳故障并断开连接。
- 如果在漫游扫描期间发生 STA_KICKOUT,固件会等待漫游扫描完成。如果找到合适的漫游候选,固件会忽略 STA_KICKOUT 并执行漫游。如果未找到候选,固件会再次触发 STA_KICKOUT 事件。
- Disconnect by AP
- 如果终端(Station)收到解除认证或断开关联的数据包,将触发漫游扫描。
- 然而,如果当前连接的 AP 是 FT AP,并且解除认证的原因码为无效 PMKID(49),固件会将该解除认证帧转发给主机。
- Traffic Loading(流量负载)
- 漫游模块会在常规扫描完成后,如果可漫游的 AP 数量超过 gRoam_dense_min_aps(3),则判定当前环境为高密度环境。
- 在高密度环境中,漫游模块会开始监控流量。当发送(Tx)或接收(Rx)流量超过 gtraffic_threshold(400 Mbps)时,将触发漫游扫描。
- Idle monitor(空闲监控)
- 如果当前 AP 的 RSSI 低于阈值,漫游模块将触发漫游扫描。
- 若要将连接视为闲置,并且已启用 enable_idle_roam,则应满足以下条件:
- 用户空间发送 SET_SUSPENDMODE 命令,值为 0。
- 在由 idle_roam_inactive_time 配置的闲置时间内,没有任何 Tx/Rx 数据。
- 连接 AP 的 RSSI 变化不会超过特定的差值(通过 idle_roam_rssi_delta 进行配置)。
- 连接 AP 的 RSSI 低于最低 RSSI 阈值(通过 idle_roam_min_rssi 进行配置)。
- BSS Transition Management (802.11v)
- 如果当前连接的 AP 支持邻居报告或 BTM,并且 btm_offload_config 的 bit8 和 bit9 都为 0,当首次出现信标丢失或低 RSSI 事件时,将触发 BTM 查询。
- 如果 btm_offload_config 的 bit8 为 1,则在扫描完成后,漫游模块会执行 BTM 查询。
- 如果在 BTM 响应之后仍有漫游挂起,则会在 BTM 响应后执行漫游挂起操作;若无挂起,则在 BTM 响应后进行漫游扫描。
- PER
- 触发漫游扫描的依据是所使用的收发(Rx/Tx)数据速率。发送速率(Tx rate)间接地用于表示 STA 所观测到的分组错误率(PER),而接收速率(Rx rate)则用于估计 AP 所观测到的 PER。
- BSS Load(BSS 负载)
- 漫游模块触发漫游扫描的依据是信标或探测响应(probe response)中的 BSS Load 元素。
- 以下是根据 BSS Load 触发漫游扫描的条件:
- 当前 RSSI 高于 gNeighborLookupThreshold
- 当连接在 2.4G 时,当前 RSSI 高于 bss_load_trigger_2g_rssi_threshold
- 当连接在 5G 时,当前 RSSI 高于 bss_load_trigger_5g_rssi_threshold
- BSS 负载值高于 bss_load_threshold
阶段 2 – 我要漫游到哪个 AP?
漫游模块使用已学习到的信道映射以及其他参数(例如配置的驻留时间和突发时长),向扫描模块发送扫描请求。
信道映射由主机进行配置,或者通过后台扫描学习获得。如果漫游切换到不同的 SSID,则会对信道映射进行相应的管理。
在大多数漫游扫描中,会先扫描信道映射。如果在漫游扫描期间发现了更优的候选 AP,固件会停止扫描并执行漫游切换。如果从 AP 收到了 BTM 帧,也会对信道映射进行扫描。如果扫描是由“最终信标丢失”引起的,则会对该国家/地区所有信道(当前耗时 900 ms)重新进行扫描。信标丢失会触发对所有信道的扫描,包括 DFS 信道。
- AP 配置文件匹配,扫描接收到的每个信标都会基于以下信息与 AP 配置文件进行匹配:
- SSID
- RSSI 比当前连接的AP提升了 x dB
- 安全
- 发送事件至漫游模块
- 只有更优的 AP 信标或探测响应才会发送给漫游模块。
- 漫游模块会忽略并非更优的 AP 信标。
- 漫游模块在接收到这些事件后,会使用 BSSID 列表(扫描时或之后由主机提供)并进行存储。
- 候选选择逻辑
- 漫游模块会根据 RSSI、带宽(BW)、空间流数(NSS)、频段以及 BSS 负载等多种因素来评估 BSSID 的评分。
- 漫游模块会对候选列表进行排序,并进行尽力而为的关联操作。
阶段 3 – 漫游切换
漫游offload:
当 Reassoc_Rsp.status = success 时,固件会删除旧的对端(peer)。如果重新关联(reassociate)失败,而旧的对端仍处于当前 AP 范围内,则不会与当前 AP 断开连接。
新的对端在部分重新认证(partial reauthentication)后会连接到当前 AP 的信道,并在该信道上保持 60 ms。固件会固定在候选 AP 的信道上,并继续完成漫游切换(包括密钥派生),以避免重复的信道切换开销。
当 Reassoc_Rsp 成功后,会移除来自当前 AP 的旧对端。如果在漫游过程中(Reassoc_Rsp 成功的前提下)出现任何错误(例如 EAPOL 超时、EAPOL 失败或认证失败),DUT 将与当前 AP 和新 AP 同时断开连接。
- 提前漫游开始通知
- 如果在漫游切换前,APPS 已经处于唤醒状态,则固件会发送 ROAM_EVENTID 通知(notify = ROAM_START)。
- 在接收到 ROAM_START 后,固件会从内核迁移网络连接和传输队列(tx_queue)。
- 信道切换操作
- 固件会发出一个持续 4 秒的 OCS 信道请求。
- 如果另一个 VDEV 是 STA 或 P2P 客户端,则禁用 NoA。
- 如果另一个 VDEV 是 P2P GO,则不进行信道切换。
- 预认证操作
- 一旦通过 OCS 获得信道,如果存在 11R/CCKM,则初始化 supplicant(因为需要生成 CCKM IE 或者 FT IE/MDIE)。
- 发送认证帧并接收认证帧的响应。
- 重新关联
- 如果认证(AUTH)成功,终端会持续发送重新关联请求并接收响应。
- 如果在 802.11i 场景下重新关联成功,则漫游完成。
- 如果失败,则忽略当前候选 AP,继续保持与当前 AP 的连接并尝试下一个候选。
- BSS 管理
- 一旦重新关联成功,就会删除旧的对端(依次执行:vdev down > peer delete > vdev stop),并在启动的 VDEV 上创建新的对端。
- 如果漫游没有成功,则继续保留旧对端,并尝试下一个候选。
- 密钥交换
- EAPOL 握手由固件执行。
- 如果固件丢弃了任何密钥,固件会向主机驱动报告漫游同步事件。
- 向主机报告漫游同步
- 如果主机已处于唤醒状态,则无需特殊处理,固件会直接向主机驱动发送 roam_synch_event。
- 如果主机处于休眠模式,固件会在任一情况下向主机驱动发送 roam_sync_event,可能会强制唤醒主机?
- 当漫游失败并且旧对端已被删除时,固件会发送 roam_event(原因 = ROAM_HO_FAILURE)。