web-dev-qa-db-ja.com

WPA_CLIは、アクセスポイントが接続されていないときに接続されていることを示しています

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レイヤーがBSSatomic_t保持することを放棄することはありません。これにより、スキャンの最後に関数cfg80211_bss_expireBSSがリンク解除されなくなります(cfg80211_wext_giwscan)、ファイルnet/wireless/scan.c、205行目( ここ ) 。

MLMEレイヤーをBSSで保持するようにデクリメントするために追加する必要があるwpa_supplicantの構成はありますか、それともこれは明らかにカーネルのバグですか?

私はすでに試しました:

# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2

私の問題は解決していません。

4
zeus_masta_funk

たくさん調べた結果、問題の原因はカーネルのrtlwifiドライバーにあることがわかりました。私には、rtl8192cuドライバーが関数ieee80211_beacon_lossを呼び出すことにより、失われたビーコンの処理を担当すると想定されていたようですが、その呼び出しは見つかりません。 rtlwifiドライバーのIEEE80211_HW_BEACON_FILTERのサポートを削除し、問題が修正されました。

この patch は、基本的に私が行った変更と同じであり、この file のコメントは、この答えに導いたものの一部です。

2
zeus_masta_funk