WPA_CLI mostrando o ponto de acesso como conectado quando não deveria

4

Estou usando o kernel Linux 3.3 e estou tentando usar o utilitário wpa_cli para monitorar o status da minha conexão WiFi. Estou usando um dongle Wi-Fi da Edimax para se conectar a um ponto de acesso sem fio.

Normalmente vejo algo assim:

# wpa_cli status
Selected interface 'wlan0'
wpa_state=SCANNING
ip_address=XXX.XXX.XXX.XXX
address=XX:XX:XX:XX:XX:XX

Ou a mesma coisa, mas com wpa_state=COMPLETED .

Analisar a saída deste texto permite-me ver se a minha conexão sem fio está ativa ou digitalizada. No entanto, notei que depois de desligar meu ponto de acesso wpa_state=COMPLETED ainda está sendo retornado. Usando o comando:

# iwlist wlan0 scanning

Força uma varredura e wpa_state estará correto.

Força uma varredura e wpa_state ocasionalmente estará correto, mas geralmente não.

Eu estou querendo saber se eu tenho uma configuração incorreta em algum lugar, ou se há uma maneira mais eficiente de fazer isso (eu estou essencialmente apenas querendo ver se a minha interface tem uma conexão ativa ou não). Aqui está o /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=
}

Eu preferiria não forçar uma varredura toda vez, mas deixaria os módulos driver / kernel lidar com isso. Esta é a minha primeira vez trabalhando com WiFi no Linux, então acho que parece que eu configurei algo incorretamente. Alguém pode me apontar na direção certa?

Atualização:

Após algumas investigações posteriores, acredito que algo estranho está acontecendo, fazendo com que o kernel retorne uma versão em cache da lista de APs. Eu estou usando o driver RTL8192cu , então eu comecei a depurar isso. Acho que meu problema pode estar relacionado a este , mas não exatamente o mesmo bug que eu tenho um kernel mais recente que o kernel 2.6 usado lá.

Atualização 2:

Acredito que o problema pode estar em algum lugar no kernel. No arquivo net/mac80211/scan.c , na linha 214 na função ieee80211_scan_rx , vejo um bssid do BSS do meu AP aparecer (quando o AP tiver energia) e ser colocado via ieee80211_rx_bss_put (here ). Neste ponto, ele é retornado nos resultados da varredura e wpa_supplicant faz com que a camada MLME no kernel seja autenticada e se conecte com esse AP. No entanto, depois de desconectar a energia do AP, eu nunca vejo a MLME camada desistir de que é atomic_t segure esse BSS . Isso faz com que o BSS nunca seja desvinculado da função cfg80211_bss_expire no final de uma varredura ( cfg80211_wext_giwscan ), no arquivo net/wireless/scan.c , linha 205 ( aqui ).

Existe alguma configuração com o wpa_supplicant que eu preciso adicionar para que o MLME layer decrement seja mantido no BSS , ou isso é claramente um bug do kernel?

Eu já tentei:

# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2

e não resolvi o meu problema.

    
por zeus_masta_funk 19.05.2016 / 16:06

1 resposta

2

Então, depois de muita escavação, descobri que o problema era o driver rtlwifi do kernel. Para mim, parece que o driver rtl8192cu deveria ser responsável por manipular os beacons perdidos, chamando a função ieee80211_beacon_loss , mas essa chamada está longe de ser encontrada. Removi o suporte para IEEE80211_HW_BEACON_FILTER no driver rtlwifi e o problema foi corrigido.

Este patch é basicamente as mesmas alterações que eu fiz e os comentários neste < Um arquivo href="http://lxr.free-electrons.com/source/include/net/mac80211.h?v=3.3#L1439"> é parte do que me levou a essa resposta.     

por 27.05.2016 / 23:01