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
драйвер и проблема была исправлена.
Этот патч по сути те же самые изменения, которые я сделал, и комментарии в этом файле являются частью того, что привело меня к этому ответу.