Linuxカーネル3.3を使用していて、wpa_cli
ユーティリティを使用してWiFi接続のステータスを監視しようとしています。 EdimaxWiFiドングルを使用してワイヤレスアクセスポイントに接続しています。
通常、私はこのようなものを見ます:
# 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
ドライバーを使用しているので、これのデバッグを開始しました。私の問題は this に関連していると思いますが、そこで使用されている2.6カーネルよりも新しいカーネルを使用しているのとまったく同じバグではありません。
アップデート2:
私の考えでは、問題はカーネルのどこかにある可能性があります。ファイルnet/mac80211/scan.c
の関数ieee80211_scan_rx
の214行目に、APのbssid
からBSS
が表示され(APに電力が供給されている場合)、ieee80211_rx_bss_put
を介して配置されます( ここ )。この時点で、スキャン結果に返され、wpa_supplicant
により、カーネルのMLME
レイヤーが認証され、そのAPに接続されます。ただし、APの電源を切断した後、MLME
レイヤーがBSS
をatomic_t
保持することを放棄することはありません。これにより、スキャンの最後に関数cfg80211_bss_expire
でBSS
がリンク解除されなくなります(cfg80211_wext_giwscan
)、ファイルnet/wireless/scan.c
、205行目( ここ ) 。
MLME
レイヤーをBSS
で保持するようにデクリメントするために追加する必要があるwpa_supplicantの構成はありますか、それともこれは明らかにカーネルのバグですか?
私はすでに試しました:
# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2
私の問題は解決していません。