wpa_supplicant編譯:
1. wpa_supplicant/Android.mk :
-- wpa_cli
-- wpa_supplicant
?
-- libwpa_client.so
?
2. hostapd/Android.mk :
-- hostapd_cli
-- hostapd
?
?
?
從通信層次上劃分,wpa_supplicant提供向上的控制接口 control interface,用于與其他模塊(如UI)進行通信,其他模塊可以通過control interface 來獲取信息或下發命令。wpa_supplicant通過socket通信機制實現下行接口,與內核進行通信,獲取信息或下發命令。
上行接口:
wpa_supplicant提供兩種方式的上行接口。一種基于傳統dbus機制實現與其他進程間的IPC通信;另一種通過Unix domain socket機制實現進程間的IPC通信。
(1)???Dbus
(2)???Socket
該接口主要在文件”wpa_ctrl.h”,“wpa_ctrl.c”,“ctrl_iface_unix.c”,“ctrl_iface.h”和“ctrl_iface.c”實現。
?1. “wpa_ctrl.h”,“wpa_ctrl.c”完成對control interface的封裝,對外提供統一的接口。其主要的工作是通過Unix domainsocket建立一個controlinterface 的client結點,與作為server的wpa_supplicant結點通信。
?
wpa_supplicant 提供兩種由外部模塊獲取信息的方式:一種是外部模塊通過發送request 命令然后獲取response的問答模式,另一種是wpa_supplicant主動向外部發送event事件,由外部模塊監聽接收。
一般的常用做法是外部模塊通過調用wpa_ctrl_open()兩次,分別建立兩個control interface接口。一個為ctrl interface,用于發送命令,獲取信息。然后,將另外一個接口作為參數,調用wpa_ctrl_attach,成為 monitor interface,用于監聽接收來自于wpa_supplicant的event事件。此舉可以降低通信的耦合性,避免response和event的相互干擾。
?
?
2. “ctrl_iface_unix.c”實現wpa_supplicant的Unix domain socket通信機制中server結點,完成對client結點的響應。
3. “ctrl_iface.h”和“ctrl_iface.c”主要實現了各種request命令的底層處理函數。
?
?
下行接口:
wpa_supplicant提供的下行接口主要用于和kernel(driver)進行通信,下發命令和獲取信息。
wpa_supplicant下行接口主要包括三種重要的接口:
1.??? PF_INET socket接口,主要用于向kernel 發送ioctl命令,控制并獲取相應信息。
2.??? PF_NETLINK socket接口,主要用于接收kernel發送上來的event 事件。
3.??? PF_PACKET socket接口,主要用于向driver傳遞802.1X報文。
?
(1)“driver.h”,“drivers.c”主要用于封裝底層差異對外顯示一個相同的wpa_driver_ops接口。wpa_supplicant可支持atheros, broadcom, madwifi, ndis,nl80211, wext等多種驅動。
?
(2)“driver_nl80211.c”實現了nl80211形式的wpa_driver_ops,并創建了PF_INET socket接口和PF_NETLINK socket接口,然后通過這兩個接口完成與kernel的信息交互。
wpa_driver_nl80211_event_receive函數
:處理kernel主動發送的event事件的?callback?函數?*/
?
?
(3)“l2_packet.h”和“l2_packet_linux.c”主要用于實現PF_PACKET socket接口,通過該接口,wpa_supplicant可以直接將802.1X packet發送到L2層,而不經過TCP/IP協議棧。
Wpa_wupplicant Main Flow:
Wpa_supplicant Structure Diagram:
