wpa_supplicant 扫描方式简介
WPAS 中, 扫描任务由 wpa_supplicant_scan() 来完成,通过向 eloop 核心注册timeout事件,到期后触发 wpa_supplicant_scan()执行, 实现了定时扫描, 若循环触发定时扫描, 则还可以实现周期扫描。
WPAS 中有4个接口来控制 wpa_supplicant_scan 任务:
wpa_supplicant_update_scan_int()更新扫描间隔时间wpa_supplicant_req_scan()开始调度扫描任务wpa_supplicant_cancel_scan()停止调度扫描任务wpas_scan_scheduled()扫描任务是否被调度
WPAS 周期性扫描
扫描发起时机
若当前未连接到AP, 且 WPAS 不处于DISCONNECTED的状态, 并且保存了未被disable的AP, 则WPAS会发起周期扫描。
周期扫描的间隔时间存储在
struct wpa_supplicant.scan_interval成员中,初始值为10秒 可以通过 wpa_cli 的SCAN_INTERVAL命令来设置间隔时间终止周期扫描
在连接上AP后, 会停止周期扫描
sched scan
如果wifi driver支持sched scan的话, WPAS可以使用sched scan来进行定时扫描。
sched scan 的扫描间隔存储在 struct wpa_supplicant.sched_scan_interval 中,默认值为10s
可以在wpa_supplicant.conf中使用 sched_scan_interval 项来配置
WPAS中的 sched scan 的接口为:

background scan
当STA在ESS(有多个BSS)中移动时,在信号不好的情况下, 需要要从一个BSS漫游到另一个BSS,但是此时有没有完全断开,这个时候可以发出扫描请求,得到比较好信号的BSS,从而 为了增强漫游的无缝体验(在扫描过程中, STA不能收发数据帧), STA可以采用background scan(定时扫描一小段时间, 或者空闲时才扫描)
函数接口
WPAS使用模块的形式来实现bgscan, 每一种bgscan的实现都需要实现如下的接口:

wpas使用如下的接口 来开启/停止bgscan

配置方式
wpas当前支持两种bgscan的实现,修改对应的网络配置接口:
network={
scan_ssid=1
ssid="STA0"
key_mgmt=WPA-PSK FT-PSK
psk="password"
bgscan="simple:30:-45:300" # 新增内容
}
下面介绍配置方式说明
bgscan simple : 需要配置编译选项 :
CONFIG_BGSCAN_SIMPLE# 说明 simple - Periodic background scans based on signal strength # 格式 bgscan="simple:<short bgscan interval in seconds>:<signal strength threshold>:<long interval>" # 举例 bgscan="simple:30:-45:300"
bgscan learn : 需要配置编译选项 :
CONFIG_BGSCAN_LEARN# 说明 learn - Learn channels used by the network and try to avoid bgscans on other channels (experimental) # 格式 bgscan="learn:<short bgscan interval in seconds>:<signal strength threshold>:<long interval>[:<database file name>]" # 举例 bgscan="learn:30:-45:300:/etc/wpa_supplicant/network1.bgscan"
还可以禁能该功能
bgscan=""
若打开了 bgscan, WPAS 在进入 COMPLETED 状态后开启 bgscan, 小于 ASSOCIATED 状态后, 关闭 bgscan,wifi roaming可以在WPAS中实现, 也可以在 wifi driver 或者 wifi firmware中实现,因此要根据需要来配置bgscan。
autoscan
autoscan 类似于 bgscan, 但是 autoscan 是在 DISCNONECT 和 INACTIVE 状态下工作,WPAS 以模块的方式来实现autoscan。
函数接口
每一种autoscan的实现需要提供如下的接口:

WPAS使用如下的接口来 开启/停止 autoscan

配置方式
WPAS 当前支持2种autoscan的实现:
exponential : 扫描间隔指数递增, 编译时需要打开
CONFIG_AUTOSCAN_EXPONENTIALperiodic : 扫描间隔固定, 编译时需要打开
CONFIG_AUTOSCAN_PERIODIC
使用 autoscan 还需要在 wpa_supplicant.conf 中进行配置, 例如

若开启了autoscan, 则在进入 DISCONNECT 或者 INACTIVE 状态后, 开启 autoscan, 进入 AUTHENTICATING 状态后停止 autoscan