Android wpa_supplcant 啟動之--全域初始化

來源:互聯網
上載者:User

標籤:

  1. 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架構中的位置

  1. 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,後面會講到

  1. wpa_supplicant啟動參數

wpa_s允許傳入很多參數, 參數區分大小寫
參數一共有3中類型,

  • 3.1 不帶後續內容的,

有 –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;};
  1. 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 啟動之--全域初始化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.