wpa-supplicant軟件架構(gòu)分析_第1頁
wpa-supplicant軟件架構(gòu)分析_第2頁
wpa-supplicant軟件架構(gòu)分析_第3頁
wpa-supplicant軟件架構(gòu)分析_第4頁
wpa-supplicant軟件架構(gòu)分析_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1.啟動命令wpasupplicant在啟動時,啟動命令可以帶有很多參數(shù),目前我們的啟動命令如下:wpa_supplicant/system/bin/wpa_supplicant-Dwext-ieth0-c/data/wifi/wpa_supplicant.conf-f/data/wifi/wpa_log.txtwpa_supplicant對于啟動命令帶的參數(shù),用了兩個數(shù)據(jù)結(jié)構(gòu)來保存,一個是wpa_params,另一個是wpa_interface.這主要是考慮到wpa_supplicant是可以同時支持多個網(wǎng)絡(luò)接口的。wpa_params數(shù)據(jù)結(jié)構(gòu)主要記錄與網(wǎng)絡(luò)接口無關(guān)的一些參數(shù)設(shè)置。而每一個網(wǎng)絡(luò)接口就用一個wpa_interface數(shù)據(jù)結(jié)構(gòu)來記錄。在啟動命令行中,可以用-N來指定將要描述一個新的網(wǎng)絡(luò)接口,對于一個新的網(wǎng)絡(luò)接口,可以用下面六個參數(shù)描述:-i<ifname>:網(wǎng)絡(luò)接口名稱-c<conf>:配置文件名稱-C<ctrl_intf>:控制接口名稱-D<driver>:驅(qū)動類型-p<driver_param>:驅(qū)動參數(shù)-b<br_ifname>:橋接口名稱2.wpa_supplicant初始化流程2.1.main()函數(shù):在這個函數(shù)中,主要做了四件事。a.解析命令行傳進(jìn)的參數(shù)。b.調(diào)用wpa_supplicant_init()函數(shù),做wpa_supplicant的初始化工作。c.調(diào)用wpa_supplicant_add_iface()函數(shù),增加網(wǎng)絡(luò)接口。d.調(diào)用wpa_supplicant_run()函數(shù),讓wpa_supplicant真正的run起來。2.2.wpa_supplicant_init()函數(shù):a.打開debug文件。b.注冊EAPpeer方法。c.申請wpa_global內(nèi)存,該數(shù)據(jù)結(jié)構(gòu)作為統(tǒng)領(lǐng)其他數(shù)據(jù)結(jié)構(gòu)的一個核心,主要包括四個部分:wpa_supplicant*ifaces/*每個網(wǎng)絡(luò)接口都有一個對應(yīng)的wpa_supplicant數(shù)據(jù)結(jié)構(gòu),該指針指向最近加入的一個,在wpa_supplicant數(shù)據(jù)結(jié)構(gòu)中有指針指向next*/wpa_paramsparams/*啟動命令行中帶的通用的參數(shù)*/ctrl_iface_global_priv*ctrl_iface/*global的控制接口*/ctrl_iface_dbus_priv*dbus_ctrl_iface/*dbus的控制接口*/d.設(shè)置wpa_global中的wpa_params中的參數(shù)。e.調(diào)用eloop_init函數(shù)將全局變量eloop中的user_data指針指向wpa_global。f.調(diào)用wpa_supplicant_global_ctrl_iface_init函數(shù)初始化global控制接口。g.調(diào)用wpa_supplicant_dbus_ctrl_iface_init函數(shù)初始化dbus控制接口。h.將該daemon的pid寫入pid_file中。2.3.wpa_supplicant_add_iface()函數(shù):該函數(shù)根據(jù)啟動命令行中帶有的參數(shù)增加網(wǎng)絡(luò)接口,有幾個就增加幾個。a.因?yàn)閣pa_supplicant是與網(wǎng)絡(luò)接口對應(yīng)的重要的數(shù)據(jù)結(jié)構(gòu),所以,首先分配一個wpa_supplicant數(shù)據(jù)結(jié)構(gòu)的內(nèi)存。b.調(diào)用wpa_supplicant_init_iface()函數(shù)來做網(wǎng)絡(luò)接口的初始工作,主要包括:設(shè)置驅(qū)動類型,默認(rèn)是wext;讀取配置文件,并將其中的信息設(shè)置到wpa_supplicant數(shù)據(jù)結(jié)構(gòu)中的conf指針指向的數(shù)據(jù)結(jié)構(gòu),它是一個wpa_config類型;命令行設(shè)置的控制接口ctrl_interface和驅(qū)動參數(shù)driver_param覆蓋配置文件里設(shè)置,命令行中的優(yōu)先;拷貝網(wǎng)絡(luò)接口名稱和橋接口名稱到wpa_config數(shù)據(jù)結(jié)構(gòu);對于網(wǎng)絡(luò)配置塊有兩個鏈表描述它,一個是config->ssid,它按照配置文件中的順序依次掛載在這個鏈表上,還有一個是pssid,它是一個二級指針,指向一個指針數(shù)組,該指針數(shù)組按照優(yōu)先級從高到底的順序依次保存wpa_ssid指針,相同優(yōu)先級的在同一鏈表中掛載。c.調(diào)用wpa_supplicant_init_iface2()函數(shù),主要包括:調(diào)用wpa_supplicant_init_eapol()函數(shù)來初始化eapol;調(diào)用相應(yīng)類型的driver的init()函數(shù);設(shè)置driver的param參數(shù);調(diào)用wpa_drv_get_ifname()函數(shù)獲得網(wǎng)絡(luò)接口的名稱,對于wext類型的driver,沒有這個接口函數(shù);調(diào)用wpa_supplicant_init_wpa()函數(shù)來初始化wpa,并做相應(yīng)的初始化工作;調(diào)用wpa_supplicant_driver_init()函數(shù),來初始化driver接口參數(shù);在該函數(shù)的最后,會wpa_s->prev_scan_ssid=BROADCAST_SSID_SCAN;wpa_supplicant_req_scan(wpa_s,interface_count,100000);來主動發(fā)起scan,調(diào)用wpa_supplicant_ctrl_iface_init()函數(shù),來初始化控制接口;對于UNIXSOCKET這種方式,其本地socket文件是由配置文件里的ctrl_interface參數(shù)指定的路徑加上網(wǎng)絡(luò)接口名稱;2.4.wpa_supplicant_run()函數(shù):初始化完成之后,讓wpa_supplicant的maineventlooprun起來。在wpa_supplicant中,有許多與外界通信的socket,它們都是需要注冊到eloopevent模塊中的,具體地說,就是在eloop_sock_table中增加一項(xiàng)記錄,其中包括了sock_fd,handle,eloop_data,user_data。eloopevent模塊就是將這些socket組織起來,統(tǒng)一管理,然后在eloop_run中利用select機(jī)制來管理socket的通信。3.Wpa_supplicant提供的接口從通信層次上劃分,wpa_supplicant提供向上的控制接口controlinterface,用于與其他模塊(如UI)進(jìn)行通信,其他模塊可以通過controlinterface來獲取信息或下發(fā)命令。Wpa_supplicant通過socket通信機(jī)制實(shí)現(xiàn)下行接口,與內(nèi)核進(jìn)行通信,獲取信息或下發(fā)命令。3.1上行接口Wpa_supplicant提供兩種方式的上行接口。一種基于傳統(tǒng)dbus機(jī)制實(shí)現(xiàn)與其他進(jìn)程間的IPC通信;另一種通過Unixdomainsocket機(jī)制實(shí)現(xiàn)進(jìn)程間的IPC通信。3.1.1Dbus接口該接口主要在文件“ctrl_iface_dbus.h”,“ctrl_iface_dbus.c”,“ctrl_iface_dbus_handler.h”和“ctrl_iface_dbus_handler.c”中實(shí)現(xiàn),提供一些基本的控制方法。DBusMessage*wpas_dbus_new_invalid_iface_error(DBusMessage*message);DBusMessage*wpas_dbus_global_add_interface(DBusMessage*message,structwpa_global*global);DBusMessage*wpas_dbus_global_remove_interface(DBusMessage*message,structwpa_global*global);DBusMessage*wpas_dbus_global_get_interface(DBusMessage*message,structwpa_global*global);DBusMessage*wpas_dbus_global_set_debugparams(DBusMessage*message,structwpa_global*global);DBusMessage*wpas_dbus_iface_scan(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_scan_results(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_bssid_properties(DBusMessage*message,structwpa_supplicant*wpa_s,structwpa_scan_res*res);DBusMessage*wpas_dbus_iface_capabilities(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_add_network(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_remove_network(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_set_network(DBusMessage*message,structwpa_supplicant*wpa_s,structwpa_ssid*ssid);DBusMessage*wpas_dbus_iface_enable_network(DBusMessage*message,structwpa_supplicant*wpa_s,structwpa_ssid*ssid);DBusMessage*wpas_dbus_iface_disable_network(DBusMessage*message,structwpa_supplicant*wpa_s,structwpa_ssid*ssid);DBusMessage*wpas_dbus_iface_select_network(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_disconnect(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_set_ap_scan(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_set_smartcard_modules(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_get_state(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_get_scanning(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_set_blobs(DBusMessage*message,structwpa_supplicant*wpa_s);DBusMessage*wpas_dbus_iface_remove_blobs(DBusMessage*message,structwpa_supplicant*wpa_s);3.1.2Unixdomainsocket接口該接口主要在文件“wpa_ctrl.h”,“wpa_ctrl.c”,“ctrl_iface_unix.c”,“ctrl_iface.h”和“ctrl_iface.c”實(shí)現(xiàn)。(1)“wpa_ctrl.h”,“wpa_ctrl.c”完成對controlinterface的封裝,對外提供統(tǒng)一的接口。其主要的工作是通過Unixdomainsocket建立一個controlinterface的client結(jié)點(diǎn),與作為server的wpa_supplicant結(jié)點(diǎn)通信。主要功能函數(shù):structwpa_ctrl*wpa_ctrl_open(constchar*ctrl_path);/*建立并初始化一個Unixdomainsocket的client結(jié)點(diǎn),并與作為server的wpa_supplicant結(jié)點(diǎn)綁定*/

voidwpa_ctrl_close(structwpa_ctrl*ctrl);/*撤銷并銷毀已建立的Unixdomainsocket的client結(jié)點(diǎn)*/intwpa_ctrl_request(structwpa_ctrl*ctrl,constchar*cmd,size_tcmd_len,char*reply,size_t*reply_len,void(*msg_cb)(char*msg,size_tlen));/*用戶模塊直接調(diào)用該函數(shù)對wpa_supplicant發(fā)送命令并獲取所需信息*可以發(fā)送的命令如附件1所示*/Note:Wpa_supplicant提供兩種由外部模塊獲取信息的方式:一種是外部模塊通過發(fā)送request命令然后獲取response的問答模式,另一種是wpa_supplicant主動向外部發(fā)送event事件,由外部模塊監(jiān)聽接收。一般的常用做法是外部模塊通過調(diào)用wpa_ctrl_open()兩次,建立兩個controlinterface接口,一個為ctrlinterface,用于發(fā)送命令,獲取信息,另一個為monitorinterface,用于監(jiān)聽接收來自于wpa_supplicant的event時間。此舉可以降低通信的耦合性,避免response和event的相互干擾。intwpa_ctrl_attach(structwpa_ctrl*ctrl);/*注冊某個controlinterface作為monitorinterface*/intwpa_ctrl_detach(structwpa_ctrl*ctrl);/*撤銷某個monitorinterface為普通的controlinterface*/intwpa_ctrl_pending(structwpa_ctrl*ctrl);/*判斷是否有掛起的event事件*/intwpa_ctrl_recv(structwpa_ctrl*ctrl,char*reply,size_t*reply_len);/*獲取掛起的event事件*/(2)“ctrl_iface_unix.c”實(shí)現(xiàn)wpa_supplicant的Unixdomainsocket通信機(jī)制中server結(jié)點(diǎn),完成對client結(jié)點(diǎn)的響應(yīng)。其中最主要的兩個函數(shù)為:staticvoidwpa_supplicant_ctrl_iface_receive(intsock,void*eloop_ctx,void*sock_ctx)/*接收并解析client發(fā)送request命令,然后根據(jù)不同的命令調(diào)用底層不同的處理函數(shù);*然后將獲得response結(jié)果回饋到client結(jié)點(diǎn)。*/staticvoidwpa_supplicant_ctrl_iface_send(structctrl_iface_priv*priv,intlevel,constchar*buf,size_tlen)/*向注冊的monitorinterfaces主動發(fā)送event事件*/(3)“ctrl_iface.h”和“ctrl_iface.c”主要實(shí)現(xiàn)了各種request命令的底層處理函數(shù)。3.2下行接口Wpa_supplicant提供的下行接口主要用于和kernel(driver)進(jìn)行通信,下發(fā)命令和獲取信息。Wpa_supplicant下行接口主要包括三種重要的接口:1.PF_INETsocket接口,主要用于向kernel發(fā)送ioctl命令,控制并獲取相應(yīng)信息。2.PF_NETLINKsocket接口,主要用于接收kernel發(fā)送上來的event事件。3.PF_PACKETsocket接口,主要用于向driver傳遞802.1X報(bào)文。主要涉及到的文件包括:“driver.h”,“drivers.c”,“driver_wext.h”,“driver_wext.c”,“l(fā)2_packet.h”和“l(fā)2_packet_linux.c”。其中“driver.h”,“drivers.c”,“driver_wext.h”和“driver_wext.c”實(shí)現(xiàn)PF_INETsocket接口和PF_NETLINKsocket接口;“l(fā)2_packet.h”和“l(fā)2_packet_linux.c”實(shí)現(xiàn)PF_PACKETsocket接口。(1)“driver.h”,“drivers.c”主要用于封裝底層差異對外顯示一個相同的wpa_driver_ops接口。Wpa_supplicant可支持atmel,Broadcom,ipw,madwifi,ndis,nl80211,wext等多種驅(qū)動。其中一個最主要的數(shù)據(jù)結(jié)構(gòu)為wpa_driver_ops,其定義了driver相關(guān)的各種操作接口。(2)“driver_wext.h”,“driver_wext.c”實(shí)現(xiàn)了wext形式的wpa_driver_ops,并創(chuàng)建了PF_INETsocket接口和PF_NETLINKsocket接口,然后通過這兩個接口完成與kernel的信息交互。Wext提供的一個主要數(shù)據(jù)結(jié)構(gòu)為:structwpa_driver_wext_data{void*ctx;intevent_sock;intioctl_sock;intmlme_sock;charifname[IFNAMSIZ+1];intifindex;intifindex2;intif_removed;u8*assoc_req_ies;size_tassoc_req_ies_len;u8*assoc_resp_ies;size_tassoc_resp_ies_len;structwpa_driver_capacapa;inthas_capability;intwe_version_compiled;/*forset_auth_algfallback*/intuse_crypt;intauth_alg_fallback;intoperstate;charmlmedev[IFNAMSIZ+1];intscan_complete_events;};其中event_sock為PF_NETLINKsocket接口,ioctl_sock為PF_INETsocket借口。Driver_wext.c實(shí)現(xiàn)了大量底層處理函數(shù)用于實(shí)現(xiàn)wpa_driver_ops操作參數(shù),其中比較重要的有:void*wpa_driver_wext_init(void*ctx,constchar*ifname);/*初始化wpa_driver_wext_data數(shù)據(jù)結(jié)構(gòu),并創(chuàng)建PF_NETLINKsocket和PF_INETsocket接口*/voidwpa_driver_wext_deinit(void*priv);/*銷毀wpa_driver_wext_data數(shù)據(jù)結(jié)構(gòu),PF_NETLINKsocket和PF_INETsocket接口*/staticvoidwpa_driver_wext_event_receive(intsock,void*eloop_ctx,void*sock_ctx);/*處理kernel主動發(fā)送的event事件的callback函數(shù)*/最后,將實(shí)現(xiàn)的操作函數(shù)映射到一個全局的wpa_driver_ops類型數(shù)據(jù)結(jié)構(gòu)wpa_driver_wext_ops中。conststructwpa_driver_opswpa_driver_wext_ops={.name="wext",.desc="Linuxwirelessextensions(generic)",.get_bssid=wpa_driver_wext_get_bssid,.get_ssid=wpa_driver_wext_get_ssid,.set_wpa=wpa_driver_wext_set_wpa,.set_key=wpa_driver_wext_set_key,.set_countermeasures=wpa_driver_wext_set_countermeasures,.set_drop_unencrypted=wpa_driver_wext_set_drop_unencrypted,.scan=wpa_driver_wext_scan,.get_scan_results2=wpa_driver_wext_get_scan_results,.deauthenticate=wpa_driver_wext_deauthenticate,.disassociate=wpa_driver_wext_disassociate,.set_mode=wpa_driver_wext_set_mode,.associate=wpa_driver_wext_associate,.set_auth_alg=wpa_driver_wext_set_auth_alg,.init=wpa_driver_wext_init,.deinit=wpa_driver_wext_deinit,.add_pmkid=wpa_driver_wext_add_pmkid,.remove_pmkid=wpa_driver_wext_remove_pmkid,.flush_pmkid=wpa_driver_wext_flush_pmkid,.get_capa=wpa_driver_wext_get_capa,.set_operstate=wpa_driver_wext_set_operstate,};(3)“l(fā)2_packet.h”和“l(fā)2_packet_linux.c”主要用于實(shí)現(xiàn)PF_PACKETsocket接口,通過該接口,wpa_supplicant可以直接將802.1Xpacket發(fā)送到L2層,而不經(jīng)過TCP/IP協(xié)議棧。其中主要的功能函數(shù)為:structl2_packet_data*l2_packet_init(constchar*ifname,constu8*own_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論