wpa supplicant 的初始化

2021-05-26 23:25:01 字數 3717 閱讀 3500

1. 啟動命令

wpa supplicant 在啟動時,啟動命令可以帶有很多引數,目前我們的啟動命令如下:

wpa_supplicant /system/bin/wpa_supplicant -dwext -ieth0 -c/data/wifi/wpa_supplicant.conf -f/data/wifi/wpa_log.txt

wpa_supplicant對於啟動命令帶的引數,用了兩個資料結構來儲存,

乙個是 wpa_params, 另乙個是wpa_inte***ce.

這主要是考慮到wpa_supplicant是可以同時支援多個網路介面的。

wpa_params資料結構主要記錄與網路介面無關的一些引數設定。

而每乙個網路介面就用乙個wpa_inte***ce資料結構來記錄。

在啟動命令列中,可以用-n來指定將要描述乙個新的網路介面,對於乙個新的網路介面,可以用下面六個引數描述:

-i: 網路介面名稱 

-c: 配置檔案名稱

-c: 控制介面名稱

-d: 驅動型別

-p: 驅動引數

-b: 橋介面名稱

2. wpa_supplicant 初始化流程

2.1. main()函式:

在這個函式中,主要做了四件事。

a. 解析命令列傳進的引數。

b. 呼叫wpa_supplicant_init()函式,做wpa_supplicant的初始化工作。

c. 呼叫wpa_supplicant_add_iface()函式,增加網路介面。

d. 呼叫wpa_supplicant_run()函式,讓wpa_supplicant真正的run起來。

2.2. wpa_supplicant_init()函式:

a. 開啟debug 檔案。

b. 註冊eap peer方法。

c. 申請wpa_global記憶體,該資料結構作為統領其他資料結構的乙個核心, 主要包括四個部分:

wpa_supplicant *ifaces   /*每個網路介面都有乙個對應的wpa_supplicant資料結構,該指標指向最近加入的乙個,在wpa_supplicant資料結構中有指標指向next*/

wpa_params params   /*啟動命令列中帶的通用的引數*/

ctrl_iface_global_priv *ctrl_iface  /*global 的控制介面*/

ctrl_iface_dbus_priv *dbus_ctrl_iface  /*dbus 的控制介面*/

d. 設定wpa_global中的wpa_params中的引數。

e. 呼叫eloop_init函式將全域性變數eloop中的user_data指標指向wpa_global。

f. 呼叫wpa_supplicant_global_ctrl_iface_init函式初始化global 控制介面。

g. 呼叫wpa_supplicant_dbus_ctrl_iface_init函式初始化dbus 控制介面。

h. 將該daemon的pid寫入pid_file中。

2.3. wpa_supplicant_add_iface()函式:

該函式根據啟動命令列中帶有的引數增加網路介面, 有幾個就增加幾個。

a. 因為wpa_supplicant是與網路介面對應的重要的資料結構,所以,首先分配乙個wpa_supplicant資料結構的記憶體。

b. 呼叫wpa_supplicant_init_iface() 函式來做網路介面的初始工作,主要包括:

設定驅動型別,預設是wext;

讀取配置檔案,並將其中的資訊設定到wpa_supplicant資料結構中的conf 指標指向的資料結構,它是乙個wpa_config型別;

命令列設定的控制介面ctrl_inte***ce和驅動引數driver_param覆蓋配置檔案裡設定,命令列中的優先;

拷貝網路介面名稱和橋介面名稱到wpa_config資料結構;

對於網路配置塊有兩個鍊錶描述它,乙個是 config->ssid,它按照配置檔案中的順序依次掛載在這個鍊錶上,還有乙個是pssid,它是乙個二級指標,指向乙個指標陣列,該指標陣列按照優先順序從高到底的順序依次儲存wpa_ssid指標,相同優先順序的在同一鍊錶中掛載。

c. 呼叫wpa_supplicant_init_iface2() 函式,主要包括:

呼叫wpa_supplicant_init_eapol()函式來初始化eapol;

呼叫相應型別的driver的init()函式;

設定driver的param引數;

呼叫wpa_drv_get_ifname()函式獲得網路介面的名稱,對於wext型別的driver,沒有這個介面函式;

呼叫wpa_supplicant_init_wpa()函式來初始化wpa,並做相應的初始化工作;

呼叫wpa_supplicant_driver_init()函式,來初始化driver介面引數;在該函式的最後,會

wpa_s->prev_scan_ssid = broadcast_ssid_scan;

wpa_supplicant_req_scan(wpa_s, inte***ce_count, 100000);

來主動發起scan,

呼叫wpa_supplicant_ctrl_iface_init()函式,來初始化控制介面;對於unix socket這種方式,其本地socket檔案是由配置檔案裡的ctrl_inte***ce引數指定的路徑加上網路介面名稱;

2.4. wpa_supplicant_run()函式:

初始化完成之後,讓wpa_supplicant的main event loop run起來。

在wpa_supplicant中,有許多與外界通訊的socket,它們都是需要註冊到eloop event模組中的,具體地說,就是在eloop_sock_table中增加一項記錄,其中包括了sock_fd, handle, eloop_data, user_data。

eloop event模組就是將這些socket組織起來,統一管理,然後在eloop_run中利用select機制來管理socket的通訊。

3. wpa_supplicant 的對外介面分析

對於wpa_supplicant模組的對外介面,主要有以下幾種:

3.1. global control inte***ce: 用於配置(增加或刪除)網路介面。

3.2. ctrl inte***ce: 與其他外部模組互動的控制介面。

例如,在初始化時,android 平台的wifi.c中的 wifi_connect_to_supplicant函式呼叫wpa_ctrl_open函式建立兩個socket,乙個是ctrl inte***ce,另乙個就是monitor inte***ce,monitor inte***ce這個介面用於監測從wpa_supplicant發出的event事件。

這兩個socket建立成功後,monitor inte***ce 會傳送attach到wpa_supplicant模組,wpa_supplicant模組收到後,會將該客戶端的socket資訊記錄下來,用於以後傳送事件時用(由於用的是dgram的方式)。

3.3. socket for ioctl: 傳送命令到kernel space。

3.4. socket (netlink) for interact between kernel and userspace(af_netlink, netlink_route): 接受kernel傳送上來的event。

3.5. socket for l2 packet(pf_packet): 處理802.1x報文。

wpa supplicant驅動移植

移植環境 主機作業系統 ubantu 10.10 目標系統 hi351x 核心 linux 2.6.14 交叉編譯器 arm hismall linux 版本 wpa supplicant 0.7.3 移植wpa supplicant前確保openssl已經移植好了,openssl移植參考前文 op...

Linux系統Wpa supplicant用法小結

wpa supplicant是linux系統下乙個非常強大的無線網絡卡管理程式。google搜尋到的它似乎不支援wpa2和aes,其實不然,參考它的文件可以發現,wpa2只是rsn的別名,而aes也是ccmp的一部分,所以它們的支援完全是沒有問題的。它的文件看起來非常複雜,其實配置非常簡單,下面先給...

wpa supplicant 使用記錄

連線 wifi wpa 配置檔案一般在目錄 etc 也可以根據使用者需要自行建立,如 data user 等目錄下 cmd touch wpa supplicanf.confctrl inte ce var run wpa supplicant 乙個目錄,用於wpa supplicant和wpa c...