wpa_cli
私は Linux カーネル 3.3 を使用しており、ユーティリティを使用して 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
、 APbssid
のBSS
が表示され (AP に電源が入っているとき)、ieee80211_rx_bss_put
(ここ)。この時点で、スキャン結果に返され、カーネル内のレイヤーがその AP を認証して接続します。ただし、AP の電源を切断した後、レイヤーがその の保持を放棄することはありませんwpa_supplicant
。これにより、スキャンの終了時の関数 ( ) で、ファイル の205 行目 (MLME
MLME
atomic_t
BSS
BSS
cfg80211_bss_expire
cfg80211_wext_giwscan
net/wireless/scan.c
ここ)。
MLME
レイヤーの保持を減らすために wpa_supplicant で何らかの設定を追加する必要があるのでしょうかBSS
、それともこれは明らかにカーネルのバグでしょうか?
すでに試しました:
# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2
私の問題は解決されていません。