wpa_supplicant代碼初探收藏
這幾天在嘗試把wpa_supplicant移植到windows ce上,替換微軟的WZC。先把源代碼down下來,瞭解了一下大致的結構。
wpa_supplicant運行的整個核心就是eloop_run函數。這個函數負責處理應用程序的請求和數據鏈路層發來的EAPOL數據。eloop的針對不同的平臺有好幾個實現版本,我這裏只討論針對WIN32的eloop_win.c版本。
外部需要通過調用eloop_register_event或者eloop_register_read_sock來註冊一個回調函數,並綁定了一個相應的事件。eloop會等待每一個事件的發生,並在事件發生時調用相應的回調函數進行處理。
所有與平臺相關的網絡驅動程序接口,都被通過wpa_driver_ops結構抽象成統一的接口,不管你是WEXT或者NDIS。因此也實現了平臺無關性。
此外,wpa_supplicant與應用層通信的方式多種多樣,有pipe、socket,你也可以實現自己的方式。只需要實現幾個基本的函數就可以了:
wpa_supplicant_global_ctrl_iface_init
wpa_supplicant_global_ctrl_iface_deinit
wpa_supplicant_ctrl_iface_init
wpa_supplicant_ctrl_iface_deinit
wpa_supplicant_ctrl_iface_wait
比如我在CE上就把wpa_supplicant作爲一個stream device或者service來運行,上層應用通過文件系統接口來與之進行交互。
初始化過程:
1. 初始化wpa_supplicant,調用下面這個函數:
struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
其中,通過struct wpa_params中的參數可以進行相關配置。
2. 通過調用wpa_supplicant_add_iface來將ctrl interface和driver綁定起來。
3. 執行wpa_supplicant_run。
本來以爲這個東西只有在Atheros的平臺上用的,突然發現Ralink的平臺也可以用,甚至還看到還有老美把這個東西往android上移植。看來是個好東西,學習一下。
官方的模塊框圖
一般來說很多模塊可以根據需要選用的
EAP methods EAP state machine
如果你不需要支持wpa-enterprise那麼這兩個模塊都不需要編譯。
wpa_cli和GUI
這兩個可以不要,直接寫個控制腳本,把用戶的參數變爲配置文件,重啓wpa_supplicant
driver event
driver event 無線驅動和本程序通訊的接口,一般高級的無線驅動都支持WEXT。就是驅動裏面通過wireless_send_event把一些狀態信息發到本程序處理。
driver i/f
一些ioctl接口,同樣用於無線驅動和本程序之間傳遞信息。
EAPOL state machine
負責處理PTK 4-way HS和GTK 2-way HS
l2_package
EAPOL和pre auth都要通過這個接口收發包。
configuration
負責處理用戶配置文件的模塊
大致流程(For WPAPSK):程序是哪些?
1 讀取配置文件
2 初始化配置參數,驅動函數wrapper
3 讓驅動scan當前所有bssid(包括wpa AP和non-wpa
AP)
4 檢查掃描的參數是否和用戶設置的相符
5 如果相符,設置associate request ie
通知驅動進行auth assoc步驟
4 Four-way handshake for PTK
5 Two-way handshake for GTK
6 接收AP發出的指令,定期更換GTK
這個程序和madwifi通信主要通過wirelessEXT,其實就是netlink,在madwifi驅動中會調用wireless_event_send這個函數把相關的東西發到wpa_supplicant
WPAPSK配置文件的寫法
一般這樣寫可以兼容WPA和WPA2 CCMP和TKIP
network={
ssid="myssid "
key_mgmt=WPA-PSK
proto=WPA RSN
pairwise=TKIP CCMP
psk="myasciipsk"
}
編譯方法:
Makefile需要讀取一個.config文件,這個文件裏面包含交叉編譯路徑設置,模塊配置選項。
參考配置文件For wpapsk madwifi
#*******************************************************
CROSS_COMPILE=/opt/mips-linux-
CC=${CROSS_COMPILE}gcc
CONFIG_DRIVER_MADWIFI=y
CFLAGS += -I../src/802_11/madwifi/madwifi
CONFIG_DRIVER_WIRED=y
CONFIG_IEEE8021X_EAPOL=y
CONFIG_BACKEND=file
#*******************************************************
啓動方法(Atheros Driver):
#創建無線interface模式設置爲managed
wlaconfig ath create wlandev wifi0 wlanmode sta
#設置ath0到自動模式,這樣scan的時候會掃所有的頻道2.4g 5g 11nagb。
iwpriv ath0 mode auto
#設置好配置文件,啓動wpa_supplicant
wpa_supplicant –i ath0 –b br0 –c /tmp/supplicant.conf -B
主要參數含義:
ath0是無線interface,通過這個參數,函數就可以通過iotcl調用無線驅動中的接口。
br0 是bridge interface,EAPOL L2 package都通過這個接口收發。
-c 表示配置文件
-B daemonlise
源碼關鍵函數
wpa_supplicant_add_iface
wpa_supplicant_init_iface
wpa_supplicant_set_driver
wpa_config_read
wpa_supplicant_init_iface2
wpa_supplicant_init_eapol
wpa_drv_init
wpa_drv_set_param
wpa_supplicant_init_wpa
wpa_supplicant_driver_init
wpa_supplicant_req_scan // trigger scan state
wpa_supplicant_scan
wpa_supplicant_set_suites
wpa_sm_set_assoc_wpa_ie_default //add wpa rsn ie in associate req
有時候AP會被加到blackList中,主要原因可以參考下面的代碼。主要是收到deauth這個event和auth
timeout
wpa_supplicant_event_disassoc
wpa_blacklist_add
wpa_supplicant_timeout
wpa_blacklist_add
何時會從黑名單中刪除
wpa_supplicant 初始化流程分析
|