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ここ)。この時点でスキャンの結果として返され、カーネルの階層が認証され、APに接続されますwpa_supplicant。ただし、MLME電源を切った後、レイヤーがMLMEAPatomic_t制御を放棄するのを見たことはありませんBSS。これにより、BSSファイルの205行目でscan()が終了したときに関数へのリンクがキャンセルされません(cfg80211_bss_expirecfg80211_wext_giwscannet/wireless/scan.cここ)。

MLME続行するには、wpa_supplicant設定を追加する必要がありますかBSS、それとも明らかにカーネルのバグですか?

私は努力しました:

# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2

そしてそれはまだ私の問題を解決していません。

答え1

多くの調査の最後に、問題がカーネルrtlwifiドライバにあることがわかりました。ドライバが関数rtl8192cuを呼び出して欠落しているビーコンを処理する必要があるようですが、ieee80211_beacon_loss呼び出しが見つかりませんでした。IEEE80211_HW_BEACON_FILTERドライバのサポートを削除し、rtlwifi問題を修正しました。

これ修理する本質的に私が変更した内容とそれに対するコメントは同じです。文書私がこの答えを得た理由の一部です。

関連情報