Estoy usando Linux Kernel 3.3 e intento usar la wpa_cli
utilidad para monitorear el estado de mi conexión WiFi. Estoy usando un dongle WiFi de Edimax para conectarme a un punto de acceso inalámbrico.
Normalmente veo algo como esto:
# wpa_cli status
Selected interface 'wlan0'
wpa_state=SCANNING
ip_address=XXX.XXX.XXX.XXX
address=XX:XX:XX:XX:XX:XX
O lo mismo pero con wpa_state=COMPLETED
.
Analizar la salida de este texto me permite ver si mi conexión inalámbrica está activa o escaneando. Sin embargo, he notado que después de apagar mi punto de acceso wpa_state=COMPLETED
todavía se devuelve. Usando el comando:
# iwlist wlan0 scanning
Fuerza un escaneo y wpa_state
será correcto.
Fuerza un escaneo y wpa_state
ocasionalmente será correcto, pero generalmente no.
Me pregunto si tengo una configuración incorrecta en alguna parte, o si hay una manera más eficiente de hacer esto (básicamente solo quiero ver si mi interfaz tiene una conexión activa o no). Aquí está /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=
}
Preferiría no forzar un escaneo cada vez, sino dejar que los módulos del controlador/kernel se encarguen de eso. Esta es la primera vez que trabajo con WiFi en Linux, así que creo que es probable que haya configurado algo incorrectamente. ¿Alguien puede indicarme la dirección correcta?
Actualizar:
Después de investigar un poco más, creo que está sucediendo algo extraño que hace que el kernel devuelva una versión almacenada en caché de la lista de AP. Estoy usando el RTL8192cu
controlador, así que comencé a depurarlo. Creo que mi problema puede estar relacionado coneste, pero no es exactamente el mismo error, ya que tengo un kernel más reciente que el kernel 2.6 que se usa allí.
Actualización 2:
Mi creencia es que el problema puede estar en algún lugar del núcleo. En el archivo net/mac80211/scan.c
, en la línea 214 de la función ieee80211_scan_rx
, veo que aparece un bssid
mensaje BSS
de mi AP (cuando el AP tiene energía) y se coloca a través de ieee80211_rx_bss_put
(aquí). En este punto, se devuelve en los resultados del escaneo y wpa_supplicant
hace que la MLME
capa en el kernel se autentique y se conecte con ese AP. Sin embargo, después de desconectar la alimentación del AP, nunca veo que la MLME
capa renuncie atomic_t
a su control BSS
. Esto hace que BSS
nunca se desvincule en la función
cfg80211_bss_expire
al final de un escaneo ( cfg80211_wext_giwscan
), en el archivo net/wireless/scan.c
, línea 205 (aquí).
¿Hay alguna configuración con wpa_supplicant que necesito agregar para que la MLME
capa disminuya y se mantenga en el BSS
, o es claramente un error del kernel?
Ya lo he probado:
# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2
y no he resuelto mi problema.
Respuesta1
Entonces, después de investigar mucho, descubrí que el problema se debía al rtlwifi
controlador del kernel. Para mí, parece que rtl8192cu
se suponía que el conductor era responsable de manejar las balizas perdidas llamando a la función ieee80211_beacon_loss
, pero esa llamada no se encuentra por ninguna parte. Eliminé la compatibilidad con IEEE80211_HW_BEACON_FILTER
el rtlwifi
controlador y el problema se solucionó.
Esteparcheson esencialmente los mismos cambios que hice, y los comentarios en estearchivoson parte de lo que me llevó a esta respuesta.