WPA_CLI 显示接入点已连接,但本不该连接

WPA_CLI 显示接入点已连接,但本不该连接

我正在使用 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_expirecfg80211_wext_giwscannet/wireless/scan.c这里)。

是否需要添加一些 wpa_supplicant 配置才能使其MLME保留在 上BSS,或者这显然是一个内核错误?

我已经尝试过:

# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2

并且还没有解决我的问题。

答案1

经过大量挖掘后,我发现问题出在内核的rtlwifi驱动程序上。对我来说,驱动程序似乎rtl8192cu应该通过调用 函数 来负责处理丢失的信标ieee80211_beacon_loss,但找不到该调用。我删除了对IEEE80211_HW_BEACON_FILTER驱动程序的支持rtlwifi,问题已得到解决。

修补本质上与我所做的更改以及此中的评论相同文件是导致我得到这个答案的部分原因。

相关内容