저는 Linux 커널 3.3을 사용하고 있으며 이 wpa_cli
유틸리티를 사용하여 WiFi 연결 상태를 모니터링하려고 합니다. Edimax WiFi 어댑터를 사용하여 무선 액세스 포인트에 연결하고 있습니다.
보통 나는 다음과 같은 것을 본다:
# 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
드라이버를 사용하고 있으므로 디버깅을 시작했습니다. 내 문제는 다음과 관련이 있을 수 있다고 생각합니다.이것, 그러나 거기에서 사용된 2.6 커널보다 최신 커널을 사용하고 있기 때문에 정확히 같은 오류는 아닙니다.
업데이트 2:
문제는 커널 어딘가에 있을 수 있다고 생각합니다. 파일 net/mac80211/scan.c
의 함수 라인 214에서 ieee80211_scan_rx
내 AP의 bssid
모양을 확인하고 BSS
(AP에 전원이 공급될 때) 전달합니다 ieee80211_rx_bss_put
(여기). 이 시점에서 스캔 결과로 반환되어 커널의 계층이 인증되고 AP에 연결됩니다 wpa_supplicant
. 그러나 MLME
전원을 끈 후 레이어가 MLME
AP atomic_t
제어 를 포기하는 것을 본 적이 없습니다 BSS
. 이로 인해 BSS
파일의 205번째 줄에서 scan()이 끝날 때 함수의 링크가 취소되지 않습니다(cfg80211_bss_expire
cfg80211_wext_giwscan
net/wireless/scan.c
여기).
MLME
계속 유지 하려면 wpa_supplicant 구성을 추가해야 합니까 BSS
, 아니면 분명히 커널 버그입니까?
난 노력 했어:
# wpa_cli bss_expire_age 10
# wpa_cli bss_expire_count 2
그리고 그것은 아직 내 문제를 해결하지 못했습니다.