Linux Kernel 3.3 не регистрирует пропущенные маяки с подключенной точкой доступа

Я использую ядро ​​linux 3.3 (я не могу обновить свое ядро, извините!) И пытаюсь использовать wpa_cli утилита для мониторинга состояния моего WiFi соединения. Я использую WiFi-ключ Edimax для подключения к беспроводной точке доступа.

Я ожидаю увидеть что-то вроде этого:

# 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 иногда будет правильным, но обычно (99%) нет.

Вот мой /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=
}

После некоторого расследования я считаю, что происходит что-то странное, заставляющее ядро ​​возвращать кэшированную версию списка AP. Я использую RTL8192cu Водитель. Я уже посмотрел на эту проблему, и она не такая, как у меня.

Я считаю, что проблема может быть где-то в ядре. В файле net/mac80211/scan.cв строке 214 в функции ieee80211_scan_rx, Я вижу bssid от BSS моего AP появляются (когда AP имеет власть) и получают через ieee80211_rx_bss_put ( здесь). В этот момент он возвращается в результатах сканирования и wpa_supplicant вызывает MLME слой в ядре для аутентификации и соединения с этим AP. Тем не менее, после отключения питания AP, я никогда не вижу MLME слой отказаться это atomic_t держись BSS, Это вызывает BSS чтобы никогда не связаны в функции cfg80211_bss_expire в конце сканирования (cfg80211_wext_giwscan), в файле net/wireless/scan.cлиния 205 ( здесь).

В частности, я хотел бы знать, почему атомные "держали" BSS не уменьшается при отключении питания от точки доступа - в результате чего linux пропускает достаточное количество маяков для отключения? Или есть какая-то конфигурация с 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 драйвер и проблема была исправлена.

Этот патч по сути те же самые изменения, которые я сделал, и комментарии в этом файле являются частью того, что привело меня к этому ответу.

Другие вопросы по тегам