天天看點

Android Wi-Fi wpa_supplicant AP掃描選擇政策

1. 概況描述

1.1 問題場景

假設有兩個AP熱點的essid以及安全政策均相同,使用者打開手機wifi開關,會發現隻能夠搜尋到一個wlan條目,因為對使用者來說,essid與安全政策均相同的幾個熱點,被認為是多個bss組成的ess。那麼當使用者點選連接配接後,究竟連接配接的是哪一個AP的熱點呢?過程又是什麼樣?下面我們就慢慢講述

1.2 名詞術語

本文涉及的專有名詞、定義和縮寫的含義如下:

Num 名詞 說明
1 wpa_supplicant Android手機中對無線網絡管理和控制的程式
2 bss 基礎服務集,一般指wifi熱點信号
3 ess 擴充服務集,可包含多個bss
4 bssid 辨別一個bss的資訊,一般表示為48bit的mac位址
5 essid 辨別一個ess的資訊,一般為字元串形式,即網絡信号名
6

2. 連接配接過程

2.1 指令下發

首先,當使用者在手機界面上點選某個wifi信号進行連接配接時,wifi service會通過wpa_cli控制接口向wpa_supplicant連續下發三條指令:

Android Wi-Fi wpa_supplicant AP掃描選擇政策

ADD_NETWORK 

在wpa_supplicant中配置設定一個wpa_ssid對象,并設定一些預設屬性。具體處理函數為wpa_supplicant_ctrl_iface_add_network().

SET_NETWORK 

對所添加的wlan資訊進行配置,主要包括essid,keymgt,passphrase等資訊。

設定完畢後,在wpa_supplicant.conf中将以如下方式儲存:

network={
    ssid="example"
    proto=WPA
    key_mgmt=WPA-PSK
    pairwise=TKIP
    group=TKIP
    psk="1234567890"
}
           

ENABLE_NETWORK

将配置好的wlan對應的wpa_ssid結構中disable狀态置為0,填充掃描請求的參數,其中可以指定掃描周圍所有無線網絡,也可以指定掃描某個特定的網絡。然後并向驅動發起一次掃描請求。

2.2 掃描結果處理

wpa_supplicant中維護着一個wpa_bss的連結清單,用來表示目前環境中存在的無線網絡。其中每個節點都有一個定時器,每次掃描後将根據掃描結果更新節點以及定時器,若某個節點定時器逾時未被更新,則表示此網絡不存在,将從連結清單中删除。

Android Wi-Fi wpa_supplicant AP掃描選擇政策

驅動掃描結束後,掃描結果通過driverinterface傳回到wpa_supplicant,儲存在一個數組中,并對掃描結果按照信号強度從高到低進行快速排序。(假設A與A(1)具有相同的essid)

Android Wi-Fi wpa_supplicant AP掃描選擇政策

然後用掃描結果去更新bss連結清單中對應網絡的信号強度,以及此節點的定時器。

Android Wi-Fi wpa_supplicant AP掃描選擇政策

更新的方式為:依次用掃描結果中的每一項去添加或更新bss連結清單中對應BSS,每更新一個節點,則将這個節點移動到連結清單尾部。這樣,就保證了未被更新的節點永遠在連結清單首部。

此次掃描未掃描到網絡B與E,則更新後,B與E處于連結清單頭位置。若它們的定時器逾時但仍然未被更新,則說明網絡B、E在目前環境下已經不存在,則從BSS連結清單頭部删除。

Android Wi-Fi wpa_supplicant AP掃描選擇政策

此時,BSS連結清單經過更新後,并非按照信号強度排列,是以,在更新BSS連結清單的同時,用一個指針數組來維護BSS連結清單按照信号強度從高到低的序列,如下圖:

Android Wi-Fi wpa_supplicant AP掃描選擇政策

注意:

為什麼不直接使用數組儲存bss,或直接對連結清單進行排序?

第一,因為bss表需要進行頻繁的插入與删除操作,并且需要頻繁移動表中元素的位置,使用數組代價太大。

第二,由于連結清單結構本身的特點,無法對其使用快速排序。是以額外添加一個指針數組來維護bss表的有序序列。

這是一個典型的利用空間換時間的例子。

2.3 選擇BSS

接下來,将wpa_ssid連結清單中disable狀态為0的wpa_ssid結構與上述bss連結清單的有序序列的每個bss依次進行比對,直到找到相比對的bss。而使用者通過手動點選連接配接的wpa_ssid具有最高的優先級(priority字段),是以對其優先進行比對。由于bss序列中信号較強的bss排在前面,一旦比對成功則進行連接配接,是以預設總是去連接配接信号較強的bss.

比對成功後,将以此bss作為參數,向驅動發起連接配接接請求。經過認證、關聯的步驟,即可連接配接上wifi熱點。

Android Wi-Fi wpa_supplicant AP掃描選擇政策

3. 代碼位置

external/wpa_supplicant_8/wpa_supplicant/ctrl_iface.c 

external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant.c

external/wpa_supplicant_8/wpa_supplicant/scant.c

external/wpa_supplicant_8/wpa_supplicant/bss.c

external/wpa_supplicant_8/wpa_supplicant/events.c