我正在使用 Linux 内核 3.3,并尝试使用该wpa_cli
实用程序来监视我的 WiFi 连接的状态。我正在使用 Edimax WiFi 适配器连接到无线接入点。
通常我会看到这样的东西:
# wpa_cli status
Selected interface 'wlan0'
wpa_state=SCANNING
ip_address=XXX.XXX.XXX.XXX
address=XX:XX:XX:XX:XX:XX
或者同样的事情,但与wpa_state=COMPLETED
.
解析此文本输出使我可以查看我的无线连接是否处于活动状态或正在扫描。但是,我注意到关闭电源后我的接入点wpa_state=COMPLETED
仍然返回。使用命令:
# iwlist wlan0 scanning
强制扫描并且wpa_state
将是正确的。
强制扫描,wpa_state
有时会正确,但通常不会。
我想知道我的配置是否在某个地方不正确,或者是否有更有效的方法来执行此操作(我本质上只是想查看我的接口是否有活动连接)。这是/etc/wpa_supplicant.conf
:
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
country=US
network={
ssid="myssid"
psk="mypsk"
key_mgmt=WPA-PSK
eap=
}
我不想每次都强制扫描,而是让驱动程序/内核模块处理它。这是我第一次在 Linux 中使用 WiFi,所以我认为我可能配置错误。有人能指出我正确的方向吗?
更新:
经过进一步的调查,我相信发生了一些奇怪的事情,导致内核返回 AP 列表的缓存版本。我正在使用该RTL8192cu
驱动程序,因此我已经开始对此进行调试。我认为我的问题可能与这,但并不是完全相同的错误,因为我有一个比那里使用的 2.6 内核更新的内核。
更新2:
我认为问题可能出在内核的某个地方。在文件中net/mac80211/scan.c
,在函数的第 214 行ieee80211_scan_rx
,我看到我的 AP 的bssid
出现BSS
(当 AP 有电时)并通过ieee80211_rx_bss_put
(这里)。此时,它会在扫描结果中返回,并wpa_supplicant
导致MLME
内核中的层进行身份验证并与该 AP 连接。然而,在断开 AP 电源后,我从未看到该MLME
层放弃对其的atomic_t
控制BSS
。这会导致在扫描 ( ) 结束时BSS
永远不会取消函数中的链接 ,位于 file 的第 205 行(cfg80211_bss_expire
cfg80211_wext_giwscan
net/wireless/scan.c
这里)。
是否需要添加一些 wpa_supplicant 配置才能使其MLME
保留在 上BSS
,或者这显然是一个内核错误?
我已经尝试过:
# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2
并且还没有解决我的问题。