wpa_supplicant代碼初探收藏linux
這幾天在嘗試把wpa_supplicant移植到windows ce上,替換微軟的WZC。先把源代碼down下來,瞭解了一下大體的結構。android
wpa_supplicant運行的整個核心就是eloop_run函數。這個函數負責處理應用程序的請求和數據鏈路層發來的EAPOL數據。eloop的針對不一樣的平臺有好幾個實現版本,我這裏只討論針對WIN32的eloop_win.c版本。windows
外部須要經過調用eloop_register_event或者eloop_register_read_sock來註冊一個回調函數,並綁定了一個相應的事件。eloop會等待每個事件的發生,並在事件發生時調用相應的回調函數進行處理。數組
全部與平臺相關的網絡驅動程序接口,都被經過wpa_driver_ops結構抽象成統一的接口,無論你是WEXT或者NDIS。所以也實現了平臺無關性。sass
此外,wpa_supplicant與應用層通訊的方式多種多樣,有pipe、socket,你也能夠實現本身的方式。只須要實現幾個基本的函數就能夠了:網絡
wpa_supplicant_global_ctrl_iface_init數據結構
wpa_supplicant_global_ctrl_iface_deinitapp
wpa_supplicant_ctrl_iface_initless
wpa_supplicant_ctrl_iface_deinitsocket
wpa_supplicant_ctrl_iface_wait
好比我在CE上就把wpa_supplicant做爲一個stream device或者service來運行,上層應用經過文件系統接口來與之進行交互。
初始化過程:
1. 初始化wpa_supplicant,調用下面這個函數:
struct wpa_global *wpa_supplicant_init(struct wpa_params *params)
其中,經過structwpa_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-wpaAP)
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和WPA2CCMP和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和authtimeout
wpa_supplicant_event_disassoc
wpa_blacklist_add
wpa_supplicant_timeout
wpa_blacklist_add
什麼時候會從黑名單中刪除
wpa_supplicant 初始化流程分析
|