標籤:
- wpa_supplicant簡介
wpa_supplicant是用來用來支援無線中各種加密方式的,包括WEP、WPA/WPA2和WAPI(中國特有)、EAP(8021x)。wpa_s通過socket與上層(framework)和底層(driver)通訊,向上接收命令和傳遞目前狀態,向下發送命令到驅動並接收驅動上傳的各種event,嚴格來講wap_s和driver中還有一層cfg80211,cfg80211可以理解為linux定義的80211管理控制層的架構,例如掃描、串連這些通用的過程,各個廠商按照cfg80211提供的架構編寫各自的驅動,實現具體的幀發送與接收。wpa_s是如何處理各個socket中資料的請看 eloop sun章節。
是網頁(http://zwz94.blog.163.com/blog/static/3206039520120149580531/)上的一張圖片,可以清晰的看到wpa_s早整個wifi架構中的位置
- wpa_supplicant的啟動
在Android手機中,wpa_supplicant的啟動是由framework控制的,frameowork設定property來啟動寫在init rc檔案的中service, 同時會產生兩條socket,一條向wpa_s發送命令,一條接收wpa_s上傳的event
service p2p_supplicant /system/bin/wpa_supplicant \ -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ -I/system/etc/wifi/p2p_supplicant_overlay.conf -N \ -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ -I/system/etc/wifi/wpa_supplicant_overlay.conf \ -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 -dd \ -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot
其中 socket wpa_wlan0 dgram 660 wifi wifi建立了一個socket,wpa_s使用該socket接收framework的命令和向上傳遞event。framework同樣會調用串連該socket,後面會講到
- wpa_supplicant啟動參數
wpa_s允許傳入很多參數, 參數區分大小寫
參數一共有3中類型,
有 –BdhKLqstuvW
-h:協助檔案
-L:輸出license
-q:提升wpa_s調試層級(輸出log減少),與-d相反
-v:輸出wpa_s版本號碼
-W:等到control interface monitor再運行
-N:當需要設定兩個network interface時,需要在兩個網口參數中間插入 –N, 例如 一個網口為p2p0,需要插入-N後,再新添加另一個wlan0
- 3.2 帶後續內容的,控制wpa_s運行參數的,也可以叫全域參數
結構體 wpa_params在調用 wpa_supplicant_init() 初始化wpa_s使用
struct wpa_params { //-B:當做守護進程運行在後台 int daemonize; //-W:等到control interface monitor再運行 int wait_for_monitor; //-P: pid_file - Path to a PID (process ID) file char *pid_file; //-d:輸出log的層級,-d為預設層級,-dd層級降低一級(輸出log會增加一級),依次類推,設定代碼為params.wpa_debug_level int wpa_debug_level; //-K:在log中列印key int wpa_debug_show_keys; //-t:調試資訊中增加時間戳記 int wpa_debug_timestamp; //ctrl_interface - Global ctrl_iface path/parameter //-g:global ctrl_interface(字串為@android+SOCK_NAME, SOCK_NAME是由init.rc) char *ctrl_interface; //ctrl_interface_group - Global ctrl_iface group //-G:global ctrl_interface group char *ctrl_interface_group; //-u:支援dbus控制介面 int dbus_ctrl_interface; //-f:將log輸出到file中 const char *wpa_debug_file_path; //-s:輸出log到 syslog, 預設輸出到stdout int wpa_debug_syslog; //-T:log增加linux trace int wpa_debug_tracing; //-o:設定linux網口的目錄 char *override_driver; //-O:設定wpa_s控制sockets的目錄 char *override_ctrl_interface; //-e:entropy_file - Optional entropy file char *entropy_file;};
- 3.3 帶後續內容的,與interface相關的,也可叫介面 參數
存放到結構體 struct wpa_interface 中,運行wpa_supplicant_add_iface()需要傳入該結構體
struct wpa_interface { //-c:conf設定檔,裡面定義了一些參數和一些network節點,一般為wpa_supplicant.conf const char *confname; //-I:conf設定檔的補充選項,一般為wpa_supplicant_overlay.conf/ const char *confanother; //-m:p2p網口的設定檔 const char *conf_p2p_dev; //-C:控制連接埠socket的參數 //功能等同conf 檔案 const char *ctrl_interface; //-D:driver的類型,可以設定多個,例如 nl80211,wext const char *driver; //driver_param - Driver interface parameters const char *driver_param; //-i:linux的網口,可以定義多個,例如wlan0 const char *ifname; //-b:橋接的interface const char *bridge_ifname; //p2p_mgmt - Interface used for P2P management (P2P Device operations) int p2p_mgmt;};
- wpa_s全域初始化
主要包括 EAP各種方法的註冊,eloop(wpa_s啟動並執行主體)參數,與framework通訊socket的初始化
struct wpa_global * wpa_supplicant_init(struct wpa_params *params){ //全域資訊,params中的內容都會拷貝到該結構體中 struct wpa_global *global; //初始化eap方法,每種eap方式都有對應的方法 ret = eap_register_methods(); //將params中的資訊複製到global中 global = os_zalloc(sizeof(*global)); //初始化 struct eloop_data,該結構體是個全域變數 if (eloop_init()) random_init(params->entropy_file); //串連與FWKS通訊socket(init.rc中定義的),並註冊接收cmd的函數 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global); { //初始化控制socket wpas_global_ctrl_iface_open_sock(global, priv) < 0) { //擷取-g傳進來的socket名稱,與init.rc中相對應 os_strncmp(ctrl, "@android:", 9) == 0) { priv->sock = android_get_control_socket(ctrl + 9); //註冊接收socket資料的函數wpa_supplicant_global_ctrl_iface_process,分發處理傳入的命令 eloop_register_read_sock(priv->sock, wpa_supplicant_global_ctrl_iface_receive, global, priv); //註冊發送event到FWKS的函數wpa_supplicant_ctrl_iface_send wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb); } } return global;}
是簡易的全域初始化過程
下一篇為 wpa_supplcant 啟動之–linux 網路介面參數初始化
Android wpa_supplcant 啟動之--全域初始化